modelado de memoria RAM en Verilog

2

Estoy tratando de modelar una memoria RAM de 0.125GB en Verilog usando ModelSim de 512 bit de ancho usando chips de memoria de 32 bit 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 intenté 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 de cada módulo instanciado de manera consecuente, de manera que se requieren 16 ciclos de reloj para completar la transferencia de datos de 512 bits.

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

    
pregunta titan

1 respuesta

1

Parece que necesita volver a escribir el modelo de memoria para actualizar 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.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas