Цитата(RobFPGA @ Jul 11 2018, 18:16)

Enum в пределах одного compilation unit имеет глобальный scope то есть внутри одного модуля/package не может быть определено несколько елементов разных enum с оним и тем же именем. В разных модулях/package - на здоровье.
Да, вот это любопытный момент. Вроде бы struct вводит свою собственную scope, и казалось бы проблем быть не должно - все имена разделены своими областями видимости. Но в случае структур есть исключение: внутри структуры нельзя определить тип. Поэтому когда внутри структуры объявляется перечисление:
Код
struct
{
enum int { SLON, MAMONT, ... } slon;
}
s1;
то тут возникает анонимный тип перечисления, который не может быть определён внутри структуры, поэтому этот тип неявно "мапится" на объемлющую область видимости. Теперь если в этой области видимости объявить другую структуру:
Код
struct
{
enum int { SLON, MAMONT, ... } slon;
}
s2;
то тут история повторяется - опять возникает анонимный тип, который выносится в объемлющую область видимости, а там уже есть точно такой же тип, тоже анонимный, но это означает, что просто у этих типов нет явных имён, но сами типы существуют и имеют одинаковые сигнатуры. И вот тут-то и возникает коллизия.
Проблема, в общем, имхо, в недоделанности структур в SystemVerilog. Непонятно, почему было просто не расширить scope структур и на определения типов тоже. Это было бы логично и ничему не мешает.
«Отыщи всему начало, и ты многое поймёшь» К. Прутков