Modelado de memoria RAM en Verilog

Estoy tratando de modelar una memoria RAM de 0.125GB en Verilog usando ModelSim de 512 bits de ancho usando chips de memoria de 32 bits de ancho. Así que he creado un 32 * \2 18 matriz de memoria cuyo código es el siguiente:

    //The 32x2**18 MEMORY CHIP          
      module mini_sub_chip (word_out, word_in, word_addr, cs, we, clk);
        parameter WIDTH = 32,
                  DEPTH = 1 << 18,
                  SEL_BITS = 18;

    //output          
      output reg [WIDTH-1:0] word_out;

    //inputs
      input [WIDTH-1:0] word_in;
      input [SEL_BITS-1:0] word_addr;
      input cs, we, clk;

    //regs
      reg [WIDTH-1:0] schip [0:DEPTH-1];


      always @ (posedge clk)
      begin
       if (cs)
        begin 

         if (we)
          begin
          schip[word_addr] <= word_in;    // write into memory
          word_out <= word_in;
          end

        else
         begin
         word_out <= schip[word_addr];    //read from memory
        end
      end
    end   
  endmodule 

Luego traté de aumentar el ancho de la memoria a 512 creando 16 instancias del módulo anterior en un módulo diferente de la siguiente manera:

     always @ (posedge clk)
     begin
      if (reset)
       count <= 4'b0000;
      else 
       count <= count + 1;
       word_output <= word_out[count] //word_output is the 32 bit output register
     end

     decode_4x16 dcd416 (sel, count);

     generate 
     for (i = 0; i <= 15; i = i + 1)
     begin: loop
     assign chip_sel[i] = cs & sel[i];
     mini_sub_chip mschip (word_out[i], word_in, word_addr, chip_sel[i], we, clk); //Instantiating 16 modules in parallel
     //word_out is 32x16 array, with a different 32 bit array element driven every time 'mini_sub_chip' is instantiated
     end
     endgenerate

En cada ciclo de reloj, se transfieren datos de 32 bits desde cada módulo instanciado de manera consecutiva, de modo que se necesitan 16 ciclos de reloj para completar la transferencia de datos de 512 bits.

El primer módulo funciona correctamente, pero el segundo no. Los datos se escriben y se leen correctamente en la memoria en cada ciclo de reloj, pero el registro 'word_output' no se actualiza mientras se realiza la escritura en la memoria. Por lo tanto, permanece indefinido mientras se afirma 'nosotros'. Sin embargo, se actualiza durante las lecturas de memoria. Por favor guíe

Respuestas (1)

Parece que necesita volver a escribir el modelo de memoria para probar el puerto de salida cuando cs es 0. Dado que este no es el caso, el resultado no está definido ya que hay varios controladores.

Hola Alex. Yo también me di cuenta de esto y, por lo tanto, hice cambios en mi pregunta. Consulte el código actualizado, que ahora produce los resultados deseados, pero aún existe un problema
No parece que el problema esté resuelto. La salida de ram no está triestablecida, por lo que hay varios controladores en el bus de datos de salida.
Por favor, eche un vistazo a la pregunta editada ahora.
La salida de la memoria se retrasa un ciclo de reloj, por lo que transfiere el valor antes de que se lea de la memoria. Intente habilitar todas las selecciones de chips al mismo tiempo, espere un ciclo y luego lea los valores uno a la vez.
¿Es esto para la implementación en un FPGA o un modelo de simulación para chips de memoria externos conectados a un FPGA?
lo que sugeriste funcionó! Gracias. ¿Podría explicar por qué? Todavía no tengo muy claro qué está pasando exactamente. Por cierto, quiero usar este modelo para chips de memoria externa.
word_out se lee en el mismo borde del reloj en el que se actualiza, por lo que el nuevo valor no se lee. Sin embargo, si se trata de un modelo de simulación de chips existentes, entonces no puede simplemente perder el tiempo con él. ¿Las líneas de datos de sus chips están conectadas en paralelo? Si es así, debe obtener el modelo para probar los pines de salida, no para construir un multiplexor gigantesco.