verilog - #delay 如何用于 Verilog 非阻塞语句?

标签 verilog delay

在第二个 $display 语句中,AB 会打印什么?

module blocking;

reg[0:7] A, B;

initial begin
   A = 3;
   #1 A = A + 1; 
   B = A + 1;
   $display("Blocking: A= %d B= %d", A, B ); // A = 4, B = 5
   A = 3;
   #1 A <= A + 1;
   B <= A + 1;
   #1 $display("Non-blocking: A= %d B= %d", A, B ); // A = ?, B = ?
end
endmodule

Verilog 中的事件调度如何处理延迟和非阻塞语句?

最佳答案

在第 2 个 $display 中,由于您已将显示放在另一个时隙中(使用 #1),A 的更新值& B 将被打印出来。

module blocking;
   reg[0:7] A, B;
   
   initial begin
     A = 3;
#1   A = A + 1; 
     B = A + 1;
     $display("Blocking: A = %0d B = %0d", A, B ); // A = 4, B = 5
     A = 3;
#1   A <= A + 1;
     B <= A + 1;
#1   $display("Non-blocking: A = %0d B = %0d", A, B ); // A = ?, B = ?
   end
endmodule

输出:

Blocking: A = 4 B = 5
Non-blocking: A = 4 B = 4

但是如果你把 $display 放在同一个时间段(没有 #1),那么 A 的未更新值>B 将被打印出来。

module blocking;
   reg[0:7] A, B;
   
   initial begin
     A = 3;
#1   A = A + 1; 
     B = A + 1;
     $display("Blocking: A = %0d B = %0d", A, B ); // A = 4, B = 5
     A = 3;
#1   A <= A + 1;
     B <= A + 1;
     $display("Non-blocking: A = %0d B = %0d", A, B ); // A = ?, B = ?
   end
endmodule

输出:

Blocking: A = 4 B = 5
Non-blocking: A = 3 B = 5

原因是 Verilog 中的事件调度。

$display 被安排在事件区域,它在NBA(非阻塞分配)区域之前,因此它将具有同一时隙内非阻塞分配信号的原始值。

关于verilog - #delay 如何用于 Verilog 非阻塞语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46327851/

相关文章:

verilog - 为什么在此 Verilog HDL 代码中使用两个触发器而不是一个?

verilog - 宽度独立函数

linux - TCP ACK 响应延迟 10ms

java - 如何让该项目在按下按钮后暂停给定的时间

verilog - 系统verilog开关没有变化

random - urandom_range(), urandom(), verilog 中的 random()

javascript - jQuery 循环,同时延迟更新 HTML

javascript - jQuery 键盘上的延迟

delay - 如何在vhdl中将信号延迟几个周期

parsing - 寻找verilog 2001模块声明语法