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

Другие вопросы по тегам