流水线处理器的内存模块

时间:2018-06-18 01:25:05

标签: verilog

我想使用5阶段管道实现处理器:

1) Fetch
2) Decode/Register Read
3) Execute/Addr Generation
4) Memory Read/Write
5) Write-back

我的问题是Fetch和Memory阶段都访问内存(Fetch获取MEM[PC]处的指令)。我可以有单独的指令和数据存储器,但我觉得这会使实现中断/异常更难。我可以停止管道以防止两者同时访问内存,但这非常低效。

当我们必须模拟它(在C中)时我们所做的是假装有一个内存但是有一个单独的数据和指令缓存。在缓存未命中的情况下,我们停止了管道。我想我可以在Verilog中做到这一点,但实现缓存似乎很难。

我想到的是实现一个2端口内存模块。 PC将永久连接到一个端口,另一个端口(将是读/写)将用于存储器阶段。

这是我对这种内存模块的Verilog实现(我使内存同步,以便合成以利用块ram):

module Memory(
    input clk,
    input [15:0] addr1,
    input [15:0] addr2,
    input en,
    input weLow,
    input weHi,
    input [15:0] dataIn,
    output reg [15:0] dataOut1,
    output reg [15:0] dataOut2
    );

    reg [7:0] hiBytes [0:32767];
    reg [7:0] lowBytes [0:32767];

    wire [14:0] waddr1 = addr1[15:1];
    wire [14:0] waddr2 = addr2[15:1];

    // Read both ports
    always @(posedge clk) begin
        if (en == 1) begin
            dataOut1 <= {hiBytes[waddr1], lowBytes[waddr1]};
            dataOut2 <= {hiBytes[waddr2], lowBytes[waddr2]};
        end
        else begin
            dataOut1 <= 16'b0;
            dataOut1 <= 16'b0;
        end
    end

    // Write port 2
    always @(posedge clk) begin
        if (en == 1) begin
            if (weLow == 1) begin
                lowBytes[waddr2] <= dataIn[7:0];
            end
            if (weHi == 1) begin
                hiBytes[waddr2] <= dataIn[15:8];
            end  
        end
    end
endmodule

这可以合成吗?它还能解决管道失速问题吗?

0 个答案:

没有答案