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

标签 associative-array system-verilog

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

示例代码:

这里“值”总是被分配为“x”,但是一旦我将它移到@posedge block 中,我就会看到它被分配了正确的值(一旦“虚拟”被分配为 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 - 代码更新为有 else block ]

这个问题有点误导,实际上 if(dummy.exist(count)) 在梳理逻辑内部使用时似乎失败了,但在 seq 逻辑内部使用时通过了(并且因为“值”从未在此模块中分配,它在我的模拟中变为“x”——所以用 else block 编辑)——但这个结果是在 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 block 内时,值打印为“1”。

最佳答案

您的第一个 always block 包含阻塞和非阻塞赋值,VCS 可能允许这样做,因为 always 关键字曾经能够在 verilog 中指定组合逻辑(通过 always @(*))。这不应该解释错误,而是一种糟糕的风格。

你程序的第一行也很奇怪,你想说明什么? Value 有点,但 dummy 不是,所以如果你尝试做 dummy[count] = 1'b1,你也会弹出一个错误(用 +lint=all 打开 linting)。如果您试图使 dummy 成为一个 4 位值的数组,则您的语法已关闭,并且值的大小也有误。

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

关于associative-array - 梳状与顺序中的关联数组元素访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395372/

相关文章:

javascript - 访问关联数组

verilog - 使用串联和大小写时,移位器输出始终为 0

verilog - 为什么有负值有符号文字?

verilog - 如何使用UVM工厂的set_inst_override_by_name来覆盖序列项

memory - 四端口内存来自单端口内存还是双端口内存?

javascript - 存储在变量中的关联数组中的访问 key

javascript - 对象和数组的 ECMAScript5 深拷贝

php - OOPHP - 如何从数据库行数组创建多个对象?

system-verilog - 数系统verilog

javascript - 每次单击都将新元素添加到关联数组