2012-05-31 2 views
1

Я хотел бы передать вектор в структуру и извлечь элемент в том же самом выражении. Это возможно? В противном случае мне пришлось бы назначить временную переменную, которая является уродливой.Кастинг в System Verilog struct и ссылочный элемент

Например:

typedef struct packed { logic a; logic b } struct_t; 
struct_t my_struct; 

logic [1:0] foo; 
assign bar = struct_t'(foo).a; 

^^^^^ Это, по-видимому, не допускается! Зачем ?

+0

Рад видеть, что я не единственный человек, который считает это досадным! Я почти точно задал тот же вопрос в comp.lang.verilog (даже используя слово ** уродливый **!) - см. [Доступ к члену структуры после трансляции] (http://www.edaboard.co.uk/accessing -a-структура-член-после-а-литой t519016.html). – Chiggs

+1

Похоже, что этот вопрос все еще обсуждается комитетом по стандартам: http://www.eda.org/svdb/view.php?id=2735 – nguthrie

ответ

2

Согласно спецификации, это не похоже на действительный синтаксис. Я уверен, что доступ к члену разрешен только для идентификаторов, а не для произвольного выражения.

+0

Ну, ИМО это было бы очень полезно. Например, в интересующем вас случае я определяю, что упакованная структура - это средство определения полей значения в (доступном программном) регистре. Таким образом, сами регистры представляют собой только 64-разрядные векторы, но полезно использовать функции вектора и определения структуры для каждого регистра. Но это не допускается! – ThePopMachine

+0

Так что это, по-видимому, недосмотр. @ Adam12, вы говорите, что доступ к члену не допускается при произвольных выражениях. Ну, я утверждаю, что это не произвольное выражение. Это тип. – ThePopMachine

3

Согласен, было бы неплохо иметь возможность сделать это, но это запрещено на этом языке. 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 
+0

@ dwinkle: Да, хороший ответ. Ну, ИМО, они должны обязательно добавить это как усовершенствование. Я собирался оправдать это, сказав, что мой пример четко определен из локального контекста, как просто еще один способ сказать foo [1]. Но это заставляет меня понять, что «.a - это просто другой способ сказать [1], не оправдывает ничего, поскольку« (x + y) [1] »или даже просто« (foo) [1] »не допускаются – ThePopMachine

+0

@dwinkle: .... Я по-прежнему утверждаю, что приведение типа отличается от произвольного выражения. Но если бы я мог, доступ к члену и выбор части были бы действительны и для произвольных выражений. Возможно, я ошибаюсь, но первая мысль, такая вещь действительна в C, C++, Python и Perl и т. д. – ThePopMachine

 Смежные вопросы

  • Нет связанных вопросов^_^