Ошибка SystemVerilog с вставкой очереди с другой очередью в качестве аргумента

У меня есть несколько очередей, объявленных так:

static bit [127:0]   same_addr_mem_model [int][$]; 
static bit [127:0]   temp_addr_mem_model [int][$];

Затем позже в строке кода:

same_addr_mem_model[write_addr].insert(0,temp_addr_mem_model[write_addr]); // write_addr is some int

И эта строка дает мне ошибку компилятора с Cadence IES:

Ошибка проверки типа оператора присваивания (ожидается, что тип данных совместим с «упакованным массивом», но вместо этого найдена «очередь упакованного массива [127:0] бит»).

Но, поскольку я нашел документацию в Интернете, похоже, что очередь является вполне допустимым аргументом в пользу insert(). Есть идеи, что здесь не так? Кстати, этот код компилируется и работает с Synopsys VCS.


person Rich    schedule 20.05.2013    source источник
comment
Можете ли вы дать ссылку на упомянутую онлайн-документацию?   -  person dwikle    schedule 20.05.2013
comment
Может быть, документация - неправильное слово... это статья. asicguru.com/system-verilog/tutorial/sv-arrays/4   -  person Rich    schedule 20.05.2013


Ответы (1)


Прототип функции для insert:

function void insert(input int index, input element_t item);

Поэтому, если вы создаете очередь из ints, вы не можете добавить очередь из ints с помощью insert.

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

Функции в SystemVerilog не могут быть перегружены по типу аргумента, поэтому не было бы способа реализовать две функции insert, одна из которых принимает тип элемента, а другая принимает очередь элементов.

Вы должны быть в состоянии получить эквивалентное поведение, используя синтаксис присваивания.

same_addr_mem_model[write_addr] = {temp_addr_mem_model[write_addr], same_addr_mem_model[write_addr]});

См. раздел 7.10.4 спецификации SystemVerilog 2012 года.

person dwikle    schedule 20.05.2013
comment
Хорошо, это интересно знать. Что касается рассматриваемой проблемы, я логически предполагаю, что код пытается вставить содержимое temp_addr_mem_model[write_addr] в same_addr_mem_model[write_addr] в начале очереди. Есть ли метод, который может это сделать, или мне нужно делать это по одному? - person Rich; 20.05.2013
comment
Я сделал такое же предположение о вашем примере кода. Мой ответ показывает, как сделать то же самое с заданием, например. q1 = {q1, q2}. - person dwikle; 20.05.2013