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.