我有一些队列声明如下:
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编译和运行。
答案 0 :(得分:3)
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]});
参见2012 SystemVerilog规范的第7.10.4节。