System verilog 翻转后Questa中出现意外的不存在关联数组警告

System verilog 翻转后Questa中出现意外的不存在关联数组警告,system-verilog,questasim,System Verilog,Questasim,通常在关联数组中,滚动问题由工具处理。但在QuestaSIM中,我面临的问题是,如果关联数组的键是64位变量,则溢出后,它无法正确存储数据 假设索引是65'h1_0000_0000_0000_0002,那么理想情况下,它应该使用索引64'h2存储此数据,因为键的大小(即使它这样做,因为我也打印了整个关联数组和exists方法的输出),但我仍然收到不存在关联数组的警告(如输出中所示) 代码如下:(我尝试了有界_地址方法,使用了3种不同的逻辑,但在所有情况下都得到了相同的结果) typedef结构打

通常在关联数组中,滚动问题由工具处理。但在QuestaSIM中,我面临的问题是,如果关联数组的键是64位变量,则溢出后,它无法正确存储数据

假设索引是
65'h1_0000_0000_0000_0002
,那么理想情况下,它应该使用索引
64'h2
存储此数据,因为键的大小(即使它这样做,因为我也打印了整个关联数组和exists方法的输出),但我仍然收到不存在关联数组的警告(如输出中所示)

代码如下:(我尝试了有界_地址方法,使用了3种不同的逻辑,但在所有情况下都得到了相同的结果)

typedef结构打包{
位[7:0]数据;
位有效;
}德沃德记忆;
程序p;
dword_memory_st memory[位[63:0];
位[63:0]st=64'hffff\u ffff\u fffa;
位[63:0]温度;

位[64:0]max_memory_address=(1我找到了答案。这是一个QuestaSIM错误,但此解决方案可以操纵工具正确存储数据,而无需任何警告

以下是代码,更改有界地址方法:

function bit[63:0] bounded_address(input  bit [64:0] addr);
  MEMORY.delete(addr); // Dont know why, but after overflow, if we delete that index, than it works.
  bounded_address = (addr % max_memory_address);
  $display("KARAN bounded_address - %0h, addr - %0h, max_memory_address - %0h", bounded_address, addr, max_memory_address);
endfunction : bounded_address

看起来像是QuestaSim中的一个bug。不管怎样,越界位都应该被截断。显式范围可能会有所帮助。请尝试在有界地址函数中将
return addr;
更改为
return addr[63:0];
。@Greg:在执行addr[63:0]之后,结果仍然是一样的。我也打印了关联数组,所以在存储数据时,它的行为似乎正常,但在使用同一个临时变量读取$display时,它无法找到该索引。@Greg:我找到了一个解决方案,并公布了答案,但我不知道是否需要使用delete方法,所以应该是这样如果您能帮助我理解这一点,我将不胜感激。当使用关联数组声明稀疏内存时,您应该为其指定一个默认值
dword_memory_st memory[bit[63:0]='{default:0}
@dave_59:谢谢。默认值应该用在关联数组中。你能帮我理解答案中的.delete方法的需要吗?这看起来像是一个Questa错误,但只有当地址范围是64:0时,其他任何范围都有效。不知道为什么先删除元素有效,但使用“{Default:0}”初始化也可以工作,并且无论如何都是首选的编码样式。@dave_59:我已经观察到,对于64位索引,在滚动后,questa甚至不允许覆盖以前存在的地址(如前面示例中的任何其他地址上的64“hffff_ffff_fffe)。所以,如果我们删除它们并再次分配它们,则不会发生覆盖问题。
function bit[63:0] bounded_address(input  bit [64:0] addr);
  MEMORY.delete(addr); // Dont know why, but after overflow, if we delete that index, than it works.
  bounded_address = (addr % max_memory_address);
  $display("KARAN bounded_address - %0h, addr - %0h, max_memory_address - %0h", bounded_address, addr, max_memory_address);
endfunction : bounded_address