必须在System Verilog的过程块中使用非阻塞赋值吗?

时间:2014-02-21 03:09:52

标签: variable-assignment nonblocking system-verilog

我遇到过一种情况,我认为我必须在@(posedge clk)块中使用阻止分配。下面的片段来自tsetbench。我想通过测试平台将数据输入到DUT。 input_intf是接口的名称,wcb是与wclk同步的时钟块。

   @(posedge input_intf.wclk)
    begin
      input_intf.winc = 1;
      input_intf.wcb.wdata = 8'd7;
      input_intf.winc = 0;
    end

我想要执行以下操作:在正时钟边沿之后,inc = 1并启用数据读取。读取数据后,让inc = 0。我想winc信号可能不需要与wclk同步?如果是这种情况,那么代码段应该如下。

input_intf.winc = 1;

@(posedge input_intf.wclk)
   input_intf.wcb.wdata <= 8'd7;

input_intf.winc = 0;

所以我们必须在程序块中使用非阻塞赋值吗?在学习Verilog时,我被告知这是真的。

谢谢!

1 个答案:

答案 0 :(得分:3)

声明input_intf.wcb.wdata = 8'd7;是非法的。您不使用阻塞或非阻塞分配来驱动时钟块输出。请参阅IEEE Std 1800-2012 LRM中的 14.16.1驱动器和非阻止分配。对于接口内的其他非时钟块变量,使用与Verilog相同的规则:使用非阻塞分配写入与时钟同步的变量,并在同一时钟上由其他过程块读取边缘。这就是你如何避免比赛。

时钟块的使用通常是全有或全无的方法。您不应该在同一过程中将写入与时钟块和非时钟变量混合,并且您应该只使用时钟块事件来同步代码。

@(input_intf.wcb) // do not use posedge of any signal here.
   input_intf.wcb.wdata <= 8'd7;

当然,这些规则也有例外,但我会确保你在去那里之前确切知道时钟块是如何工作的。