Состояние гонки между сигналами

Я столкнулся с тестовым стендом, который можно свести к приведенному ниже примеру: часы и сигналы изменяются на одном и том же временном шаге с блокирующими назначениями. Я считаю, что это вызывает состояние гонки между часами и двумя сигналами ctrlX, но я не смог доказать это на игровой площадке EDA (я понимаю, что это вне моего контроля). Я прав, что есть состояние гонки? (Ссылка на EDA Playground: https://www.edaplayground.com/x/5yDX#&togetherjs=gkG5xewfNN)

module tb_example;


  reg clk = 1;
  reg [3:0] dff1,dff2;
  reg [3:0] ctrl1 = 'd0;
  reg [3:0] ctrl2 = 'd0;

  initial begin
    #10 ctrl1 = 'd1;
    #20 ctrl1 = 'd2;
    #10 ctrl1 = 'd3;
    #100 $finish;
  end

  always begin
    #5 clk = !clk;  
  end

  initial begin
    $dumpfile("dump.vcd");
    $dumpvars(0,tb_example);
  end

  initial begin
    #10 ctrl2 = 'd1;
    #20 ctrl2 = 'd2;
    #10 ctrl2 = 'd3;
    #100 $finish;
  end

  always @ (posedge(clk)) begin
    dff1 <= ctrl1;
  end

  always @ (posedge(clk)) begin
    dff2 <= ctrl2;
  end

endmodule

person user11610    schedule 22.03.2017    source источник


Ответы (1)


Да, это состояние гонки, потому что вы используете назначения блокировки для ctrlx, и они меняются одновременно с posedge clk. Таким образом, значения, присвоенные dffx, являются неопределенными и могут варьироваться от симулятора к симулятору.

Один из способов избежать этого — изменить ctrlx на противоположность clk:

  reg clk = 0;
person toolic    schedule 22.03.2017