如何在Verilog中检查一个周期后的数据?

How to check data one cycle later in Verilog?

在时钟的位置,如果我被重置,我想检查重置后一个周期的数据是否为零。我无法弄清楚如何在重置后的一个周期内检查数据。这是我想出的,但我知道这是错误的,因为我在重置为高的同一时钟周期中检查数据。有人可以告诉我如何在 verilog 中执行此操作吗?

always @(posedge clk)
   if(reset)
      if(data == 0) 
         $display("ok");
      else 
         $display("error");

您似乎不想尝试在您的网站上使用 always 块 试验台。在测试台中使用 forever 循环是个好主意 always 块的替代方案,因为它可以具有一定的灵活性 控制你的测试台。

有人告诉我:always 块用于 RTL 设计,forever 循环用于 RTL 验证

您可以试试这个:

initial begin
   forever begin    
      @(posedge reset); // wait for the rising edge of reset

      // reset has occured at this time.
      @(posedge clk); // delay for 1 clock cycle

      // check your data here
      if(data == 0) $display("ok");
      else $display("error");
   end
end

有一个简单的方法可以做到这一点:

always @(posedge clk)
   reset_q <= reset;

always @(posedge clk)
   if(reset_q == 1) && (data == 0) 
      $display("reset ok");
   else 
      $display("reset error");

我把它们放在不同的块中以强调一个是对重置信号进行操作的流水线,另一个是检查逻辑,但它们可以放在同一个 always 块中。