使用一个事件控件和两个事件控件的always block之间有什么区别?
module test;
logic a,b;
initial
begin
a = 0;
a = 1;
a=0;
a=1;
end
always@(posedge a)
// @(posedge a)
b = a;
initial $monitor(b); // uncommenting @(posedge a) results to 'x'. Otherwise results to '1'
endmodule
答案 0 :(得分:2)
虽然“@(...)”结构主要与'always'结合使用,但它决不是唯一的地方。它也可以用于等待事件。这通常在测试台中完成。 这是我的一个测试台的一些代码:
@(posedge clk) ;
for (r=0; r<32; r=r+1)
begin
radrs <= r%16;
read <= 1'b1;
@(posedge clk) ;
radrs <= 'hx;
read <= 1'b0;
@(posedge clk) ;
while (ready==1'b0)
@(posedge clk);
end
回到你的代码(我删除了评论并重新格式化):
always@(posedge a)
@(posedge a) b = a;
因此,您有一个始终阻止,由'a'的上升沿触发 在正边缘之后,它等待'a'上的另一个正边沿,然后将b分配给a。在这种情况下,'b'的值将始终是'a'上第二个上升沿之后的值,然后永远不会改变。
更重要的是你的测试台。您可以将值分配给“a”,没有时间延迟。在Verilog中,这意味着它们之间存在delta延迟(模拟时间延迟,没有物理延迟)。如果你想看到代码的效果,请使用:
initial
begin
a = 0;
#10 a = 1;
#10 a=0;
#10 a=1;
end