Aquí hay un código verilog: (Este código no es para síntesis)
'timescale 1 ns / 1 ns
module test;
reg r1, r2, r3, r4;
reg clk_at_time, clk_from_clk;
// Initialize signals
initial begin
r1 <= 1;
r2 <= 0;
clk_at_time <= 1;
#200
$finish();
end
// Generating simple a clock (period time is 10ns) (as expected)
always #5
clk_at_time <= ~clk_at_time;
// Generating a clock based on the clk_at_time.
// This clk_from_clk is always equals the clk_at_time (as expected)
always @ clk_at_time
clk_from_clk <= clk_at_time;
// r1 and r2 inverted at all posedge event. (as expected)
// r3 is constant 0 (as expected)
always @(posedge clk_at_time) begin
r1 <= r2;
r2 <= r1;
r3 <= clk_from_clk;
end
// r4 is constant 1 ???!!!??? HOW ???!!!???
always @(posedge clk_from_clk) begin
r4 <= clk_at_time;
end
endmodule
Y la forma de onda de la simulación:
En el código hay dos relojes: primero es el reloj tradicional generado por el tiempo always #5
el segundo es generado por este reloj always @ clk_at_time
Los dos relojes siempre son iguales (como se esperaba)
Lo extraño es que si uso clk_from_clk en el bloque de clk_at_time, se usará el valor anterior de clk_from_clk. (OK), PERO si uso clk_at_time en el bloque de clk_from_clk, se usará el valor NEW de clk_at_time.
Aclarar:
Vea la forma de onda: clk_from_clk
y clk_at_time
son siempre iguales.
Ver código: r3
y r4
son analógicos:
-
r3
está en el bloque declk_at_time
y es impulsado porclk_from_clk
-
r4
está en el bloque declk_from_clk
y es impulsado porclk_at_time
Entonces, si clk_from_clk
y clk_at_time
son realmente los mismos r3
y r4
deberían ser iguales siempre. PERO vea la forma de onda: r3
siempre es 0 y r4
siempre es 1
¿CÓMO? ¿Cuál es la regla?