Согласен, было бы неплохо иметь возможность сделать это, но это запрещено на этом языке. SystemVerilog LRM (IEEE 1800-2009) объясняет это в Разделе 23.7.
Иерархическое имя и член выбора в долю структуры, союз, класса или объект covergroup той же синтаксической формы последовательности компонентов имен, разделенных точками. Такие имена называются точечными именами до определения того, является ли имя иерархическим именем или членом. Отличительный аспект иерархического имени заключается в том, что первый компонент имени должен совпадать с именем области, в то время как первый компонент имени участника должен соответствовать имени переменной. Используемый общий подход заключается в попытке выполнить немедленно разрешить компонент первого имени и использовать результаты этого разрешения, чтобы определить , как обрабатывать общее имя.
Поскольку у вас есть struct_t'(foo)
, а не имя переменной, не лечить .a
в качестве члена выбрать.
Аналогично, вы НЕ МОЖЕТЕ получить доступ к члену класса или структуры, который возвращается из вызова функции, как вы могли, на C++.
function struct_t getStruct();
// do something
endfunction
logic a;
a = getStruct().a; // <= Not allowed
Рад видеть, что я не единственный человек, который считает это досадным! Я почти точно задал тот же вопрос в comp.lang.verilog (даже используя слово ** уродливый **!) - см. [Доступ к члену структуры после трансляции] (http://www.edaboard.co.uk/accessing -a-структура-член-после-а-литой t519016.html). – Chiggs
Похоже, что этот вопрос все еще обсуждается комитетом по стандартам: http://www.eda.org/svdb/view.php?id=2735 – nguthrie