梳状与顺序中的关联数组元素访问

时间:2014-08-20 01:21:01

标签: associative-array system-verilog

我试图编写一个使用关联数组的测试平台代码,并且看到在一种情况下访问其值不是作为梳状逻辑工作,但是当在顺序块内移动时它工作正常。

示例代码:

这里“值”总是被指定为“x”,但是一旦我将它移到@posedge块中,我就看到它被分配了正确的值(1个“虚拟”被分配了)。

有人可以解释为什么会这样吗?

logic dummy[logic[3:0]];
logic value;
always @ (posedge clk)
begin
  if (reset == 1'b1) begin
    count <= 0;
  end else if ( enable == 1'b1) begin
    count <= count + 1;
  end 

  if(enable) begin
    if(!dummy.exists(count))
    begin
      dummy[count] = 1;
      $display (" Setting for count = %d ", count);
    end 
  end 
end

always_comb begin
  if(dummy.exists(count)) begin
    value = dummy[count];
    $display("Value = %d",value);
  end else begin                   // [Update : 1]
    value = 0;
  end
end

[更新:1 - 代码已更新为具有其他阻止]

问题有点误导,实际上if(dummy.exist(count))在梳理逻辑中使用时似乎失败了,但是当在seq逻辑内部时传递(并且因为“value”从未在此模块中分配,它在我的模拟中转到“x” - 所以用else块编辑 - 但这个结果是在VCS模拟器上。

EDA-playground链接:http://www.edaplayground.com/x/6eq   - 这里似乎正常工作,即if(dummy.exists(count))正在通过而不管是在always_comb内部还是总是@(posedge)

VCS中的结果: [当用作梳状逻辑时 - 值永远不会被打印]

Value = 0 
Applying reset Value = 0 
Came out of Reset 
Setting for count =  0  
Setting for count =  1 
Setting for count =  2  
Setting for count =  3 
Setting for count =  4  
Terminating simulation
Simulation Result : PASSED

当if(dummy.exist(count))和赋值在seq块内移动时,值打印为“1”。

2 个答案:

答案 0 :(得分:1)

您的第一个始终块包含阻塞和非阻塞分配,VCS可能允许这样做,因为always关键字曾经能够在verilog中指定组合逻辑(通过始终@(*))。这不应该是错误的原因,但是风格不好。

你的程序的第一行也很奇怪,你想要指定什么?值有点,但虚拟不是,所以如果你尝试虚拟[count] = 1&#39; b1,你也会弹出一个错误(用+ lint = all打开linting)。如果您正在尝试使用4位值的数组进行伪操作,则语法会关闭,然后值也会有错误的大小。

尝试将第一个始终切换到显式的always_ff,这应该会在VCS中给出警告/错误。此外,您始终可以查看波形,使用+ define + VPD编译并使用gtkwave(免费软件)。这应该可以让你清楚地看到发生了什么。

答案 1 :(得分:0)

请检查您的VCS编辑消息,看看是否有与SV新always_comb声明相关的警告。某些模拟器可能存在构造问题,或者在您在灵敏度列表中推断出“动态类型”时不支持该用法。我尝试过Incisiv(ncverilog),也没关系。