D simulación de flip flop: ¿qué salida de simulación es correcta?

1

Siempre me he preguntado, ¿cuál es la solución correcta para el flip flop D cuando la entrada cambia justo en el borde ascendente del reloj? He encontrado dos soluciones de estos en línea, pero no tengo ni idea de cuál es la correcta.

o

Creo que la respuesta correcta debería ser la imagen 1 (arriba), donde aparece la salida q en el siguiente flanco ascendente del reloj. Esto es lo que debe hacer el flip flop, es decir, crear un retraso de un ciclo.

Pero siempre obtengo la imagen 2 (imagen inferior) cuando ejecuto mi código Verilog. Mi código es:

module beh(q,d,en,clk);
input q,clk,en;
output d;
reg d;
always@(posedge clk)
begin
if(en==1)
d<=q;
end
endmodule

¿Qué estoy haciendo mal?

    
pregunta Curious

1 respuesta

2

El primero es generalmente cómo debe verse como el nivel de salida DESPUÉS de que el borde del reloj activo refleje el nivel de entrada ANTES del borde del reloj activo. Sin embargo, cuando la transición de entrada se pone en el borde del reloj activo, es ambiguo, ya que técnicamente es una violación del tiempo de configuración y de espera. En este caso, la diferencia entre usar < = y = en su banco de pruebas determinará si obtiene # 1 o # 2. Esto se debe a la forma en que funcionan los ciclos delta. Si usa = en el banco de pruebas, el nuevo valor se reflejará en la entrada del flip-flop inmediatamente al comienzo del ciclo y obtendrá el # 2. Sin embargo, si usa < =, el nuevo valor se reflejará al final del ciclo de actualización y obtendrá el # 1.

Pasé por varias iteraciones diferentes de TestBench para encontrar la más efectiva. Al principio, usé = en el banco de pruebas para el generador de reloj y para la lógica del banco de pruebas y la lógica del banco de pruebas se ejecutó en el flanco descendente en lugar del flanco ascendente. Esto hizo que los rastros en el simulador se volvieran un poco más obvios (a medio camino entre su número 1 y su número 2), sin embargo, tuve algunos problemas de tiempo al intentar obtener una interacción más profunda entre el banco de pruebas y el DUT. Terminé pasando a usar = en el generador de reloj y < = en el banco de pruebas y cambiando el banco de pruebas a usar el borde ascendente del reloj. Esto terminó pareciéndose a tu # 1, y resolvió los problemas de interacción que estaba teniendo. Ahora, uso MyHDL basado en Python para la parte funcional del banco de pruebas con un envoltorio verilog para el DUT, pero esa es una historia completamente diferente.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas