1 votos

Pregunta básica sobre el retardo intra-asignación en Verilog

El retardo de la intraasignación Verilog no parece funcionar como yo quería. Estoy intentando modelar una puerta OR con un retardo de salida de 2 NS.
Diseño:

module or_gate(input a, b, output logic g);
  always@(*) begin
    g = #2 a | b;
  end  
endmodule

Banco de pruebas:

module tb;
  reg a, b;
  wire g;
  or_gate g1(.*);
  initial begin
    $dumpfile("dump.vcd");
    $dumpvars(1, tb);
    $display("\t\tTime\tA\tB\tG");
    $monitor("%d\t%d\t%d\t%d", $time, a,b,g);
    a = 1'b1;
    b = 1'b1;
    #5;
    a = 1'b0;
    b = 1'b0;
    #1;
    a = 1'b1;
    b = 1'b1;
    #7;
    a = 1'b1;
    b = 1'b0;
    #3;
  end
endmodule  

Salida

Time    A   B   G
   0    1   1   x
   2    1   1   1
   5    0   0   1
   6    1   1   1
   7    1   1   0
   13   1   0   0
   15   1   0   1

Espero que la salida sea 1, 2 NS después de 7 NS, ya que las entradas son 1 y 1 a 7 NS. Sin embargo, de 9 NS a 15 NS la salida es 0. ¿Por qué ocurre esto?

Enlace EDA Playground de esta simulación: https://edaplayground.com/x/tsqY

4voto

Kapila Ku Puntos 1

Los retardos de intra-asignación en un bloque Verilog always no deben usarse NUNCA (¡NUNCA!). No hay hardware conocido que se comporte como este retardo de intra-asignación usando asignaciones de bloqueo. Si pudiera eliminar esto del lenguaje Verilog lo haría, pero no puedo por compatibilidad con versiones anteriores. En la formación de Verilog, siempre digo: "¡si tu madre y yo alguna vez te pillamos poniendo retardos en el lado derecho de una asignación de bloqueo estaremos muy disgustados!". (En cuanto meto a "madre" en la recomendación, los ingenieros saben que la cosa va en serio).

La siguiente pregunta es: ¿quieres modelar retrasos inerciales o retrasos de transporte? -O ¿deberías siquiera modelar con retardos? La mayor parte del diseño RTL se realiza con un modelado de retardo 0 y, a continuación, se utiliza una herramienta de análisis de temporización estática (STA) para comprobar la temporización. La simulación dinámica basada en la temporización se evita en gran medida, excepto en el caso de la simulación a nivel de puerta (GLS).

En mi página web hay un artículo de 1999 que responde a todas estas preguntas: Métodos correctos para añadir retardos a los modelos de comportamiento Verilog http://www.sunburst-design.com/papers/CummingsHDLCON1999_BehavioralDelays_Rev1_1.pdf

2voto

Zafar Puntos 21

Este bloque siempre actua como uno de bloqueo, por lo que cada vez que entra en el bloque siempre esperara 2ns antes de poder continuar (mientras tanto si alguna entrada esta cambiando no causara ningun cambio en la salida como el que ocurre a los 6ns). Así que básicamente la expectativa es que la entrada no debe cambiar por un tiempo menor que el tiempo consumido en el bloqueo siempre, de lo contrario no será capaz de ver el cambio de entrada.

Por favor, corrija si esta interpretación no es correcta.

2voto

GRoNGoR Puntos 81

En \$5\text{ns}\$ se produce un acontecimiento: \$11 \rightarrow 00\$ que activa el always bloque.

En always se bloquea para \$2\text{ns}\$ debido a la declaración de retraso. Ahora está bloqueado en el intervalo \$[5, 7\text{ns}]\$ . Así que se pierde el evento en \$6\text{ns}\$ : \$00 \rightarrow 11\$ ...

El resultado es \$0\$ en \$7\text{ns}\$ . En always se desbloquea. Los eventos omitidos no se pueden recuperar, por lo que no se podría activar para la entrada modificada: \$11\$ .... la salida se mantiene en \$0\$ .

En \$13\text{ns}\$ se produce un acontecimiento: \$11 \rightarrow 10\$ que activa el always y la salida se convierte en \$1\$ en \$15\text{ns}\$ .

2voto

Shashank V M Puntos 7

Si utilizamos la asignación no bloqueante en lugar de la asignación bloqueante, el evento no se perderá. El uso de la asignación bloqueante bloquea la simulación, y se pierde el evento que tiene lugar cuando la simulación está bloqueada.

Diseño:

module or_gate(input a, b, output logic g);
always@(*) begin
    g <= #2 a | b;
end
endmodule

Banco de pruebas:

module tb;
  reg a, b;
  wire g;
  or_gate g1(.*);
  initial begin
    $dumpfile("dump.vcd");
    $dumpvars(1, tb);
    $display("\t\tTime\tA\tB\tG");
    $monitor("%d\t%d\t%d\t%d", $time, a,b,g);
    a = 1'b1;
    b = 1'b1;
    #5;
    a = 1'b0;
    b = 1'b0;
    #1;
    a = 1'b1;
    b = 1'b1;
    #7;
    a = 1'b1;
    b = 1'b0;
    #3;
  end
endmodule  

Salida :

                 Time   A   B   G
                     0  1   1   x
                     2  1   1   1
                     5  0   0   1
                     6  1   1   1
                     7  1   1   0
                     8  1   1   1
                    13  1   0   1

Créditos: La sugerencia de utilizar la asignación no bloqueante fue dada por el usuario e ingeniero profesional de Electrical Engineering Stack Exchange Rahul Behl .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X