bloques de memoria sintetizables

0

En Verilog, estoy intentando almacenar la entrada hasta 4 valores anteriores y luego operar sobre ellos. El código está bien en la simulación pero en FPGA, calcula la salida con la entrada actual en lugar de los anteriores. ¿Cuáles son los registros que no se sintetizan en bloques de memoria donde se pueden almacenar las entradas pasadas? se supone que los valores de entrada pasados solo cambian al cambiar la entrada actual.
Todas las operaciones deben realizarse con 4 valores almacenados de x- > %código% Funciona en simulación, falla en hardware (Spartan 3E) Módulo superior:

module main(input [7:0] x,input clk,reset, output [15:0] y,output reg[7:0] x0,x1,x2,x3
);  
  //reg [7:0]pxe[0:3];  
  reg [7:0] h0,h1,h2,h3;   
  reg [7:0] addr;  
  wire [7:0]m0,m3,m1,m2;   
  wire [3:0]s2,s3,s1,s0;  
  wire [15:0] mult0,mult1,mult2,mult3,out0;  
  wire [15:0] sout0,sout1,sout2,sout3;  
  wire [7:0] xconv0,xconv1,xconv2,xconv3;  
  wire [7:0] sin0,sin1,sin2,sin3;  
  wire [15:0] po0,po1,po2,po3;  
  //reg [3:0] s0;  
  assign out0=8'd0;  

  check inst_1(h0,clk,reset,m0,s0);  
  check inst_2(h1,clk,reset,m1,s1);  
  check inst_3(h2,clk,reset,m2,s2);  
  check inst_4(h3,clk,reset,m3,s3);  

  cla3input int_1(mult0,sout0,out0,po0);  
  cla3input int_2(mult1,sout1,po0,po1);  
  cla3input int_3(mult2,sout2,po1,po2);  
  cla3input int_4(mult3,sout3,po2,po3);  

  xconv ist_1(x0,s0,xconv0);  
  xconv ist_2(x1,s1,xconv1);  
  xconv ist_3(x2,s2,xconv2);  
  xconv ist_4(x3,s3,xconv3);  

  shiftin it_1(h0,xconv0,sin0);  
  shiftin it_2(h1,xconv1,sin1);   
  shiftin it_3(h2,xconv2,sin2);  
  shiftin it_4(h3,xconv3,sin3);  

  shifter i_1(sin0,s0,sout0);   
  shifter i_2(sin1,s1,sout1);  
  shifter i_3(sin2,s2,sout2);  
  shifter i_4(sin3,s3,sout3);  

  booth_a is_1(mult0,x0,m0,h0);  
  booth_a is_2(mult1,x1,m1,h1);  
  booth_a is_3(mult2,x2,m2,h2);  
  booth_a is_4(mult3,x3,m3,h3);  

  assign y= po3;   
    always@(posedge clk)  
    begin  
      h0<=5;  
      h1<=-3;  
      h2<=1;   
      h3<=2;  
      if (reset)  
      begin  
        x0<=0;  
        x1<=0;  
        x2<=0;  
        x3<=0;   
      end  
      else  
      begin  
        x0<=x;  
        x1<=x0;  
        x2<=x1;  
        x3<=x2;  
      end  
    end  
endmodule     
    
pregunta prerana M

1 respuesta

1

Lo que está sintetizando no son bloques de memoria, sino que se registran con reinicio síncrono, que debería actuar exactamente como lo describió, de modo que ese no es el problema que está viendo. Por lo tanto, no está completamente claro para mí dónde está el problema. Le sugiero que agregue algunos detalles (por ejemplo, la versión de las herramientas que está utilizando para sintetizar esto, qué otros registros están en el diseño, incrustados en bloques), entonces será más fácil ayudarlo. También puede consultar las advertencias y la síntesis de netlist antes y después de la síntesis para verificar si se implementaron los registros.

PS: ¿sabe que h0, h1, h2, h3 están fijados a valores constantes? ¿Eso es lo que quiere hacer? Si es así, puede moverlos fuera del bloque de registro.

    
respondido por el Francesco Conti

Lea otras preguntas en las etiquetas