error de síntesis del código Verilog

0

Tengo un problema con mi código de verilog cuando lo sintetizo. Se muestra el error de varios controladores. Creo que puede ser que sea por los múltiples bloques que siempre uso en él. Entonces, ¿cómo puedo solucionarlo? Aquí está:

module check(csx,dcx,wrx,rdx,clk,d_out,res);
input wire clk,res;
output reg csx,dcx,wrx,rdx;
output reg [7:0]d_out;
reg [2:0]count;

always @ (res)
begin
  if (res==1)
  begin
    csx=1;
    wrx=0;
    rdx=1;
    dcx=0;
    count=0;
    d_out=0;
  end
end

always @ (posedge clk)
begin
  count=count+1;
end

always @ (count)
begin
  repeat(3'h5)
  begin
    if((count+res)==3'h2)
    begin
      d_out=8'h28;
    end
    else if(count==3'h3)
    begin
      csx=0;
      wrx=1;
    end
    else if (count==3'h4)
    begin
      wrx=0;
      csx=1;
      d_out=8'h11;
    end
    else if (count==3'h5)
    begin
      csx=0;
      wrx=1;
    end
  end
end

endmodule
    
pregunta user43612

2 respuestas

2

No puede agregar la lógica de restablecimiento como un bloque always separado; necesitas incorporar el reinicio en los bloques que ya tienes.

Además, no puede usar el bloque repeat de esa manera en el código sintetizable. No estoy seguro exactamente de lo que estás tratando de lograr con eso; Parece que simplemente puedes eliminar esa línea y la línea end asociada.

    
respondido por el Dave Tweed
0

Para ser sintetizable, los tipos reg solo pueden asignarse dentro de un bloque always . Verilog permite que reg s se asigne a cualquier lugar para el banco de pruebas y para fines de modelado no sintetizables.

repeat es una palabra clave no sintetizable. De nuevo, es para bancos de pruebas y modelos no sintetizables.

El bloque always @ (count) está inferiendo la lógica de enclavamiento por dos razones:

  1. La lista de sensibilidad está incompleta. Debe ser always @ (count or res) o always @*
  2. csx,dcx,wrx,rdx,d_out no se asignan en todas las condiciones ramificadas, esto infiere latches.

Lo más probable es que quieras ponerlo en un bloque siempre y tener flops csx,dcx,wrx,rdx,d_out :

always @(posedge clk or posedge res) // clock edge or async reset
begin
  if (rst == 1'b1) begin // reset
    // assign all regs a constant default value
    csx <= 1'b1; // use non-blocking assignment (<=)
    wrx <= 1'b0; // recommenced to use to use explicit bit-width and radix
    // ...
  end
  else begin
    case (count)
      3'd1: d_out=8'h28;
      3'd2: begin
              csx=0;
              wrx=1;
            end
      // ... other conditions 
    endcase
    count <= count + 1'd1;
  end

Si su simulador y sintetizador son compatibles con SystemVerilog, recomendaría usar always_ff (para flip-flops), always_comb (para lógica de combinación) y always_latch (para latches previstos). Son como el tradicional always espera que arrojen errores de compilación si más de un always* bloque está asignando el mismo registro, si se encuentran elementos de retardo de bloqueo dentro del bloque, y verificaciones adicionales de sintetibilidad. También proporciona una guía mejorada para la alineación y las herramientas de comprobación de equivalencia lógica. Dará el mismo resultado que Verilog correctamente codificado.

    
respondido por el Greg

Lea otras preguntas en las etiquetas