Leyendo datos del archivo de registro en el sistema verilog

1

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.

    
pregunta Nick Borisenko

1 respuesta

0

Recibo una advertencia de compilación:

  

el cable implícito no tiene fanin (test_partC.clock)

Debes conectar la señal clk a la instancia de diseño en tu banco de pruebas:

register_file dut (clk, write_enable, write_reg, data_in, read_reg0, read_reg1, data_out0, data_out1);

Cuando ejecuto la simulación, veo valores distintos de cero en sus salidas.

    
respondido por el toolic

Lea otras preguntas en las etiquetas