(Sistema) Verilog: ¿la señal es x o 1 dependiendo de la ubicación de los bloques concurrentes en el código?

0

Básicamente, soy consciente de que el programador de Verilog es intrínsecamente indeterminado, pero realmente no entiendo por qué ese es el caso con el siguiente código (simulé ambos casos con Icarus e Incisive en EDA Playground). Las diferencias entre TB_A y TB_B están en el orden de los bloques initial y always .

Caso A:

module TB_A ();

reg nrst;
reg signal;

initial
    nrst = 1'b0; 

always @(negedge nrst)
    signal = 1'b1;

initial
    #10 $display("value is: %b",signal);

endmodule

Caso B:

module TB_B ();

reg nrst;
reg signal;


always @(negedge nrst)
    signal = 1'b1;

initial
    nrst = 1'b0; 

initial
    #10 $display("value is: %b",signal);

endmodule

Yo esperaría que en T = 0 se produzca la transición en nrst e inevitablemente active el bloque always , poniendo signal en 1. Esto sucede en el Caso B pero no en el Caso A, donde se muestra el valor x para signal . En otras palabras, no esperaría indeterminación en este caso, pero evidentemente me estoy perdiendo algo. Cambiar a SystemVerilog no cambia nada.

    
pregunta simonstar

1 respuesta

3

La gente entiende mal el comportamiento de simulación de los bloques always . No se ejecuta en cada negación. Es un proceso como un bloque initial que ejecuta sentencias de procedimiento. Es lo mismo que si escribieras

initial begin
    nrst = 1'b0; 
    end
initial begin
  @(negedge nrst) // this means suspend the process and wait for a negedge
    signal = 1'b1;
 @(negedge nrst)
    signal = 1'b1;
  ... // repeats infinitely for an always block
   end

Esta es una condición de carrera porque el orden en que initial bloquea sus procesos determina si la asignación a nrst en un proceso es vista por el otro proceso que suspende la espera de una transición de cobertura negativa. Una asignación de la NBA a nrst , además de mover la asignación después del tiempo 0 resolvería esta carrera.

    
respondido por el dave_59

Lea otras preguntas en las etiquetas