diff --git a/src/AXI/AXI.sv b/src/AXI/AXI.sv index 51db0e5..f3cac84 100644 --- a/src/AXI/AXI.sv +++ b/src/AXI/AXI.sv @@ -73,14 +73,14 @@ module AXI ( AXIRead.AXIReadAddr.arid = 4'b0001; AXIRead.AXIReadAddr.arprot = 3'b001; AXIRead.AXIReadAddr.araddr = rdata.addr; - AXIRead.AXIReadAddr.arlen = {2'b0, rdata.size}; + AXIRead.AXIReadAddr.arlen = {1'b0, rdata.size}; rdata.addr_ok = 1'b1; inst.addr_ok = 1'b0; end else if (inst.req) begin AXIRead.AXIReadAddr.arid = 4'b0000; AXIRead.AXIReadAddr.arprot = 3'b101; AXIRead.AXIReadAddr.araddr = inst.addr; - AXIRead.AXIReadAddr.arlen = {2'b0, inst.size}; + AXIRead.AXIReadAddr.arlen = {1'b0, inst.size}; inst.addr_ok = 1'b1; rdata.addr_ok = 1'b0; end else begin diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index 63d1ac7..182e11a 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -27,7 +27,7 @@ module DCache ( DCTagRAM_t TagRAM0, TagRAM1, TagRAM2, TagRAM3; DCDataRAM_t DataRAM0, DataRAM1, DataRAM2, DataRAM3; - logic [3:0] LRU[64]; + logic [3:0] LRU[128]; logic [3:0] nextLRU; logic [3:0] nowLRU; @@ -37,8 +37,8 @@ module DCache ( logic valid; word_t addr; - logic [21:0] tag; - logic [5:0] index; + logic [32-`DC_TAGL-1:0] tag; + logic [`DC_TAGL-`DC_INDEXL-1:0] index; logic hit; logic [3:0] hitWay; @@ -50,7 +50,7 @@ module DCache ( logic en1, en2; // en1: Lookup->Lookup, en2: Lookup->Rep - logic [5:0] baddr; + logic [`DC_TAGL-`DC_INDEXL-1:0] baddr; logic bwe1, bwe2; // bwe1: Lookup -> Write, bwe2: Replace -> Lookup DCData_t wdata1[4], wdata2[4]; @@ -83,11 +83,7 @@ module DCache ( // ======== State Machine ======== // =============================== - enum bit { - LOOKUP, - REPLACE - } - state, nextState; + enum bit { LOOKUP, REPLACE } state, nextState; always_ff @(posedge clk) begin if (rst) state <= LOOKUP; @@ -143,8 +139,8 @@ module DCache ( assign tagV[3] = tagOut[3].valid; // Hit Check - assign tag = addr[31:10]; - assign index = addr[9:4]; + assign tag = addr[31:`DC_TAGL]; + assign index = addr[`DC_TAGL-1:`DC_INDEXL]; assign hitWay[0] = tagV[0] & tagOut[0].tag == tag; assign hitWay[1] = tagV[1] & tagOut[1].tag == tag; @@ -225,9 +221,9 @@ module DCache ( // ========= Block RAM ========== // ============================== - mux2 #(6) index_mux ( + mux2 #(`DC_TAGL-`DC_INDEXL) index_mux ( index, - port.addr[9:4], + port.addr[`DC_TAGL-1:`DC_INDEXL], en1, baddr ); @@ -655,28 +651,28 @@ module DCache ( end end - cache_tagd_bram tag_ram0 ( + DCTag_bram tag_ram0 ( .addra(TagRAM0.addr), .clka (clk), .dina (TagRAM0.wdata), .douta(TagRAM0.rdata), .wea (TagRAM0.wen) ); - cache_tagd_bram tag_ram1 ( + DCTag_bram tag_ram1 ( .addra(TagRAM1.addr), .clka (clk), .dina (TagRAM1.wdata), .douta(TagRAM1.rdata), .wea (TagRAM1.wen) ); - cache_tagd_bram tag_ram2 ( + DCTag_bram tag_ram2 ( .addra(TagRAM2.addr), .clka (clk), .dina (TagRAM2.wdata), .douta(TagRAM2.rdata), .wea (TagRAM2.wen) ); - cache_tagd_bram tag_ram3 ( + DCTag_bram tag_ram3 ( .addra(TagRAM3.addr), .clka (clk), .dina (TagRAM3.wdata), @@ -684,28 +680,28 @@ module DCache ( .wea (TagRAM3.wen) ); - cache_data_bram data_ram0 ( + DCData_bram data_ram0 ( .addra(DataRAM0.addr), .clka (clk), .dina (DataRAM0.wdata), .douta(DataRAM0.rdata), .wea (DataRAM0.wen) ); - cache_data_bram data_ram1 ( + DCData_bram data_ram1 ( .addra(DataRAM1.addr), .clka (clk), .dina (DataRAM1.wdata), .douta(DataRAM1.rdata), .wea (DataRAM1.wen) ); - cache_data_bram data_ram2 ( + DCData_bram data_ram2 ( .addra(DataRAM2.addr), .clka (clk), .dina (DataRAM2.wdata), .douta(DataRAM2.rdata), .wea (DataRAM2.wen) ); - cache_data_bram data_ram3 ( + DCData_bram data_ram3 ( .addra(DataRAM3.addr), .clka (clk), .dina (DataRAM3.wdata), diff --git a/src/Cache/ICache.sv b/src/Cache/ICache.sv index 45d8ebc..1e14b58 100644 --- a/src/Cache/ICache.sv +++ b/src/Cache/ICache.sv @@ -11,7 +11,7 @@ module ICache ( // ============================== // ============ Vars ============ // ============================== - + // Four way assoc bram controller: ICTagRAM_t TagRAM0, TagRAM1, TagRAM2, TagRAM3; ICDataRAM_t DataRAM0, DataRAM1, DataRAM2, DataRAM3; @@ -20,26 +20,26 @@ module ICache ( logic [3:0] nextLRU; logic [3:0] nowLRU; - logic [`IC_TAG_LENGTH-1:0] tagOut[4]; - IC_data_t dataOut[4]; + ICTag_t tagOut[4]; + ICData_t dataOut[4]; logic [3:0] tagV; logic valid; word_t addr; - logic [21:0] tag; - logic [5:0] index; + logic [32-`IC_TAGL-1:0] tag; + logic [`IC_TAGL-`IC_INDEXL-1:0] index; logic hit; logic [3:0] hitWay; - IC_data_t cacheLine; + ICData_t cacheLine; - logic [1:0] victim; + logic [3:0] victim; logic [3:0] wen; logic [3:0] replaceWen; logic en1, en2; // en1: Lookup->Lookup, en2: Lookup->Rep - logic [5:0] baddr; + logic [`IC_TAGL-`IC_INDEXL-1:0] baddr; logic bwe; // =========================== @@ -55,12 +55,12 @@ module ICache ( // =============================== enum bit { LOOKUP = 1'b0, REPLACE = 1'b1 } state; - + always_ff @(posedge clk) begin if(rst) state <= LOOKUP; else if(state == LOOKUP & valid & ~hit) state <= REPLACE; - else if(state == REPLACE & port.wvalid) + else if(state == REPLACE & port.rvalid) state <= LOOKUP; end @@ -82,19 +82,19 @@ module ICache ( assign dataOut[2] = DataRAM2.rdata; assign dataOut[3] = DataRAM3.rdata; - assign tagV[0] = tagOut[0][0]; - assign tagV[1] = tagOut[1][0]; - assign tagV[2] = tagOut[2][0]; - assign tagV[3] = tagOut[3][0]; + assign tagV[0] = tagOut[0].valid; + assign tagV[1] = tagOut[1].valid; + assign tagV[2] = tagOut[2].valid; + assign tagV[3] = tagOut[3].valid; // Hit Check - assign tag = addr[31:10]; - assign index = addr[9:4]; + assign tag = addr[31:`IC_TAGL]; + assign index = addr[`IC_TAGL-1:`IC_INDEXL]; - assign hitWay[0] = tagV[0] & tagOut[0][`IC_TAG_LENGTH-1:1] == tag; - assign hitWay[1] = tagV[1] & tagOut[1][`IC_TAG_LENGTH-1:1] == tag; - assign hitWay[2] = tagV[2] & tagOut[2][`IC_TAG_LENGTH-1:1] == tag; - assign hitWay[3] = tagV[3] & tagOut[3][`IC_TAG_LENGTH-1:1] == tag; + assign hitWay[0] = tagV[0] & tagOut[0].tag == tag; + assign hitWay[1] = tagV[1] & tagOut[1].tag == tag; + assign hitWay[2] = tagV[2] & tagOut[2].tag == tag; + assign hitWay[3] = tagV[3] & tagOut[3].tag == tag; assign hit = hitWay[0] | hitWay[1] | hitWay[2] | hitWay[3]; assign cacheLine = (hitWay[0] ? dataOut[0] : `IC_DATA_LENGTH'b0) @@ -112,71 +112,40 @@ module ICache ( // ============================== // Choose Victim - assign victim = tagV[0] == 0 ? 2'b00 : - tagV[1] == 0 ? 2'b01 : - tagV[2] == 0 ? 2'b10 : - tagV[3] == 0 ? 2'b11 : - nowLRU[0] == 0 ? 2'b00 : - nowLRU[1] == 0 ? 2'b01 : - nowLRU[2] == 0 ? 2'b10 : - nowLRU[3] == 0 ? 2'b11 : - 2'b11; - assign wen[0] = (victim == 0); - assign wen[1] = (victim == 1); - assign wen[2] = (victim == 2); - assign wen[3] = (victim == 3); + assign victim = tagV[0] == 0 ? 4'b0001 : + tagV[1] == 0 ? 4'b0010 : + tagV[2] == 0 ? 4'b0100 : + tagV[3] == 0 ? 4'b1000 : + nowLRU[0] == 0 ? 4'b0001 : + nowLRU[1] == 0 ? 4'b0010 : + nowLRU[2] == 0 ? 4'b0100 : + 4'b1000; + assign wen = hit ? hitWay : victim; // Update LRU always_comb begin nextLRU = nowLRU; - // Hit - - if (hitWay[0]) begin + if (wen[0]) casez (nowLRU) 4'b111?: nextLRU = 4'b0001; default: nextLRU[0] = 1'b1; endcase - end else if (hitWay[1]) begin + if (wen[1]) casez (nowLRU) 4'b11?1: nextLRU = 4'b0010; default: nextLRU[1] = 1'b1; endcase - end else if (hitWay[2]) begin + if (wen[2]) casez (nowLRU) 4'b1?11: nextLRU = 4'b0100; default: nextLRU[2] = 1'b1; endcase - end else if (hitWay[3]) begin + if (wen[3]) casez (nowLRU) 4'b?111: nextLRU = 4'b1000; default: nextLRU[3] = 1'b1; endcase - end - - // Not Hit - - else if (wen[0]) begin - casez (nowLRU) - 4'b111?: nextLRU = 4'b0001; - default: nextLRU[0] = 1'b1; - endcase - end else if (wen[1]) begin - casez (nowLRU) - 4'b11?1: nextLRU = 4'b0010; - default: nextLRU[1] = 1'b1; - endcase - end else if (wen[2]) begin - casez (nowLRU) - 4'b1?11: nextLRU = 4'b0100; - default: nextLRU[2] = 1'b1; - endcase - end else if (wen[3]) begin - casez (nowLRU) - 4'b?111: nextLRU = 4'b1000; - default: nextLRU[3] = 1'b1; - endcase - end end always_ff @(posedge clk) begin @@ -190,8 +159,13 @@ module ICache ( // ========= Block RAM ========== // ============================== - mux2#(6) index_mux(index, port.addr[9:4], en1, baddr); - assign bwe = (state == REPLACE) & port.wvalid; + mux2 #(`IC_TAGL-`IC_INDEXL) index_mux ( + index, + port.addr[`IC_TAGL-1:`IC_INDEXL], + en1, + baddr + ); + assign bwe = (state == REPLACE) & port.rvalid; // 地址 assign TagRAM0.addr = baddr; @@ -216,33 +190,33 @@ module ICache ( assign TagRAM1.wdata = {tag, 1'b1}; assign TagRAM2.wdata = {tag, 1'b1}; assign TagRAM3.wdata = {tag, 1'b1}; - assign DataRAM0.wdata = port.wdata; - assign DataRAM1.wdata = port.wdata; - assign DataRAM2.wdata = port.wdata; - assign DataRAM3.wdata = port.wdata; + assign DataRAM0.wdata = port.rdata; + assign DataRAM1.wdata = port.rdata; + assign DataRAM2.wdata = port.rdata; + assign DataRAM3.wdata = port.rdata; - cache_tag_bram tag_ram0 ( + ICTag_bram tag_ram0 ( .addra(TagRAM0.addr), .clka (clk), .dina (TagRAM0.wdata), .douta(TagRAM0.rdata), .wea (TagRAM0.wen) ); - cache_tag_bram tag_ram1 ( + ICTag_bram tag_ram1 ( .addra(TagRAM1.addr), .clka (clk), .dina (TagRAM1.wdata), .douta(TagRAM1.rdata), .wea (TagRAM1.wen) ); - cache_tag_bram tag_ram2 ( + ICTag_bram tag_ram2 ( .addra(TagRAM2.addr), .clka (clk), .dina (TagRAM2.wdata), .douta(TagRAM2.rdata), .wea (TagRAM2.wen) ); - cache_tag_bram tag_ram3 ( + ICTag_bram tag_ram3 ( .addra(TagRAM3.addr), .clka (clk), .dina (TagRAM3.wdata), @@ -250,28 +224,28 @@ module ICache ( .wea (TagRAM3.wen) ); - cache_data_bram data_ram0 ( + ICData_bram data_ram0 ( .addra(DataRAM0.addr), .clka (clk), .dina (DataRAM0.wdata), .douta(DataRAM0.rdata), .wea (DataRAM0.wen) ); - cache_data_bram data_ram1 ( + ICData_bram data_ram1 ( .addra(DataRAM1.addr), .clka (clk), .dina (DataRAM1.wdata), .douta(DataRAM1.rdata), .wea (DataRAM1.wen) ); - cache_data_bram data_ram2 ( + ICData_bram data_ram2 ( .addra(DataRAM2.addr), .clka (clk), .dina (DataRAM2.wdata), .douta(DataRAM2.rdata), .wea (DataRAM2.wen) ); - cache_data_bram data_ram3 ( + ICData_bram data_ram3 ( .addra(DataRAM3.addr), .clka (clk), .dina (DataRAM3.wdata), diff --git a/src/IP/cache_data_bram/cache_data_bram.xci b/src/IP/DCData_bram/DCData_bram.xci similarity index 98% rename from src/IP/cache_data_bram/cache_data_bram.xci rename to src/IP/DCData_bram/DCData_bram.xci index d94bb28..901f86c 100644 --- a/src/IP/cache_data_bram/cache_data_bram.xci +++ b/src/IP/DCData_bram/DCData_bram.xci @@ -6,7 +6,7 @@ 1.0 - cache_data_bram + DCData_bram 4096 @@ -89,8 +89,8 @@ 0 0.000 0 - 6 - 6 + 7 + 7 1 4 0 @@ -130,15 +130,15 @@ 0 0 0 - cache_data_bram.mem + DCData_bram.mem no_coe_file_loaded 0 0 0 0 1 - 64 - 64 + 128 + 128 1 1 128 @@ -157,8 +157,8 @@ 0 1 1 - 64 - 64 + 128 + 128 WRITE_FIRST WRITE_FIRST 128 @@ -174,7 +174,7 @@ NONE no_coe_file_loaded ALL - cache_data_bram + DCData_bram false false false @@ -228,7 +228,7 @@ false false false - 64 + 128 128 128 No_ECC diff --git a/src/IP/cache_tag_bram/cache_tag_bram.xci b/src/IP/DCTag_bram/DCTag_bram.xci similarity index 98% rename from src/IP/cache_tag_bram/cache_tag_bram.xci rename to src/IP/DCTag_bram/DCTag_bram.xci index d76262f..782c2ad 100644 --- a/src/IP/cache_tag_bram/cache_tag_bram.xci +++ b/src/IP/DCTag_bram/DCTag_bram.xci @@ -6,7 +6,7 @@ 1.0 - cache_tag_bram + DCTag_bram 4096 @@ -89,8 +89,8 @@ 0 0.000 0 - 6 - 6 + 7 + 7 1 4 0 @@ -130,15 +130,15 @@ 0 0 0 - cache_tag_bram.mem + DCTag_bram.mem no_coe_file_loaded 0 0 0 0 1 - 64 - 64 + 128 + 128 1 1 23 @@ -157,8 +157,8 @@ 0 1 1 - 64 - 64 + 128 + 128 WRITE_FIRST WRITE_FIRST 23 @@ -174,7 +174,7 @@ NONE no_coe_file_loaded ALL - cache_tag_bram + DCTag_bram false false false @@ -228,7 +228,7 @@ false false false - 64 + 128 23 23 No_ECC diff --git a/src/IP/ICData_bram/ICData_bram.xci b/src/IP/ICData_bram/ICData_bram.xci new file mode 100644 index 0000000..3714074 --- /dev/null +++ b/src/IP/ICData_bram/ICData_bram.xci @@ -0,0 +1,311 @@ + + + xilinx.com + xci + unknown + 1.0 + + + ICData_bram + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + 100000000 + 0 + 0.000 + 0 + 6 + 6 + 1 + 4 + 0 + 1 + 9 + 0 + 0 + 4 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 26.8022 mW + artix7 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ICData_bram.mem + no_coe_file_loaded + 0 + 0 + 0 + 0 + 1 + 64 + 64 + 1 + 1 + 256 + 256 + 0 + 0 + CE + CE + ALL + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 64 + 64 + WRITE_FIRST + WRITE_FIRST + 256 + 256 + artix7 + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 9 + NONE + no_coe_file_loaded + ALL + ICData_bram + false + false + false + false + false + false + false + false + false + Always_Enabled + Always_Enabled + Single_Bit_Error_Injection + true + Native + false + no_mem_loaded + Single_Port_RAM + WRITE_FIRST + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 0 + 0 + 0 + 8kx2 + false + false + 1 + 1 + 256 + 256 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + false + false + false + false + false + false + 64 + 256 + 256 + No_ECC + false + false + false + Stand_Alone + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/IP/cache_tagd_bram/cache_tagd_bram.xci b/src/IP/ICTag_bram/ICTag_bram.xci similarity index 98% rename from src/IP/cache_tagd_bram/cache_tagd_bram.xci rename to src/IP/ICTag_bram/ICTag_bram.xci index 55b94ba..603ae22 100644 --- a/src/IP/cache_tagd_bram/cache_tagd_bram.xci +++ b/src/IP/ICTag_bram/ICTag_bram.xci @@ -6,7 +6,7 @@ 1.0 - cache_tagd_bram + ICTag_bram 4096 @@ -112,7 +112,7 @@ 0 0 0 - Estimated Power for IP : 3.20565 mW + Estimated Power for IP : 3.12245 mW artix7 0 0 @@ -130,7 +130,7 @@ 0 0 0 - cache_tagd_bram.mem + ICTag_bram.mem no_coe_file_loaded 0 0 @@ -141,8 +141,8 @@ 64 1 1 - 24 - 24 + 22 + 22 0 0 CE @@ -161,8 +161,8 @@ 64 WRITE_FIRST WRITE_FIRST - 24 - 24 + 22 + 22 artix7 4 Memory_Slave @@ -174,7 +174,7 @@ NONE no_coe_file_loaded ALL - cache_tagd_bram + ICTag_bram false false false @@ -209,8 +209,8 @@ false 1 1 - 24 - 24 + 22 + 22 false false false @@ -229,8 +229,8 @@ false false 64 - 24 - 24 + 22 + 22 No_ECC false false diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index a892ce3..718c175 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -34,19 +34,23 @@ module MMU ( logic iCached1; word_t iPA1; - word_t iD1, iD2, iD3; + word_t iD1, iD2, iD3, iD4, iD5, iD6, iD7; // ================================ // ======== iState Machine ======== // ================================ - typedef enum bit [2:0] { + typedef enum bit [3:0] { I_IDLE, I_WA, I_WD1, I_WD2, I_WD3, I_WD4, + I_WD5, + I_WD6, + I_WD7, + I_WD8, I_REFILL } istate_t; istate_t iState; @@ -98,6 +102,18 @@ module MMU ( if (inst_axi.rvalid) iNextState = I_WD4; end I_WD4: begin + if (inst_axi.rvalid) iNextState = I_WD5; + end + I_WD5: begin + if (inst_axi.rvalid) iNextState = I_WD6; + end + I_WD6: begin + if (inst_axi.rvalid) iNextState = I_WD7; + end + I_WD7: begin + if (inst_axi.rvalid) iNextState = I_WD8; + end + I_WD8: begin if (inst_axi.rvalid) iNextState = I_REFILL; end I_REFILL: begin @@ -149,6 +165,30 @@ module MMU ( iState == I_WD3, iD3 ); + ffen #(32) id4_ff ( + clk, + inst_axi.rdata, + iState == I_WD4, + iD4 + ); + ffen #(32) id5_ff ( + clk, + inst_axi.rdata, + iState == I_WD5, + iD5 + ); + ffen #(32) id6_ff ( + clk, + inst_axi.rdata, + iState == I_WD6, + iD6 + ); + ffen #(32) id7_ff ( + clk, + inst_axi.rdata, + iState == I_WD7, + iD7 + ); // =============================== // ========== iFunction ========== @@ -156,17 +196,31 @@ module MMU ( assign iVA = inst.addr; assign inst.addr_ok = iEn; - assign {inst.rdata1, inst.rdata0} = (iState == I_WD2) ? { - inst_axi.rdata, iD1 - } : iPA1[3] ? ic.row[127:64] : ic.row[63:0]; + mux5 #(64) inst_rdata_mux ( + ic.row[63:0], + ic.row[127:64], + ic.row[191:128], + ic.row[255:192], + {inst_axi.rdata, iD1}, + {iState == I_WD2, iPA1[4:3]}, + {inst.rdata1, inst.rdata0} + ); assign ic.valid = inst.req & iEn & iCached; assign ic.addr = iPA; - assign ic.wvalid = inst_axi.data_ok; - assign ic.wdata = iPA1[3] ? {iD2, iD1, inst_axi.rdata, iD3} : {inst_axi.rdata, iD3, iD2, iD1}; + assign ic.rvalid = inst_axi.data_ok; + + mux4 #(256) ic_rdata_mux ( + {inst_axi.rdata, iD7, iD6, iD5, iD4, iD3, iD2, iD1}, + {iD6, iD5, iD4, iD3, iD2, iD1, inst_axi.rdata, iD7}, + {iD4, iD3, iD2, iD1, inst_axi.rdata, iD7, iD6, iD5}, + {iD2, iD1, inst_axi.rdata, iD7, iD6, iD5, iD4, iD3}, + iPA1[4:3], + ic.rdata + ); assign inst_axi.addr = iPA1; - assign inst_axi.size = iCached1 ? 2'b11 : 2'b01; + assign inst_axi.size = iCached1 ? 3'b111 : 3'b001; // ====================== // ======== dVar ======== @@ -362,7 +416,7 @@ module MMU ( : {rdata_axi.rdata, drD3, drD2, drD1}); assign rdata_axi.addr = dPA1; - assign rdata_axi.size = dCached1 ? 2'b11 : 2'b00; + assign rdata_axi.size = dCached1 ? 3'b011 : 3'b000; // ================================= // ======== dwState Machine ======== @@ -577,10 +631,10 @@ module mapping ( always_comb begin if (addr_in > 32'hBFFF_FFFF || addr_in <= 32'h7FFF_FFFF) begin // kseg2 + kseg3 + kuseg? -> tlb addr_out = addr_in; - cached = 0; + cached = 1'b1; end else if (addr_in > 32'h9FFF_FFFF) begin // kseg1 uncached addr_out = addr_in & 32'h1FFF_FFFF; - cached = 0; + cached = 1'b0; end else begin // kseg0 -> CP0.K0 default: uncached addr_out = addr_in & 32'h1FFF_FFFF; cached = (K0 == 3'b011); diff --git a/src/include/DCache.svh b/src/include/DCache.svh index 6dc6295..22b35ec 100644 --- a/src/include/DCache.svh +++ b/src/include/DCache.svh @@ -4,31 +4,32 @@ `include "defines.svh" // DC for D-Cache - -`define DC_TAG_LENGTH 22+1+1 // Tag + Valid + Dirty +`define DC_TAGL 11 +`define DC_INDEXL 4 +`define DC_TAG_LENGTH (32-`DC_TAGL+1+1) // Tag + Valid + Dirty `define DC_DATA_LENGTH 128 // 16Bytes typedef struct packed { - logic [`DC_TAG_LENGTH-3:0] tag; - logic dirty; - logic valid; + logic [32-`DC_TAGL-1:0] tag; + logic dirty; + logic valid; } DCTag_t; typedef logic [`DC_DATA_LENGTH-1:0] DCData_t; typedef struct packed { - logic wen; - logic [5:0] addr; // Index - logic [`DC_TAG_LENGTH-1:0] wdata; - logic [`DC_TAG_LENGTH-1:0] rdata; -} DCTagRAM_t; // 64 * 24 + logic wen; + logic [`DC_TAGL-`DC_INDEXL-1:0] addr; // Index + DCTag_t wdata; + DCTag_t rdata; +} DCTagRAM_t; typedef struct packed { - logic wen; - logic [5:0] addr; // Index - DCData_t wdata; - DCData_t rdata; -} DCDataRAM_t; // 64 * 128 + logic wen; + logic [`DC_TAGL-`DC_INDEXL-1:0] addr; // Index + DCData_t wdata; + DCData_t rdata; +} DCDataRAM_t; interface DCache_i; logic valid; @@ -42,7 +43,7 @@ interface DCache_i; logic dirt_valid; word_t dirt_addr; DCData_t dirt_data; - logic [127:0] row; + DCData_t row; modport cache( input valid, addr, rvalid, rdata, wvalid, wdata, wstrb, diff --git a/src/include/ICache.svh b/src/include/ICache.svh index c67b8ae..50a2511 100644 --- a/src/include/ICache.svh +++ b/src/include/ICache.svh @@ -4,38 +4,41 @@ `include "defines.svh" // IC for I-Cache - -`define IC_TAG_LENGTH 22+1 // Tag + Valid -`define IC_DATA_LENGTH 128 // 16Bytes - -typedef logic [`IC_DATA_LENGTH-1:0] IC_data_t; - -// TODO: 考虑到指令4字节对齐,可否给TAG减少两位?Cache是否处理4字节对齐异常? +`define IC_TAGL 11 +`define IC_INDEXL 5 +`define IC_TAG_LENGTH (32-`IC_TAGL+1) // Tag + Valid +`define IC_DATA_LENGTH 256 // 32Bytes typedef struct packed { - logic wen; - logic [5:0] addr; // Index - logic [`IC_TAG_LENGTH-1:0] wdata; - logic [`IC_TAG_LENGTH-1:0] rdata; -} ICTagRAM_t; // 64 * 23 + logic [32-`IC_TAGL-1:0] tag; + logic valid; +} ICTag_t; +typedef logic [`IC_DATA_LENGTH-1:0] ICData_t; typedef struct packed { - logic wen; - logic [5:0] addr; // Index - IC_data_t wdata; - IC_data_t rdata; -} ICDataRAM_t; // 64 * 128 + logic wen; + logic [`IC_TAGL-`IC_INDEXL-1:0] addr; // Index + ICTag_t wdata; + ICTag_t rdata; +} ICTagRAM_t; + +typedef struct packed { + logic wen; + logic [`IC_TAGL-`IC_INDEXL-1:0] addr; // Index + ICData_t wdata; + ICData_t rdata; +} ICDataRAM_t; interface ICache_i; - logic valid; - word_t addr; - logic hit; - IC_data_t row; - logic wvalid; - IC_data_t wdata; + logic valid; + word_t addr; + logic hit; + ICData_t row; + logic rvalid; + ICData_t rdata; - modport cache(input valid, addr, output hit, row, input wvalid, wdata); - modport mmu(output valid, addr, input hit, row, output wvalid, wdata); + modport cache(input valid, addr, output hit, row, input rvalid, rdata); + modport mmu(output valid, addr, input hit, row, output rvalid, rdata); endinterface //ICache_i `endif diff --git a/src/include/sram.svh b/src/include/sram.svh index 985a339..6482440 100644 --- a/src/include/sram.svh +++ b/src/include/sram.svh @@ -36,7 +36,7 @@ endinterface interface SRAM_RO_AXI_i; logic req; word_t addr; - logic [1:0] size; + logic [2:0] size; logic addr_ok; logic data_ok; word_t rdata; diff --git a/src/testbench/happy/DCData_bram.sv b/src/testbench/happy/DCData_bram.sv new file mode 100644 index 0000000..1b2d56a --- /dev/null +++ b/src/testbench/happy/DCData_bram.sv @@ -0,0 +1,13 @@ +// Make Linter Happy + +`include "DCache.svh" +`include "sram.svh" + +module DCData_bram ( + input [`DC_TAGL-`DC_INDEXL-1:0] addra, + input clka, + input DCData_t dina, + output DCData_t douta, + input wea +); +endmodule diff --git a/src/testbench/happy/DCTag_bram.sv b/src/testbench/happy/DCTag_bram.sv new file mode 100644 index 0000000..fce8fa9 --- /dev/null +++ b/src/testbench/happy/DCTag_bram.sv @@ -0,0 +1,13 @@ +// Make Linter Happy + +`include "ICache.svh" +`include "sram.svh" + +module DCTag_bram ( + input [`DC_TAGL-`DC_INDEXL-1:0] addra, + input clka, + input DCTag_t dina, + output DCTag_t douta, + input wea +); +endmodule diff --git a/src/testbench/happy/ICData_bram.sv b/src/testbench/happy/ICData_bram.sv new file mode 100644 index 0000000..62f1d71 --- /dev/null +++ b/src/testbench/happy/ICData_bram.sv @@ -0,0 +1,13 @@ +// Make Linter Happy + +`include "ICache.svh" +`include "sram.svh" + +module ICData_bram ( + input [`IC_TAGL-`IC_INDEXL-1:0] addra, + input clka, + input ICData_t dina, + output ICData_t douta, + input wea +); +endmodule diff --git a/src/testbench/happy/ICTag_bram.sv b/src/testbench/happy/ICTag_bram.sv new file mode 100644 index 0000000..9597ba2 --- /dev/null +++ b/src/testbench/happy/ICTag_bram.sv @@ -0,0 +1,13 @@ +// Make Linter Happy + +`include "ICache.svh" +`include "sram.svh" + +module ICTag_bram ( + input [`IC_TAGL-`IC_INDEXL-1:0] addra, + input clka, + input ICTag_t dina, + output ICTag_t douta, + input wea +); +endmodule diff --git a/src/testbench/happy/cache_data_bram.sv b/src/testbench/happy/cache_data_bram.sv deleted file mode 100644 index c47d54b..0000000 --- a/src/testbench/happy/cache_data_bram.sv +++ /dev/null @@ -1,23 +0,0 @@ -// Make Linter Happy - -`include "ICache.svh" -`include "sram.svh" - -module cache_data_bram ( - input [5:0] addra, - input clka, - input [`IC_DATA_LENGTH-1:0] dina, - output [`IC_DATA_LENGTH-1:0] douta, - input wea -); - logic [`IC_DATA_LENGTH-1:0] tmp; - assign douta = tmp; - - initial begin - tmp = 0; - end - - always_ff @(posedge clka) begin - tmp <= {{(`IC_DATA_LENGTH - 6) {1'b0}}, addra}; - end -endmodule diff --git a/src/testbench/happy/cache_tag_bram.sv b/src/testbench/happy/cache_tag_bram.sv deleted file mode 100644 index c93e4b5..0000000 --- a/src/testbench/happy/cache_tag_bram.sv +++ /dev/null @@ -1,26 +0,0 @@ -// Make Linter Happy - -`include "ICache.svh" -`include "sram.svh" - -module cache_tag_bram ( - input [5:0] addra, - input clka, - input [`IC_TAG_LENGTH-1:0] dina, - output [`IC_TAG_LENGTH-1:0] douta, - input wea -); - logic [`IC_TAG_LENGTH-1:0] tmp; - assign douta = tmp; - - initial begin - tmp = 0; - end - - always_ff @(posedge clka) begin - tmp <= {{(`IC_TAG_LENGTH - 6) {1'b0}}, addra}; - end -endmodule - - - diff --git a/src/testbench/happy/cache_tagd_bram.sv b/src/testbench/happy/cache_tagd_bram.sv deleted file mode 100644 index aaf8db8..0000000 --- a/src/testbench/happy/cache_tagd_bram.sv +++ /dev/null @@ -1,26 +0,0 @@ -// Make Linter Happy - -`include "ICache.svh" -`include "sram.svh" - -module cache_tagd_bram ( - input [5:0] addra, - input clka, - input [`IC_TAG_LENGTH+1-1:0] dina, - output [`IC_TAG_LENGTH+1-1:0] douta, - input wea -); - logic [`IC_TAG_LENGTH+1-1:0] tmp; - assign douta = tmp; - - initial begin - tmp = 0; - end - - always_ff @(posedge clka) begin - tmp <= {{(`IC_TAG_LENGTH+1 - 6) {1'b0}}, addra}; - end -endmodule - - - diff --git a/src/testbench/happy/happy.sv b/src/testbench/happy/happy.sv index 5d8c10d..aa88faf 100644 --- a/src/testbench/happy/happy.sv +++ b/src/testbench/happy/happy.sv @@ -47,40 +47,6 @@ module happy (); wire cpu_bvalid; wire cpu_bready; - blk_mem_gen_0 memory ( - .s_axi_araddr(araddr), - .s_axi_arburst(arburst), - .s_axi_arid(arid), - .s_axi_arlen(arlen), - .s_axi_arready(arready), - .s_axi_arsize(arsize), - .s_axi_arvalid(arvalid), - .s_axi_awaddr(awaddr), - .s_axi_awburst(awburst), - .s_axi_awid(awid), - .s_axi_awlen(awlen), - .s_axi_awready(awready), - .s_axi_awsize(awsize), - .s_axi_awvalid(awvalid), - .s_axi_bid(bid), - .s_axi_bready(bready), - .s_axi_bresp(bresp), - .s_axi_bvalid(bvalid), - .s_axi_rdata(rdata), - .s_axi_rid(rid), - .s_axi_rlast(rlast), - .s_axi_rready(rready), - .s_axi_rresp(rresp), - .s_axi_rvalid(rvalid), - .s_axi_wdata(wdata), - .s_axi_wlast(wlast), - .s_axi_wready(wready), - .s_axi_wstrb(wstrb), - .s_axi_wvalid(wvalid), - .s_aclk(clk), - .s_aresetn(~rst) - ); - ICache_i ic (); DCache_i dc (); sramro_i inst (); @@ -149,7 +115,7 @@ module happy (); MMU mmu ( .clk(clk), .rst(rst), - .K0(2'b11), + .K0(3'b011), .ic(ic.mmu), .dc(dc.mmu), .inst(inst.slave),