从寄存器文件(解压缩数组)中检索数据

Retrieving Data from Register File (Unpacked Array)

我尝试编写一个寄存器文件来从中更新和检索数据。这是我的代码

module RegisterFile(input logic         clk
                   ,input logic         M_we // M_we is write enabled
                   ,input logic         M_re // M_re is read enabled
                   ,input logic [2:0]   M_add // Memory Adress
                   ,input logic [3:0]   M_wd // Memory write data
                   ,output logic [3:0]  M_rd  // Memory read data
                   ,output logic [3:0] rfOut [15:0]);
    
    logic [3:0] rf [7:0]; // There will be seven slot on the register file
    logic [3:0] readData;
    
    always_ff@(posedge clk) begin
        if(M_we) begin
            rf[M_add] <= M_wd;
        end
        
        else if(M_re) begin
            readData <= rf[M_add];
        end                                             
    end
    
    assign M_rd = readData;
    
                           
endmodule

寄存器文件上有七个槽,每个槽可容纳 4 位数据。我认为必须有两个信号来决定寄存器文件是读操作还是写操作。对于写作,我使用了M_we,对于阅读,我使用了M_re。然后我写了这个testbench。

module RegisterFile_Simulation();

    logic clk;
    logic M_we;
    logic M_re;
    logic [2:0] M_add;
    logic [3:0] M_wd;
    logic [3:0] M_rd;
    logic [3:0] rfOut [15:0];
    
    RegisterFile DUT(clk, M_we, M_re, M_add, M_wd, M_rd, rfOut);
    
    always begin
        clk = 0;
        #10;
        clk = 1;
        #10;
    end
    
    initial begin
        M_we = 1;
        M_re = 1;
        
        M_add = 0;
        M_wd = 1;
        #10;
        M_we = 0;
        
        for(int b = 0; b < 8; b++) begin
            M_add = b;
            #10;
        end
    end

endmodule

在此测试台中,我希望在 rf[0] 处看到 1,因为 M_add 在 0 的第一次迭代中将为 0。另一方面,我只得到 xxxx结果,这意味着它是未定义的。我认为我的测试台是错误的,但它也不适用于其他测试台。为什么这个代码块不能设置 rf[0] = 1 ?

您在测试台中存在竞争条件。设计 (RegisterFile) 不会将 M_we 信号采样为 1。

您应该像在设计中驱动信号一样在测试台中驱动同步输入:使用 @(posedge clk) 并使用非阻塞分配 (<=):

initial begin
    M_we = 1;
    M_re = 1;        
    M_add = 0;
    M_wd = 1;

    @(posedge clk);
    M_we <= 0;
    
    for(int b = 0; b < 8; b++) begin
        @(posedge clk);
        M_add <= b;
    end
end