我想使用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
这可以合成吗?它还能解决管道失速问题吗?