usando la creación de instancias verilog de ram

2

He implementado el módulo ram Verilog. Hice una instanciación y leí los datos de alguna dirección. Después de eso, quiero escribir los datos en otra dirección. miradas que no necesito hacer dos veces la creación de instancias del ram, ya que cada ram define una matriz de registros diferente. La pregunta es cómo (¿debería yo?) reutilizar la misma instancia del ram?

module ram(we,addr,data);

input we;
input[DATA_WIDTH - 1:0] addr,
inout[DATA_WIDTH - 1:0] data;

reg [DATA_WIDTH - 1:0] mem[0:ADDR_DEPTH - 1];
always @ ( posedge clk )
begin
if(we)
mem[addr] <= data;
else
data <= mem[addr];
end
endmodule

module top (add1,add2);
wire [DATA_WIDTH - 1:0] w_data;
ram i_ram1(1b'0,add1,w_data);
ram i_ram2(1b'1,add2,w_data);//<- other mem array is used in this instance
    
pregunta Yakov

2 respuestas

1

Necesitará usar el reloj para dividir las operaciones de escritura y lectura. Aquí hay un ejemplo de un banco de pruebas que escribe datos en dos direcciones y luego los vuelve a leer.

wire [DATA_WIDTH-1:0] data = we ? wdata : {DATA_WIDTH{1'bz}}; // tri-state write output driver
ram i_ram0(clk,we,addr,data);

initial begin
  clk   = 1'b1;
  data1 = 'h0F;
  data2 = 'hF0;
  addr1 = 0;
  addr2 = 2;
  we    = 1'b1;
  addr  = addr1;
  wdata = data1;
  @(posedge clk) #1;
  addr  = addr2;
  wdata = data2;
  @(posedge clk) #1;
  we    = 1'b0;
  addr  = addr1;
  @(posedge clk) #1;
  if(data !== data1) $display("ERROR data:%h != data1:%h @ addr:%h", data,data1,addr);
  addr  = addr2;
  @(posedge clk) #1;
  if(data !== data2) $display("ERROR data:%h != data2:%h @ addr:%h", data,data2,addr);
  @(posedge clk) #1;
  $finish;
end

FLY si data es un inout , entonces necesitas un controlador tri-state en tu módulo ram:

assign data = we ? {DATA_WIDTH{1'bz}} : rdata; // tri-state read output driver

Ejemplo completo de trabajo aquí: enlace

    
respondido por el Greg
0

Ha creado dos instancias de ram, les ha dado dos nombres distintos, ha conectado uno de sus puertos de habilitación de escritura a cero y el otro a 1. Esto le dará dos rams, uno de los cuales siempre se está escribiendo y uno de los cuales Siempre se está leyendo desde.

¿Estás tratando de ejecutar una simulación? Qué simulador estás usando, te ayudaremos a superarlo.

    
respondido por el trayres

Lea otras preguntas en las etiquetas