始终阻止两个事件或多个事件

时间:2018-02-14 07:26:29

标签: verilog system-verilog hdl

使用一个事件控件和两个事件控件的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

1 个答案:

答案 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

enter image description here