Что такое выражение двоеточия (:) в шаблоне назначения структуры verilog? - PullRequest
0 голосов
/ 19 февраля 2020

Например,

typedef struct packed {
  logic foo_1;
  logic foo_2;
} my_type

my_type foo_out;

assign foo_out = ‘{
  foo_1 : sig_1,
  foo_2 : sig_2
};

Это выглядит так же, как и

assign foo_out = {sig_1, sig_2};

Я не могу найти ни одного шаблона назначения структуры, используя двоеточие (:) в LRM. Кто-нибудь, пожалуйста, оставьте комментарий, где этот вид выражения описан.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Это выражение SystemVerilog, которое не является частью простого Verilog, поэтому вы не найдете его, если будете искать в Verilog LRM.

Из SystemVerilog LRM:

Иногда бывает полезно установить значение для элементов структуры без необходимости отслеживать, сколько элементов существует, или каковы их имена. Это можно сделать с помощью ключевого слова по умолчанию:

initial s1 = {default:2}; // sets x and y to 2

Синтаксис {member: value} или {data_type: default_value} также можно использовать:

ab abkey[1:0] = {{a:1, b:1.0}, {int:2, shortreal:2.0}};
0 голосов
/ 19 февраля 2020

Последнее написанное вами утверждение не является шаблоном назначения; это конкатенация. Если sig_1 и sig_2 не являются однобитовыми переменными, у вас есть проблема. ' перед {} имеет решающее значение.

Раздел 10.9.2 Шаблоны структурных назначений IEEE 1800-2017 LRM объясняет, что

assign foo_out = '{sig_1, sig_2};

является позиционным шаблон назначения элемента структуры, в котором первый аргумент присваивается первому элементу, второй аргумент присваивается второму элементу и т. д. Каждый аргумент тоже усекается или дополняется, чтобы соответствовать каждому элементу.

Другая форма с : сопоставляется по имени, а не по позиции.

assign foo_out = '{foo_2:sig_2, foo_1:sig_1};
...