Verilog非阻塞语句的#delay如何工作?
在第二个Verilog非阻塞语句的#delay如何工作?,verilog,delay,Verilog,Delay,在第二个$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
$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
模块阻塞;
reg[0:7]A,B;
初始开始
A=3;
#1A=A+1;
B=A+1;
$display(“阻塞:A=%d B=%d”,A,B);//A=4,B=5
A=3;
#1 A因为在第二个$display
语句之前有#1
,它将在A
和B
结算后的下一个循环中执行
假设我们处于循环1
A=3;//在#1
#1/(不要紧)2
A在第二个$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
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
但如果将$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
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
原因是Verilog中的事件调度
$display
被安排在活动区域中,该区域位于NBA(非阻塞分配)区域之前,因此它将在同一时隙中具有非阻塞分配信号的原始值。我这样做了,对于第二个$display,我得到A=4和B=4。我不明白延迟是如何安排的