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。我不明白延迟是如何安排的