第二个$ 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中的事件调度如何处理延迟和非阻塞语句的任何指针都会非常有用。谢谢。
答案 0 :(得分:0)
因为你在第二个$ display语句之前有#1,它将在A和B结束后的下一个循环中执行。
假设我们处于第1周期。
ion_auth_model
答案 1 :(得分:0)
在第二个$display
中,由于您已将显示放在另一个时间段(#1
),因此更新后的A
&amp;将打印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
// Output -
Blocking: A = 4 B = 5
Non-blocking: A = 4 B = 4
但是,如果您将$display
放在同一时间段(没有#1
),那么A
&amp;的未更新值将打印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
// Output -
Blocking: A = 4 B = 5
Non-blocking: A = 3 B = 5
原因是在Verilog中安排事件。
$display
计划在active region
之前,NBA (Non Blocking Assignment) region
,因此它将在同一时间段内具有非阻塞指定信号的原始值。