Неразбериха внутри и внутри задержки с блокировкой и NBA в Verilog - PullRequest
0 голосов
/ 10 февраля 2019

Вот код.

module temp();
  bit a;
  bit w_inter_nonblocking, x_inter_blocking, y_intra_blocking, z_intra_nonblocking;

  always @ (a)
  begin 
    $display("@%0t : Blocking x_inter_blocking", $time());
    #7 x_inter_blocking = a;
  end

  always @ (a)
  begin 
    $display("@%0t : Nonblocking w_inter_nonblocking", $time());
    #7 w_inter_nonblocking <= a;
  end

  always @ (a)
  begin 
    $display("@%0t : Nonblocking z_intra_nonblocking", $time());
    z_intra_nonblocking <= #7 a;
  end

  always @ (a)
  begin
    $display("@%0t : Blocking y_intra_blocking", $time());
    y_intra_blocking = #7 a;
  end

  initial
    forever #5 a = $random();

  initial 
    #150 $finish();

  // initial 
  //   #40 disable karan;

  initial 
  begin
    $dumpvars(0, temp);
    $dumpfile("temp.vcd");
  end
endmodule

Здесь приведены соответствующие операторы печати и форма сигнала.

@10 : Nonblocking z_intra_nonblocking
@10 : Blocking x_inter_blocking
@10 : Nonblocking w_inter_nonblocking
@10 : Blocking y_intra_blocking
@40 : Nonblocking z_intra_nonblocking
@40 : Blocking x_inter_blocking
@40 : Nonblocking w_inter_nonblocking
@40 : Blocking y_intra_blocking
@45 : Nonblocking z_intra_nonblocking
@55 : Nonblocking z_intra_nonblocking
@55 : Blocking x_inter_blocking
@55 : Nonblocking w_inter_nonblocking
@55 : Blocking y_intra_blocking
@60 : Nonblocking z_intra_nonblocking
@70 : Nonblocking z_intra_nonblocking
@70 : Blocking x_inter_blocking
@70 : Nonblocking w_inter_nonblocking
@70 : Blocking y_intra_blocking
@75 : Nonblocking z_intra_nonblocking
@80 : Nonblocking z_intra_nonblocking
@80 : Blocking x_inter_blocking
@80 : Nonblocking w_inter_nonblocking
@80 : Blocking y_intra_blocking
@85 : Nonblocking z_intra_nonblocking
@90 : Nonblocking z_intra_nonblocking
@90 : Blocking x_inter_blocking
@90 : Nonblocking w_inter_nonblocking
@90 : Blocking y_intra_blocking
@95 : Nonblocking z_intra_nonblocking
@105 : Nonblocking z_intra_nonblocking
@105 : Blocking x_inter_blocking
@105 : Nonblocking w_inter_nonblocking
@105 : Blocking y_intra_blocking
@110 : Nonblocking z_intra_nonblocking
@115 : Nonblocking z_intra_nonblocking
@115 : Blocking x_inter_blocking
@115 : Nonblocking w_inter_nonblocking
@115 : Blocking y_intra_blocking
@130 : Nonblocking z_intra_nonblocking
@130 : Blocking x_inter_blocking
@130 : Nonblocking w_inter_nonblocking
@130 : Blocking y_intra_blocking
@135 : Nonblocking z_intra_nonblocking
@140 : Nonblocking z_intra_nonblocking
@140 : Blocking x_inter_blocking
@140 : Nonblocking w_inter_nonblocking
@140 : Blocking y_intra_blocking

Output Waveform

Как вы можете видеть, что только внутренняя задержка с неблокирующими назначениями дает задержанный вывод, остальные задержки / назначения дают различный выход.

Я знаю разницу между задержками Inter / Intra, однако кажется, что блоки всегдане запускаются при альтернативных событиях (с задержкой #7, если какое-либо изменение сигнала происходит с задержкой < #7).Однако блокировка Intra Delay с NBA всегда срабатывает правильно.

Может кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 10 февраля 2019

always @(expression) statement не означает выполнение statement eveytime изменений expression.Это означает ожидание изменения expression, выполнение statement, а затем повторение возврата к ожиданию изменения expression.

Проблема заключается в том, что когда выражение изменяется в процессе выполнения оператора, оно теряется.Вы можете ждать только тех изменений, которые произошли после того, как вы начали ждать.

Это та же проблема, что и эта Я ответил ранее.

...