Estoy creando un archivo de registro simple en el sistema verilog, con un total de 6 registros en los que se puede escribir / leer. Cuando ejecuto una simulación en ModelSim, la salida nunca muestra los datos correctos: permanece en 0
e ignora cualquier señal de lectura. Esto me llevó a creer que o bien a) los valores que estoy escribiendo en los registros pueden no estar almacenados, por lo que cuando intento leer un valor de uno de los registros, no emiten nada, o b) los datos están siendo escrito en los registros, pero no estoy extrayendo los datos de esos registros correctamente.
Aquí está mi archivo .sv:
module register_file#(parameter bits = 16, registers = 6)(clock, write_enable, write_reg, data_in, read_reg0, read_reg1, data_out0, data_out1);
input clock, write_enable;
input [2:0] write_reg, read_reg0, read_reg1;
input [bits-1:0] data_in;
output [bits-1:0] data_out0, data_out1;
wire [bits-1:0] data_out0_wire, data_out1_wire;
reg [bits-1:0] data_out0_reg, data_out1_reg;
reg [bits-1:0] r1, r2, r3, r4, r5, r6;
assign data_out0 = data_out0_reg;
assign data_out1 = data_out1_reg;
always @(posedge clock)
begin
if(write_enable)
case(write_reg)
1: r1 = data_in;
2: r2 = data_in;
3: r3 = data_in;
4: r4 = data_in;
5: r5 = data_in;
6: r6 = data_in;
endcase
data_out0_reg <= data_out0_wire;
data_out1_reg <= data_out1_wire;
end
always @(read_reg0)
case(read_reg0)
1: data_out0_wire = r1;
2: data_out0_wire = r2;
3: data_out0_wire = r3;
4: data_out0_wire = r4;
5: data_out0_wire = r5;
6: data_out0_wire = r6;
endcase
always @(read_reg1)
case(read_reg1)
1: data_out1_wire = r1;
2: data_out1_wire = r2;
3: data_out1_wire = r3;
4: data_out1_wire = r4;
5: data_out1_wire = r5;
6: data_out1_wire = r6;
endcase
endmodule
Editar Y aquí está mi banco de pruebas:
'timescale 1ns / 1ps
module test_partC();
reg clk,write_enable;
reg [2:0] write_reg, read_reg0, read_reg1;
reg [15:0] data_in;
reg [15:0] data_out0, data_out1;
register_file dut (clock, write_enable, write_reg, data_in, read_reg0, read_reg1, data_out0, data_out1);
// Toggle the clock every 10 ns
initial
begin
clk = 0;
forever #10 clk = !clk;
end
initial
begin
write_reg = 1;
write_enable = 1;
data_in = 10;
#20;
write_reg = 2;
write_enable = 1;
data_in = 15;
#20;
write_reg = 3;
write_enable = 1;
data_in = 20;
#20;
read_reg0 = 1;
write_enable = 0;
#20;
read_reg0 = 2;
read_reg1 = 3;
#20;
read_reg0 = 1;
write_reg = 1;
write_enable = 1;
data_in = 30;
end
endmodule
Agregué un conjunto adicional de registros de las señales de data_out al intentar encontrar una solución potencial al problema que estoy teniendo, pero no estoy seguro de si eso cambia algo.
Lo que intentaba hacer era, basado en el número de la señal read_reg, leer el valor del registro correspondiente, que envía la señal por el data_out_wire, la almacena en un registro de data_out y luego envía la señal a través de un cable (salida de datos_out).
Soy nuevo en verilog del sistema y estoy luchando para descubrir en qué me equivoqué, cualquier ayuda es muy apreciada.