[Cache] ICache fix bug

This commit is contained in:
Paul Pan 2021-07-10 22:38:29 +08:00
parent e5dfdd27b5
commit d4521234b4
5 changed files with 96 additions and 54 deletions

View File

@ -18,10 +18,6 @@ module AXI (
AXIStatus_t status, nextStatus; AXIStatus_t status, nextStatus;
initial begin
status = ASIdle;
end
/* /*
----- ICache ----- ----- ICache -----
ReadAddr: ReadAddr:
@ -42,7 +38,7 @@ module AXI (
=> arvalid = address and control information valid => arvalid = address and control information valid
=> rready = master ready => rready = master ready
ReadData: ReadData:
*/ */
logic [31:0] IReadAddr; logic [31:0] IReadAddr;
@ -68,11 +64,12 @@ module AXI (
ICacheLineHelper[IRespCounter] <= AXIRead.AXIReadData.rdata; ICacheLineHelper[IRespCounter] <= AXIRead.AXIReadData.rdata;
IRespCounter <= IRespCounter + 1; IRespCounter <= IRespCounter + 1;
end end
end else IRespCounter <= 0; // avoid latch -> reset zero when not used end else IRespCounter <= 0; // avoid latch -> reset zero when not used
end end
// read status switch // read status switch
always_comb begin always_comb begin
IReadAllowReq = 1'b1;
IReadAddr = 32'b0; IReadAddr = 32'b0;
IReadReqPending = 1'b0; IReadReqPending = 1'b0;
nextStatus = status; nextStatus = status;
@ -94,6 +91,7 @@ module AXI (
// 处理ICache读过程 // 处理ICache读过程
ASReadInst: begin ASReadInst: begin
IReadAllowReq = 1'b0;
if (IReadRespOK) begin if (IReadRespOK) begin
// 不和ICache握手, 直接返回 // 不和ICache握手, 直接返回
nextStatus = ASIdle; nextStatus = ASIdle;

View File

@ -57,7 +57,7 @@ module ICache (
wire [`IC_DATA_LENGTH-1:0] cacheLine1; // Cache Line wire [`IC_DATA_LENGTH-1:0] cacheLine1; // Cache Line
wire [31:0] cacheLineData1[4]; // tmp: Map Cache Line into 4 Cache Data wire [31:0] cacheLineData1[4]; // tmp: Map Cache Line into 4 Cache Data
logic cacheMiss; wire cacheMiss;
// Miss // Miss
wire req2; wire req2;
@ -122,34 +122,12 @@ module ICache (
.q (wen0) .q (wen0)
); );
ffenr #(637) pipelineReg1 ( ffenr #(33) pipelineReg1 (
.clk(clk), .clk(clk),
.rst(rst | wen0), .rst(rst | wen0),
.en(~cacheMiss), .en (~cacheMiss),
.d({ .d ({sram.addr, req0}),
sram.addr, .q ({PC1, req1})
TagRAM0.rdata,
TagRAM1.rdata,
TagRAM2.rdata,
TagRAM3.rdata,
DataRAM0.rdata,
DataRAM1.rdata,
DataRAM2.rdata,
DataRAM3.rdata,
req0
}),
.q({
PC1, // sram.addr
tagOut1[0], // TagRAM
tagOut1[1],
tagOut1[2],
tagOut1[3],
dataOut1[0], // DataRAM
dataOut1[1],
dataOut1[2],
dataOut1[3],
req1 // req
})
); );
// ============================== // ==============================
@ -165,10 +143,10 @@ module ICache (
assign hitWay1[3] = tagOut1[3][0] & tagOut1[3][`IC_TAG_LENGTH-1:1] == tag1; assign hitWay1[3] = tagOut1[3][0] & tagOut1[3][`IC_TAG_LENGTH-1:1] == tag1;
assign hit1 = hitWay1[0] | hitWay1[1] | hitWay1[2] | hitWay1[3]; assign hit1 = hitWay1[0] | hitWay1[1] | hitWay1[2] | hitWay1[3];
assign cacheLine1 = (hitWay1[0] ? dataOut1 : `IC_DATA_LENGTH'b0) | assign cacheLine1 = (hitWay1[0] ? dataOut1[0] : `IC_DATA_LENGTH'b0) |
(hitWay1[1] ? dataOut1 : `IC_DATA_LENGTH'b0) | (hitWay1[1] ? dataOut1[1] : `IC_DATA_LENGTH'b0) |
(hitWay1[2] ? dataOut1 : `IC_DATA_LENGTH'b0) | (hitWay1[2] ? dataOut1[2] : `IC_DATA_LENGTH'b0) |
(hitWay1[3] ? dataOut1 : `IC_DATA_LENGTH'b0); (hitWay1[3] ? dataOut1[3] : `IC_DATA_LENGTH'b0);
assign cacheLineData1[0] = cacheLine1[31:0]; assign cacheLineData1[0] = cacheLine1[31:0];
assign cacheLineData1[1] = cacheLine1[63:32]; assign cacheLineData1[1] = cacheLine1[63:32];
@ -176,10 +154,7 @@ module ICache (
assign cacheLineData1[3] = cacheLine1[127:96]; assign cacheLineData1[3] = cacheLine1[127:96];
// Cache Miss // Cache Miss
always_ff @(posedge clk) begin assign cacheMiss = ~hit1 & ~wen0 & req1;
if (rst) cacheMiss <= 1'b0;
else cacheMiss <= ~hit1 & ~wen0;
end
// SRAM // SRAM
// Lookup + Replace // Lookup + Replace
@ -236,9 +211,9 @@ module ICache (
ffenr #(37) pipelineReg2 ( ffenr #(37) pipelineReg2 (
.clk(clk), .clk(clk),
.rst(rst), .rst(rst),
.en (AXIBlocker == Idle), .en ((AXIBlocker == Idle) & AXIReq.allowin), // TODO: 这里需要重新设计一下: AXI是否流水
.d ({PC1, hitWay1, cacheMiss}), .d({PC1, hitWay1, cacheMiss}),
.q ({PC2, hitWay2, req2}) // TODO: Req2的逻辑可能有误 .q({PC2, hitWay2, req2}) // TODO: Req2的逻辑可能有误
); );
// ============================== // ==============================
@ -246,25 +221,28 @@ module ICache (
// ============================== // ==============================
assign hit2 = hitWay2[0] | hitWay2[1] | hitWay2[2] | hitWay2[3]; assign hit2 = hitWay2[0] | hitWay2[1] | hitWay2[2] | hitWay2[3];
assign AXIReq.readygo = AXIReq.allowin & ~hit2 & req2; assign AXIReq.readygo = ~hit2 & req2;
assign ICacheAddress = {PC2[31:4], 4'b0}; assign ICacheAddress = {PC2[31:4], 4'b0};
always_ff @(posedge clk) begin always_comb begin
casez (AXIBlocker) casez (AXIBlocker)
Idle: begin Idle: begin
if (req2) nextAXIBlocker <= Wait; if (req2) nextAXIBlocker = Wait;
else nextAXIBlocker <= AXIBlocker; else nextAXIBlocker = AXIBlocker;
end end
Wait: begin Wait: begin
if (ICacheLineOK) nextAXIBlocker <= Idle; if (ICacheLineOK) nextAXIBlocker = Idle;
else nextAXIBlocker <= AXIBlocker; else nextAXIBlocker = AXIBlocker;
end end
default: begin default: begin
nextAXIBlocker <= AXIBlocker; nextAXIBlocker = Idle;
end end
endcase endcase
end
AXIBlocker <= nextAXIBlocker; always_ff @(posedge clk) begin
if (rst) AXIBlocker <= Idle;
else AXIBlocker <= nextAXIBlocker;
end end
// ============================== // ==============================

View File

@ -244,7 +244,7 @@
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.PREFHDL">VERILOG</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.PREFHDL">VERILOG</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SILICON_REVISION"/> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SILICON_REVISION"/>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SIMULATOR_LANGUAGE">MIXED</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SIMULATOR_LANGUAGE">MIXED</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SPEEDGRADE">-1</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SPEEDGRADE">-2</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.STATIC_POWER"/> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.STATIC_POWER"/>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.TEMPERATURE_GRADE"/> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.TEMPERATURE_GRADE"/>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.USE_RDI_CUSTOMIZATION">TRUE</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.USE_RDI_CUSTOMIZATION">TRUE</spirit:configurableElementValue>

View File

@ -244,7 +244,7 @@
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.PREFHDL">VERILOG</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.PREFHDL">VERILOG</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SILICON_REVISION"/> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SILICON_REVISION"/>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SIMULATOR_LANGUAGE">MIXED</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SIMULATOR_LANGUAGE">MIXED</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SPEEDGRADE">-1</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.SPEEDGRADE">-2</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.STATIC_POWER"/> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.STATIC_POWER"/>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.TEMPERATURE_GRADE"/> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.TEMPERATURE_GRADE"/>
<spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.USE_RDI_CUSTOMIZATION">TRUE</spirit:configurableElementValue> <spirit:configurableElementValue spirit:referenceId="PROJECT_PARAM.USE_RDI_CUSTOMIZATION">TRUE</spirit:configurableElementValue>

66
src/testbench/tmp.coe Normal file
View File

@ -0,0 +1,66 @@
memory_initialization_radix=16;
memory_initialization_vector=
00000000,
00000001,
00000002,
00000003,
00000004,
00000005,
00000006,
00000007,
00000008,
00000009,
0000000A,
0000000B,
0000000C,
0000000D,
0000000E,
0000000F,
00000010,
00000011,
00000012,
00000013,
00000014,
00000015,
00000016,
00000017,
00000018,
00000019,
0000001A,
0000001B,
0000001C,
0000001D,
0000001E,
0000001F,
00000020,
00000021,
00000022,
00000023,
00000024,
00000025,
00000026,
00000027,
00000028,
00000029,
0000002A,
0000002B,
0000002C,
0000002D,
0000002E,
0000002F,
00000030,
00000031,
00000032,
00000033,
00000034,
00000035,
00000036,
00000037,
00000038,
00000039,
0000003A,
0000003B,
0000003C,
0000003D,
0000003E,
0000003F;