Verlog延迟建模

时间:2017-06-25 07:15:46

标签: if-statement verilog delay nonblocking

以下示例代码。

我总是使用if \ else。每个部分都有自己的延迟 - X \ Y. 我的问题是电路是否进入'如果'并开始计算' X'延迟,然后异步事件进入'否则'它仍然记得' X'延迟而不是计算' Y'延迟。 [' X' >> ' Y'] '如果'和'其他'处理相同信号的部分[下面的sigA]。

我的问题是,如何验证异步事件可以清除延迟' X'然后开始其他'延迟操作' Y&#39 ;? 尝试阻止分配和另一个硬件技巧[MUX在外面]。但模拟器只能记住长时间的延迟。 我试图避免过度设计这样的逻辑始终[总是*]和计数状态机,但使用延迟操作符。

感谢。

always @(event)
begin
   if (event)
     /#X;
     sigA <= value1;
   end //end if
   else
     begin
     /#Y;
     sigA <= value2;
   end //else
end //always***

1 个答案:

答案 0 :(得分:0)

如果verilog在always块中遇到延迟,它将停止执行它,并且在清除延迟之前不会尝试任何新的执行。

所以,你的'else'部分只能在'then'部分的延迟被清除后执行。

以下是试验

的示例
module a;

   reg [3:0] v1, v2;
   reg       clk;
   integer   i ;


   initial begin #7 v1 = 1; end


   initial begin
  $display ("hello");
  clk = 0;

  v1 = 0;
  v2 = 0;

  for(i = 0; i < 20; i++)
    #2 clk = ~clk;

  $finish;

   end

   always @(clk)
 begin
    $display ("%3t starting the block, clk=%b", $time, clk);
    if (v1)
      begin
     #6 v1 = ~v1;
     $display ("%3t assignment is done", $time);

      end
    else
      begin
     $display ("%3t else hello", $time);         
     #12 v1 = ~v2;
     $display ("%3t else is done", $time);

      end
 end // always @ (clk)
endmodule // a

结果:

$ ./a
 hello
   0 starting the block, clk=0
   0 else hello
  12 else is done
  12 starting the block, clk=0
  18 assignment is done
  18 starting the block, clk=1
  18 else hello
  30 else is done
  30 starting the block, clk=1
  36 assignment is done
  36 starting the block, clk=0
  36 else hello$ ./a