Módulo de modelado y memoria de memoria en síntesis de Verilog

2

Estoy usando una herramienta de síntesis y cuando estoy sintetizando un archivo verilog

module test();
reg reg1;
reg [1:0] reg2;
reg reg3 [1:0];
reg [1:0] reg4 [0:4];
endmodule

Está dando un error al "usar el módulo de memoria" con la ayuda de una opción. Entonces, lo que necesito es hacer un módulo de memoria. Intenté leer este enlace pero no me ayudó mucho.

¿Cómo podemos crear un módulo de memoria que se pueda usar con el caso de prueba anterior? Soy nuevo en verilog. Por lo tanto, no puedo entender qué es el "archivo Memory.list" en el enlace significa.

    
pregunta shailendra

1 respuesta

2

No estoy seguro de por qué necesita una opción especial, el uso de memorias es bastante estándar para usar dentro de los módulos. A menos que esté tratando de implicar una celda de potencia / área baja especial similar a un ariete.

Para una memoria estándar es lo mismo que tener varios registros. la memoria no implica RAM de la misma manera que reg no implica automáticamente flip-flop.

La 'memory.list' es un archivo de texto plano que contiene los valores que desea cargar en la memoria, esto no es necesario si solo desea restablecer la memoria y tener todos los elementos en 0.

memory.list debería verse como:

//Comments are allowed 
1100_1100   // This is first address i.e 8'h00
1010_1010   // This is second address i.e 8'h01
@ 55        // Jump to new address 8'h55
0101_1010   // This is address 8'h55
0110_1001   // This is address 8'h56

El uso del archivo seguiría:

module  memory();
  reg [7:0] my_memory [0:255];

  initial begin
    $readmemh("memory.list", my_memory);
  end
endmodule

alternativamente:

module  memory();
  reg [7:0] my_memory [0:255];
  integer i;

  initial begin
    for( i=0; i<256; i=i+1) //Can be statically unrolled
      my_memory[i] = 8'h00 ;
  end
endmodule

Si se usa como banco de flip-flops con async-reset:

module  memory(
  input clk,
  input rst_n,
  input [7:0] addr_wr,
  input [7:0] data_wr
);
  reg [7:0] my_memory [0:255];
  integer i;

  always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
      for( i=0; i<256; i=i+1) //Can be statically unrolled
        my_memory[i]  <= 8'h00 ;
    end
    else begin
      my_memory[addr_wr] <= data_wr ;
    end
  end
endmodule
    
respondido por el pre_randomize

Lea otras preguntas en las etiquetas