在第二个 $display
语句中,A
和 B
会打印什么?
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/