Verilog del sistema en cuestión de síntesis de Quartus

0
module blockingbad(input logic clk,a,b,c,output logic y);
    logic x;

    always_ff @(posedge clk) begin
    y=x|c;
    x=a&b;
    end
    endmodule

ParaelfragmentodeSysveriloganterior,elquartus13.1sintetizaunalistaderedesquesemuestraarriba.

Perocuandointercambioelordendecálculodeyyx,obtengounalistaderedessintetizadaquesemuestraacontinuación.

¿Por qué exactamente estoy obteniendo una netlist diferente? Sé que tiene que ver con la asignación de bloqueo "=" pero no puedo entender el cambio en el número de chanclas. ¿Alguien me lo puede explicar? Gracias

    

2 respuestas

3

Cuando escribes

y=x|c;
x=a&b;

significa que desea calcular y = x | c, luego desea configurar x en a & b. Como esto debe implementarse con puertas, el antiguo valor de x debe almacenarse hasta el final del ciclo de reloj, de ahí el flip-flop adicional. Si reescribiera esto con asignaciones sin bloqueo, haría:

y<=x|c;
x<=a&b;

Sin embargo, cuando escribes

x=a&b;
y=x|c;

significa calcular x, luego calcular y con el nuevo valor de x. Si quisiera implementar esto con asignaciones sin bloqueo, haría:

x<=a&b;
y<=(a&b)|c;

También puede usar una declaración de asignación para configurar x antes, o mezclar un bloqueo y una asignación sin bloqueo. En este caso, si el valor x registrado nunca se usa, el optimizador eliminará automáticamente el flip flop.

    
respondido por el alex.forencich
0

Sólo estoy familiarizado con verilog, pero en las tareas de bloqueo, la asociación se realiza de forma secuencial. En el primer caso, y está asociado a x | c, y aún no sabe que x = a & b, por lo que no se comportará de manera predecible, y eso es probablemente lo que está causando el cambio en el número de ffs.

Si agrega x = a & b antes de y = x | c, entonces el compilador sabe, nuevamente debido a la naturaleza secuencial de las instrucciones de bloqueo, que x = a & b, antes de implementar y = x | c.

    
respondido por el triplebig

Lea otras preguntas en las etiquetas