我试图编写一个使用关联数组的测试平台代码,并且发现在一种情况下访问它的值不能作为梳状逻辑工作,但是当在顺序 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/