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

时间:2017-09-20 16:59:29

标签: 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("Non-blocking: A= %d B= %d", A, B ); // A = ?, B = ?
end
endmodule

关于verilog中的事件调度如何处理延迟和非阻塞语句的任何指针都会非常有用。谢谢。

2 个答案:

答案 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,因此它将在同一时间段内具有非阻塞指定信号的原始值。