Error de código 9 en Modelsim

0

Cuando intento realizar la simulación del siguiente programa en Modelsim Altera 10.0d, aparece el mensaje Error: Code Error 9: ** Fatal: (vsim-4) * Error en la asignación de memoria.

Intentando asignar 131072 bytes

Por favor revise su sistema para ver la memoria disponible y el espacio de intercambio.

El siguiente es mi código: -

module sipo (gsclk, sclk, rst, sipo_in, sipo_out, sipo_out_i, dcsel, blank, gs_enable);
   input gsclk, sclk, rst;
   input sipo_in;
   input dcsel, blank;
   output reg [47:0] sipo_out;
   output reg [47:0] sipo_out_i;
   output     gs_enable;
   integer i;

   assign  gs_enable = (~dcsel & sclk==1'b1) ? 1'b1 : 1'b0;

   always @(posedge gsclk, posedge rst)
     i=0;
   begin
     if (rst)
       sipo_out_i  <= 47'b0;
     else
       if (gs_enable)
         for (i=1; i<= 48; i=i+1)
           @(posedge sclk)
             while (i < 48)
             begin
               sipo_out_i  <= {sipo_out_i[46:0], sipo_in}; 
               i = i+1;
             end
           sipo_out <= sipo_out_i;
   end

Por favor, ayúdame si requiere algún cambio en el código verilog?

    
pregunta Manzer

1 respuesta

1

Tu simulador debería estar dando errores de sintaxis antes del error de asignación de memoria.

El bloque always tiene muchos errores. Primero borra la línea i=0; , se asigna en el bucle for. Esto permite el bloque begin llamado en los eventos desencadenados always blocks. No utilice tanto el bucle for como el loop while. Actualmente, ambos dependen de i y si el código pudiera ejecutarse, vería que i iría de 1 a 48 sin un paso intermedio, y sip_out_i sería igual a {48{sipo_in}} . Suponiendo que no es lo que pretendes e ineficiente si lo es.

Tener una declaración anidada @(...) dentro de otro bloque es legal, pero es un estilo de codificación incorrecto. Las herramientas de síntesis y las herramientas de alineación darán errores. Las declaraciones anidadas de @(...) y wait están más destinadas al marco de prueba, e incluso eso se desaconseja en su mayor parte.

Debes usar dos bloques siempre. Uno se ejecuta en gsclk y el otro en sclk . sclk debe llenar sipo_out_i . gsclk transfiere sipo_out_i a sipo_out . Se necesitarán señales de saludo para sincronizar los dos bloques.

    
respondido por el Greg

Lea otras preguntas en las etiquetas