Ошибка 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.
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 года.