diff --git a/EL2_IC_TAG.anno.json b/EL2_IC_TAG.anno.json index 3f5e9f9a..4bef0d45 100644 --- a/EL2_IC_TAG.anno.json +++ b/EL2_IC_TAG.anno.json @@ -3,6 +3,9 @@ "class":"firrtl.transforms.CombinationalPath", "sink":"~EL2_IC_TAG|EL2_IC_TAG>io_test", "sources":[ + "~EL2_IC_TAG|EL2_IC_TAG>io_ic_debug_wr_en", + "~EL2_IC_TAG|EL2_IC_TAG>io_ic_debug_tag_array", + "~EL2_IC_TAG|EL2_IC_TAG>io_ic_debug_wr_data", "~EL2_IC_TAG|EL2_IC_TAG>io_ic_rw_addr" ] }, diff --git a/EL2_IC_TAG.fir b/EL2_IC_TAG.fir index eda47883..f77d222e 100644 --- a/EL2_IC_TAG.fir +++ b/EL2_IC_TAG.fir @@ -5,42 +5,42 @@ circuit EL2_IC_TAG : input reset : UInt<1> output io : {flip clk_override : UInt<1>, flip dec_tlu_core_ecc_disable : UInt<1>, flip ic_rw_addr : UInt<29>, flip ic_wr_en : UInt<2>, flip ic_tag_valid : UInt<2>, flip ic_rd_en : UInt<1>, flip ic_debug_addr : UInt<10>, flip ic_debug_rd_en : UInt<1>, flip ic_debug_wr_en : UInt<1>, flip ic_debug_tag_array : UInt<1>, flip ic_debug_way : UInt<2>, ictag_debug_rd_data : UInt<26>, flip ic_debug_wr_data : UInt<71>, ic_rd_hit : UInt<2>, ic_tag_perr : UInt<1>, flip scan_mode : UInt<1>, test : UInt} - io.ictag_debug_rd_data <= UInt<1>("h00") @[el2_ifu_ic_mem.scala 65:26] - io.ic_rd_hit <= UInt<1>("h00") @[el2_ifu_ic_mem.scala 66:16] - io.ic_tag_perr <= UInt<1>("h00") @[el2_ifu_ic_mem.scala 67:18] + io.ictag_debug_rd_data <= UInt<1>("h00") @[el2_ifu_ic_mem.scala 64:26] + io.ic_rd_hit <= UInt<1>("h00") @[el2_ifu_ic_mem.scala 65:16] + io.ic_tag_perr <= UInt<1>("h00") @[el2_ifu_ic_mem.scala 66:18] wire ic_debug_wr_way_en : UInt<2> ic_debug_wr_way_en <= UInt<1>("h00") wire ic_debug_rd_way_en : UInt<2> ic_debug_rd_way_en <= UInt<1>("h00") - node _T = bits(io.ic_rw_addr, 2, 1) @[el2_ifu_ic_mem.scala 70:70] - node _T_1 = eq(_T, UInt<1>("h01")) @[el2_ifu_ic_mem.scala 70:95] + node _T = bits(io.ic_rw_addr, 2, 1) @[el2_ifu_ic_mem.scala 71:70] + node _T_1 = eq(_T, UInt<1>("h01")) @[el2_ifu_ic_mem.scala 71:95] node _T_2 = bits(_T_1, 0, 0) @[Bitwise.scala 72:15] node _T_3 = mux(_T_2, UInt<2>("h03"), UInt<2>("h00")) @[Bitwise.scala 72:12] - node ic_tag_wren = and(io.ic_wr_en, _T_3) @[el2_ifu_ic_mem.scala 70:33] - node _T_4 = or(io.ic_rd_en, io.clk_override) @[el2_ifu_ic_mem.scala 71:55] + node ic_tag_wren = and(io.ic_wr_en, _T_3) @[el2_ifu_ic_mem.scala 71:33] + node _T_4 = or(io.ic_rd_en, io.clk_override) @[el2_ifu_ic_mem.scala 72:55] node _T_5 = bits(_T_4, 0, 0) @[Bitwise.scala 72:15] node _T_6 = mux(_T_5, UInt<2>("h03"), UInt<2>("h00")) @[Bitwise.scala 72:12] - node _T_7 = or(_T_6, io.ic_wr_en) @[el2_ifu_ic_mem.scala 71:73] - node _T_8 = or(_T_7, ic_debug_wr_way_en) @[el2_ifu_ic_mem.scala 71:87] - node ic_tag_clken = or(_T_8, ic_debug_rd_way_en) @[el2_ifu_ic_mem.scala 71:108] - reg ic_rd_en_ff : UInt<1>, clock with : (reset => (reset, UInt<1>("h00"))) @[el2_ifu_ic_mem.scala 73:28] - ic_rd_en_ff <= io.ic_rd_en @[el2_ifu_ic_mem.scala 73:28] - node _T_9 = bits(io.ic_rw_addr, 18, 0) @[el2_ifu_ic_mem.scala 74:44] - reg ic_rw_addr_ff : UInt, clock with : (reset => (reset, UInt<1>("h00"))) @[el2_ifu_ic_mem.scala 74:30] - ic_rw_addr_ff <= _T_9 @[el2_ifu_ic_mem.scala 74:30] - node _T_10 = and(io.ic_debug_rd_en, io.ic_debug_tag_array) @[el2_ifu_ic_mem.scala 78:65] + node _T_7 = or(_T_6, io.ic_wr_en) @[el2_ifu_ic_mem.scala 72:73] + node _T_8 = or(_T_7, ic_debug_wr_way_en) @[el2_ifu_ic_mem.scala 72:87] + node ic_tag_clken = or(_T_8, ic_debug_rd_way_en) @[el2_ifu_ic_mem.scala 72:108] + reg ic_rd_en_ff : UInt<1>, clock with : (reset => (reset, UInt<1>("h00"))) @[el2_ifu_ic_mem.scala 74:28] + ic_rd_en_ff <= io.ic_rd_en @[el2_ifu_ic_mem.scala 74:28] + node _T_9 = bits(io.ic_rw_addr, 18, 0) @[el2_ifu_ic_mem.scala 75:44] + reg ic_rw_addr_ff : UInt, clock with : (reset => (reset, UInt<1>("h00"))) @[el2_ifu_ic_mem.scala 75:30] + ic_rw_addr_ff <= _T_9 @[el2_ifu_ic_mem.scala 75:30] + node _T_10 = and(io.ic_debug_rd_en, io.ic_debug_tag_array) @[el2_ifu_ic_mem.scala 79:65] node _T_11 = bits(_T_10, 0, 0) @[Bitwise.scala 72:15] node _T_12 = mux(_T_11, UInt<2>("h03"), UInt<2>("h00")) @[Bitwise.scala 72:12] - node _T_13 = and(_T_12, io.ic_debug_way) @[el2_ifu_ic_mem.scala 78:90] - ic_debug_rd_way_en <= _T_13 @[el2_ifu_ic_mem.scala 78:22] - node _T_14 = and(io.ic_debug_wr_en, io.ic_debug_tag_array) @[el2_ifu_ic_mem.scala 79:65] + node _T_13 = and(_T_12, io.ic_debug_way) @[el2_ifu_ic_mem.scala 79:90] + ic_debug_rd_way_en <= _T_13 @[el2_ifu_ic_mem.scala 79:22] + node _T_14 = and(io.ic_debug_wr_en, io.ic_debug_tag_array) @[el2_ifu_ic_mem.scala 80:65] node _T_15 = bits(_T_14, 0, 0) @[Bitwise.scala 72:15] node _T_16 = mux(_T_15, UInt<2>("h03"), UInt<2>("h00")) @[Bitwise.scala 72:12] - node _T_17 = and(_T_16, io.ic_debug_way) @[el2_ifu_ic_mem.scala 79:90] - ic_debug_wr_way_en <= _T_17 @[el2_ifu_ic_mem.scala 79:22] - node ic_tag_wren_q = or(ic_tag_wren, ic_debug_wr_way_en) @[el2_ifu_ic_mem.scala 81:35] + node _T_17 = and(_T_16, io.ic_debug_way) @[el2_ifu_ic_mem.scala 80:90] + ic_debug_wr_way_en <= _T_17 @[el2_ifu_ic_mem.scala 80:22] + node ic_tag_wren_q = or(ic_tag_wren, ic_debug_wr_way_en) @[el2_ifu_ic_mem.scala 82:35] node _T_18 = mux(UInt<1>("h00"), UInt<13>("h01fff"), UInt<13>("h00")) @[Bitwise.scala 72:12] - node _T_19 = bits(io.ic_rw_addr, 28, 10) @[el2_ifu_ic_mem.scala 83:74] + node _T_19 = bits(io.ic_rw_addr, 28, 10) @[el2_ifu_ic_mem.scala 84:89] node _T_20 = cat(_T_18, _T_19) @[Cat.scala 29:58] wire _T_21 : UInt<1>[18] @[el2_lib.scala 235:18] wire _T_22 : UInt<1>[18] @[el2_lib.scala 236:18] @@ -327,14 +327,17 @@ circuit EL2_IC_TAG : node _T_213 = xorr(_T_211) @[el2_lib.scala 254:23] node _T_214 = xor(_T_212, _T_213) @[el2_lib.scala 254:18] node ic_tag_ecc = cat(_T_214, _T_211) @[Cat.scala 29:58] - node _T_215 = and(io.ic_debug_wr_en, io.ic_debug_tag_array) @[el2_ifu_ic_mem.scala 85:47] - node _T_216 = bits(_T_215, 0, 0) @[el2_ifu_ic_mem.scala 85:72] - node _T_217 = bits(io.ic_debug_wr_data, 68, 64) @[el2_ifu_ic_mem.scala 85:103] - node _T_218 = bits(io.ic_debug_wr_data, 31, 11) @[el2_ifu_ic_mem.scala 85:131] - node _T_219 = cat(_T_217, _T_218) @[Cat.scala 29:58] - node _T_220 = bits(ic_tag_ecc, 4, 0) @[el2_ifu_ic_mem.scala 86:19] - node _T_221 = bits(io.ic_rw_addr, 28, 10) @[el2_ifu_ic_mem.scala 86:38] - node _T_222 = cat(_T_220, _T_221) @[Cat.scala 29:58] - node ic_tag_wr_data = mux(_T_216, _T_219, _T_222) @[el2_ifu_ic_mem.scala 85:27] - io.test <= io.ic_rw_addr @[el2_ifu_ic_mem.scala 87:11] + node _T_215 = mux(UInt<1>("h00"), UInt<13>("h01fff"), UInt<13>("h00")) @[Bitwise.scala 72:12] + node _T_216 = bits(io.ic_rw_addr, 28, 10) @[el2_ifu_ic_mem.scala 86:96] + node _T_217 = cat(_T_215, _T_216) @[Cat.scala 29:58] + node ic_tag_parity = xorr(_T_217) @[el2_lib.scala 193:13] + node _T_218 = and(io.ic_debug_wr_en, io.ic_debug_tag_array) @[el2_ifu_ic_mem.scala 90:30] + node _T_219 = bits(io.ic_debug_wr_data, 68, 64) @[el2_ifu_ic_mem.scala 90:93] + node _T_220 = bits(io.ic_debug_wr_data, 31, 11) @[el2_ifu_ic_mem.scala 90:150] + node _T_221 = cat(_T_219, _T_220) @[Cat.scala 29:58] + node _T_222 = bits(ic_tag_ecc, 4, 0) @[el2_ifu_ic_mem.scala 91:38] + node _T_223 = mux(UInt<1>("h00"), UInt<2>("h03"), UInt<2>("h00")) @[Bitwise.scala 72:12] + node _T_224 = cat(_T_222, _T_223) @[Cat.scala 29:58] + node ic_tag_wr_data = mux(_T_218, _T_221, _T_224) @[el2_ifu_ic_mem.scala 90:11] + io.test <= ic_tag_wr_data @[el2_ifu_ic_mem.scala 93:11] diff --git a/EL2_IC_TAG.v b/EL2_IC_TAG.v index 8ce2d3c3..53c89180 100644 --- a/EL2_IC_TAG.v +++ b/EL2_IC_TAG.v @@ -17,10 +17,35 @@ module EL2_IC_TAG( output [1:0] io_ic_rd_hit, output io_ic_tag_perr, input io_scan_mode, - output [28:0] io_test + output [25:0] io_test ); - assign io_ictag_debug_rd_data = 26'h0; // @[el2_ifu_ic_mem.scala 65:26] - assign io_ic_rd_hit = 2'h0; // @[el2_ifu_ic_mem.scala 66:16] - assign io_ic_tag_perr = 1'h0; // @[el2_ifu_ic_mem.scala 67:18] - assign io_test = io_ic_rw_addr; // @[el2_ifu_ic_mem.scala 87:11] + wire _T_14 = io_ic_debug_wr_en & io_ic_debug_tag_array; // @[el2_ifu_ic_mem.scala 80:65] + wire [31:0] _T_20 = {13'h0,io_ic_rw_addr[28:10]}; // @[Cat.scala 29:58] + wire [8:0] _T_124 = {_T_20[16],_T_20[14],_T_20[12],_T_20[10],_T_20[8],_T_20[6],_T_20[5],_T_20[3],_T_20[1]}; // @[el2_lib.scala 253:22] + wire [17:0] _T_133 = {_T_20[31],_T_20[30],_T_20[28],_T_20[27],_T_20[25],_T_20[23],_T_20[21],_T_20[20],_T_20[18],_T_124}; // @[el2_lib.scala 253:22] + wire _T_134 = ^_T_133; // @[el2_lib.scala 253:29] + wire [8:0] _T_142 = {_T_20[15],_T_20[14],_T_20[11],_T_20[10],_T_20[7],_T_20[6],_T_20[4],_T_20[3],_T_20[0]}; // @[el2_lib.scala 253:39] + wire [17:0] _T_151 = {_T_20[31],_T_20[29],_T_20[28],_T_20[26],_T_20[25],_T_20[22],_T_20[21],_T_20[19],_T_20[18],_T_142}; // @[el2_lib.scala 253:39] + wire _T_152 = ^_T_151; // @[el2_lib.scala 253:46] + wire [8:0] _T_160 = {_T_20[15],_T_20[14],_T_20[9],_T_20[8],_T_20[7],_T_20[6],_T_20[2],_T_20[1],_T_20[0]}; // @[el2_lib.scala 253:56] + wire [17:0] _T_169 = {_T_20[30],_T_20[29],_T_20[28],_T_20[24],_T_20[23],_T_20[22],_T_20[21],_T_20[17],_T_20[16],_T_160}; // @[el2_lib.scala 253:56] + wire _T_170 = ^_T_169; // @[el2_lib.scala 253:63] + wire [6:0] _T_176 = {_T_20[12],_T_20[11],_T_20[10],_T_20[9],_T_20[8],_T_20[7],_T_20[6]}; // @[el2_lib.scala 253:73] + wire [14:0] _T_184 = {_T_20[27],_T_20[26],_T_20[25],_T_20[24],_T_20[23],_T_20[22],_T_20[21],_T_20[13],_T_176}; // @[el2_lib.scala 253:73] + wire _T_185 = ^_T_184; // @[el2_lib.scala 253:80] + wire [14:0] _T_199 = {_T_20[20],_T_20[19],_T_20[18],_T_20[17],_T_20[16],_T_20[15],_T_20[14],_T_20[13],_T_176}; // @[el2_lib.scala 253:90] + wire _T_200 = ^_T_199; // @[el2_lib.scala 253:97] + wire [5:0] _T_205 = {_T_20[5],_T_20[4],_T_20[3],_T_20[2],_T_20[1],_T_20[0]}; // @[el2_lib.scala 253:107] + wire _T_206 = ^_T_205; // @[el2_lib.scala 253:114] + wire [5:0] _T_211 = {_T_134,_T_152,_T_170,_T_185,_T_200,_T_206}; // @[Cat.scala 29:58] + wire _T_212 = ^_T_20; // @[el2_lib.scala 254:13] + wire _T_213 = ^_T_211; // @[el2_lib.scala 254:23] + wire _T_214 = _T_212 ^ _T_213; // @[el2_lib.scala 254:18] + wire [6:0] ic_tag_ecc = {_T_214,_T_134,_T_152,_T_170,_T_185,_T_200,_T_206}; // @[Cat.scala 29:58] + wire [25:0] _T_221 = {io_ic_debug_wr_data[68:64],io_ic_debug_wr_data[31:11]}; // @[Cat.scala 29:58] + wire [6:0] _T_224 = {ic_tag_ecc[4:0],2'h0}; // @[Cat.scala 29:58] + assign io_ictag_debug_rd_data = 26'h0; // @[el2_ifu_ic_mem.scala 64:26] + assign io_ic_rd_hit = 2'h0; // @[el2_ifu_ic_mem.scala 65:16] + assign io_ic_tag_perr = 1'h0; // @[el2_ifu_ic_mem.scala 66:18] + assign io_test = _T_14 ? _T_221 : {{19'd0}, _T_224}; // @[el2_ifu_ic_mem.scala 93:11] endmodule diff --git a/src/main/scala/ifu/el2_ifu_ic_mem.scala b/src/main/scala/ifu/el2_ifu_ic_mem.scala index 0d7e6623..a7f8393b 100644 --- a/src/main/scala/ifu/el2_ifu_ic_mem.scala +++ b/src/main/scala/ifu/el2_ifu_ic_mem.scala @@ -48,7 +48,7 @@ class EL2_IC_TAG extends Module with el2_lib with param { val ic_wr_en = Input(UInt(ICACHE_NUM_WAYS.W)) val ic_tag_valid = Input(UInt(ICACHE_NUM_WAYS.W)) val ic_rd_en = Input(Bool()) - val ic_debug_addr = Input(UInt((ICACHE_INDEX_HI-2).W)) + val ic_debug_addr = Input(UInt((ICACHE_INDEX_HI-2).W)) // 12-2 = 10-bit value val ic_debug_rd_en = Input(Bool()) val ic_debug_wr_en = Input(Bool()) val ic_debug_tag_array = Input(Bool()) @@ -59,7 +59,6 @@ class EL2_IC_TAG extends Module with el2_lib with param { val ic_tag_perr = Output(Bool()) val scan_mode = Input(Bool()) val test = Output(UInt()) - }) io.ictag_debug_rd_data := 0.U @@ -67,6 +66,8 @@ class EL2_IC_TAG extends Module with el2_lib with param { io.ic_tag_perr := 0.U val ic_debug_wr_way_en = WireInit(UInt(ICACHE_NUM_WAYS.W), 0.U) val ic_debug_rd_way_en = WireInit(UInt(ICACHE_NUM_WAYS.W), 0.U) + + val ic_tag_wren = io.ic_wr_en & Fill(ICACHE_NUM_WAYS, io.ic_rw_addr(ICACHE_BEAT_ADDR_HI-3,1)=== Fill(ICACHE_NUM_WAYS-1, 1.U)) val ic_tag_clken = Fill(ICACHE_NUM_WAYS, io.ic_rd_en|io.clk_override) | io.ic_wr_en | ic_debug_wr_way_en | ic_debug_rd_way_en @@ -80,11 +81,19 @@ class EL2_IC_TAG extends Module with el2_lib with param { val ic_tag_wren_q = ic_tag_wren | ic_debug_wr_way_en - val ic_tag_ecc = rvecc_encode(Cat(Fill(ICACHE_TAG_LO,0.U),io.ic_rw_addr(31-3, ICACHE_TAG_LO-3))) + val ic_tag_ecc = if(ICACHE_ECC) rvecc_encode(Cat(Fill(ICACHE_TAG_LO,0.U),io.ic_rw_addr(31-3, ICACHE_TAG_LO-3))) else 0.U + + val ic_tag_parity = if(ICACHE_ECC) rveven_paritygen(Cat(Fill(ICACHE_TAG_LO,0.U),io.ic_rw_addr(31-3, ICACHE_TAG_LO-3))) else 0.U + + val ic_tag_wr_data = if(ICACHE_TAG_LO==11) Mux(io.ic_debug_wr_en & io.ic_debug_tag_array, Cat(if(ICACHE_ECC) io.ic_debug_wr_data(68,64) else io.ic_debug_wr_data(64), io.ic_debug_wr_data(31,11)), + Cat(if(ICACHE_ECC) ic_tag_ecc(4,0) else ic_tag_parity, io.ic_rw_addr(31-3,ICACHE_TAG_LO-3))) + else Mux(io.ic_debug_wr_en & io.ic_debug_tag_array, Cat(if(ICACHE_ECC) io.ic_debug_wr_data(68,64) else io.ic_debug_wr_data(64), io.ic_debug_wr_data(31,11)), + Cat(if(ICACHE_ECC) Cat(ic_tag_ecc(4,0), Fill(PAD_BITS,0.U)) else Cat(ic_tag_parity,Fill(PAD_BITS,0.U), io.ic_rw_addr(31-3,ICACHE_TAG_LO-3)))) + + io.test := ic_tag_wr_data + + - val ic_tag_wr_data = Mux((io.ic_debug_wr_en & io.ic_debug_tag_array).asBool, Cat(io.ic_debug_wr_data(68,64), io.ic_debug_wr_data(31,11)), - Cat(ic_tag_ecc(4,0),io.ic_rw_addr(31-3,ICACHE_TAG_LO-3))) - io.test := io.ic_rw_addr diff --git a/src/main/scala/lib/el2_lib.scala b/src/main/scala/lib/el2_lib.scala index 7d6633ce..a04ee827 100644 --- a/src/main/scala/lib/el2_lib.scala +++ b/src/main/scala/lib/el2_lib.scala @@ -191,11 +191,11 @@ trait el2_lib extends param{ def rveven_paritygen(data_in : UInt) = data_in.xorR.asUInt - +//rvbradder(Cat(pc, 0.U), Cat(offset, 0.U)) def rvbradder (pc:UInt, offset:UInt) = { val dout_lower = pc(12,1) +& offset(12,1) val pc_inc = pc(31,13)+1.U - val pc_dec = pc(31,13)+1.U + val pc_dec = pc(31,13)-1.U val sign = offset(12) Cat(Mux1H(Seq((sign ^ !dout_lower(dout_lower.getWidth-1)).asBool -> pc(31,13), (!sign & dout_lower(dout_lower.getWidth-1)).asBool -> pc_inc, diff --git a/target/scala-2.12/classes/ifu/EL2_IC_DATA$$anon$3.class b/target/scala-2.12/classes/ifu/EL2_IC_DATA$$anon$3.class index 8726d07c..49bbde8f 100644 Binary files a/target/scala-2.12/classes/ifu/EL2_IC_DATA$$anon$3.class and b/target/scala-2.12/classes/ifu/EL2_IC_DATA$$anon$3.class differ diff --git a/target/scala-2.12/classes/ifu/EL2_IC_DATA.class b/target/scala-2.12/classes/ifu/EL2_IC_DATA.class index 0ed2a0d2..7f38584f 100644 Binary files a/target/scala-2.12/classes/ifu/EL2_IC_DATA.class and b/target/scala-2.12/classes/ifu/EL2_IC_DATA.class differ diff --git a/target/scala-2.12/classes/ifu/EL2_IC_TAG.class b/target/scala-2.12/classes/ifu/EL2_IC_TAG.class index 041d56d3..f3a14150 100644 Binary files a/target/scala-2.12/classes/ifu/EL2_IC_TAG.class and b/target/scala-2.12/classes/ifu/EL2_IC_TAG.class differ diff --git a/target/scala-2.12/classes/ifu/ifu_ic$.class b/target/scala-2.12/classes/ifu/ifu_ic$.class index b30b60b0..b7f620ff 100644 Binary files a/target/scala-2.12/classes/ifu/ifu_ic$.class and b/target/scala-2.12/classes/ifu/ifu_ic$.class differ diff --git a/target/scala-2.12/classes/ifu/ifu_ic$delayedInit$body.class b/target/scala-2.12/classes/ifu/ifu_ic$delayedInit$body.class index c90922c5..2c0be4ef 100644 Binary files a/target/scala-2.12/classes/ifu/ifu_ic$delayedInit$body.class and b/target/scala-2.12/classes/ifu/ifu_ic$delayedInit$body.class differ