@@ -19,6 +19,8 @@ class TreeCoreL2 extends Module {
1919 protected val mau = Module (new MAU )
2020 protected val wbu = Module (new WBU )
2121
22+ // 1. switch base addr
23+ // 2. switch difftest access
2224 ifu.io.socEn := io.socEn
2325 wbu.io.socEn := io.socEn
2426
@@ -27,62 +29,57 @@ class TreeCoreL2 extends Module {
2729 idu.io.id2ex <> exu.io.id2ex
2830 exu.io.ex2mem <> mau.io.ex2mem
2931 mau.io.mem2wb <> wbu.io.mem2wb
30-
32+ // stall signal
3133 exu.io.stall <> idu.io.stall
3234 exu.io.stall <> ifu.io.stall
33-
3435 // branch prediction
3536 ifu.io.branchInfo <> exu.io.branchInfo
36-
3737 // bypass
3838 idu.io.wbdata <> wbu.io.wbdata
3939 exu.io.bypassMem <> mau.io.bypassMem
4040 exu.io.bypassWb <> wbu.io.wbdata
41- exu.io.nxtPC <> ifu.io.nxtPC
42- exu.io.mtip <> mau.io.mtip
41+ // misc
42+ idu.io.gpr <> wbu.io.gpr
43+ exu.io.nxtPC <> ifu.io.nxtPC
44+ exu.io.mtip <> mau.io.mtip
4345
46+ // stall
4447 protected val isStall = exu.io.stall
4548 protected val (tickCnt, cntWrap) = Counter (io.globalEn && isStall, 3 )
46- protected val stallCycle1 = isStall && (tickCnt === 0 .U )
47- protected val stallCycle2 = isStall && (tickCnt === 1 .U )
48- protected val stallCycle3 = isStall && (tickCnt === 2 .U )
49-
50- ifu.io.stall := stallCycle1
51- idu.io.stall := stallCycle1
49+ protected val cyc1 = isStall && (tickCnt === 0 .U )
50+ protected val cyc2 = isStall && (tickCnt === 1 .U )
51+ protected val cyc3 = isStall && (tickCnt === 2 .U )
5252
53+ ifu.io.stall := cyc1
54+ idu.io.stall := cyc1
5355 ifu.io.globalEn := io.globalEn
5456 idu.io.globalEn := io.globalEn
55- exu.io.globalEn := Mux (stallCycle1 || stallCycle2, false .B , io.globalEn)
56- mau.io.globalEn := Mux (stallCycle1 || stallCycle2, false .B , io.globalEn)
57- wbu.io.globalEn := Mux (stallCycle1 || stallCycle2, false .B , io.globalEn)
57+ exu.io.globalEn := Mux (cyc1 || cyc2, false .B , io.globalEn)
58+ mau.io.globalEn := Mux (cyc1 || cyc2, false .B , io.globalEn)
59+ wbu.io.globalEn := Mux (cyc1 || cyc2, false .B , io.globalEn)
60+ idu.io.wbdata := Mux (cyc1 || cyc2, 0 .U .asTypeOf(new WBDATAIO ), wbu.io.wbdata)
61+ ifu.io.nxtPC := Mux (cyc1, exu.io.nxtPC, 0 .U .asTypeOf(new NXTPCIO ))
5862
59- idu.io.wbdata := Mux (stallCycle1 || stallCycle2, 0 .U .asTypeOf(new WBDATAIO ), wbu.io.wbdata)
60- ifu.io.nxtPC := Mux (stallCycle1, exu.io.nxtPC, 0 .U .asTypeOf(new NXTPCIO ))
61-
62- protected val ldDataInStall = RegInit (0 .U (64 .W ))
63+ // special judge
64+ protected val lsStall = RegEnable (cyc1, false .B , io.globalEn) || RegEnable (cyc2, false .B , io.globalEn)
65+ protected val ldDataReg = RegInit (0 .U (64 .W ))
6366
6467 when(io.globalEn) {
65- when(stallCycle1 ) {
66- ldDataInStall := io.ld.data
67- }.elsewhen(stallCycle3 ) {
68- ldDataInStall := 0 .U
68+ when(cyc1 ) {
69+ ldDataReg := io.ld.data
70+ }.elsewhen(cyc3 ) {
71+ ldDataReg := 0 .U
6972 }
7073 }
7174
7275 // communicate with extern io
73- io.fetch <> ifu.io.fetch
74-
75- // Even load can change machine state
76- protected val lsStall = RegEnable (stallCycle1, false .B , io.globalEn) || RegEnable (stallCycle2, false .B , io.globalEn)
76+ io.fetch <> ifu.io.fetch
7777 io.ld.en := mau.io.ld.en && ~ lsStall
7878 io.ld.addr := mau.io.ld.addr
79- mau.io.ld.data := Mux (lsStall, ldDataInStall , io.ld.data)
79+ mau.io.ld.data := Mux (lsStall, ldDataReg , io.ld.data)
8080 io.ld.size := mau.io.ld.size
81-
82- io.sd.en := mau.io.sd.en && ~ lsStall
83- io.sd.addr := mau.io.sd.addr
84- io.sd.data := mau.io.sd.data
85- io.sd.mask := mau.io.sd.mask
86-
87- idu.io.gpr <> wbu.io.gpr
81+ io.sd.en := mau.io.sd.en && ~ lsStall
82+ io.sd.addr := mau.io.sd.addr
83+ io.sd.data := mau.io.sd.data
84+ io.sd.mask := mau.io.sd.mask
8885}
0 commit comments