pipeline and verilog

0

Tengo un esquema canalizado y quiero tener un registro en la salida para mi resultado.

Por lo tanto, estoy usando este código:

 always @(posedge clk, posedge reset) begin
      if (reset) begin
          //do staff
      end else begin
         if (state_5) begin
            output <= ....
         end
      end
   end

sin embargo, por razones de tiempo, quiero que el resultado esté disponible en el mismo ciclo. Si cambio mi código a esto:

always @(posedge clk, posedge reset) begin
          if (reset) begin
              //do staff
          end else begin
             if (state_5) begin
                output = ....
             end
          end
       end

los resultados también están disponibles en el próximo ciclo.

Si cambio en eso:

always @(*) begin
             if (state_5) begin
                output = ....
             end
          end

Estoy bien con el tiempo. Mi pregunta es, ¿este código infiere un registro para ser utilizado?

mi salida se define como output reg .

    
pregunta ghostrider

2 respuestas

1

Su primer ejemplo definitivamente inferirá un registro, y la salida estará disponible después de que se ejecuten todas las declaraciones < = en el bloque siempre. El segundo ejemplo probablemente inferirá un registro (también esperaría al menos una advertencia, o un error aquí, dependiendo de su sintetizador). El bloque se ejecutará solo con sensibilidad a las señales clk y reset, y por lo tanto, el sintetizador debería inferir un registro.

El tercer ejemplo NO inferirá un registro, ya que la salida será sensible a todas las señales en el bloque siempre (aquellas que constituyen la formación de la señal de salida también). Esto significa que el circuito aquí no es reloj activado, por lo tanto no es un registro sino un pestillo. Como menciona el comentario de Dave Tweed, un pestillo definitivamente no es lo mismo que un registro de canalización.

Por lo tanto, la forma correcta (que yo sepa) de usar esto es dividir su código en dos partes, un bit de la lógica combinacional y un bit de la lógica secuencial. Se vería algo así como:

reg out_r;
wire out_c;

assign out_c = ... ;

always @(posedge clk, posedge rst) begin
    if(reset) begin
        ...
    end else begin
        out_r <= out_c;
    end
end
    
respondido por el deadude
2

Cualquier cosa que siga al always @(*) if(condition) reg_type=value; inferirá un pestillo. Lo más probable es que no quiera tener un pestillo.

Si desea obtener el resultado rápidamente, puede separar la lógica de combinación de la lógica síncrona.

always @(*) begin
    // set default : acts as a catch-all else statement. No latch is inferred.
    next_out = out; 
    if (state_5) begin
        next_out = ....
    end
end
always @(posedge clk, posedge reset) begin
    if (reset) begin 
        // reset stuff;
    end
    else begin
        out <= next_out;
    end
end

Solo recuerda que todavía hay un retraso en la propagación.

Nota: output es una palabra clave de Verilog. Asegúrate de usar un nombre diferente, como out, output_reg o algo más descriptivo.

    
respondido por el Greg

Lea otras preguntas en las etiquetas