@@ -5,26 +5,29 @@ import chisel3.util._
55
66class EXU extends Module {
77 val io = IO (new Bundle {
8- val globalEn = Input (Bool ())
9- val mtip = Input (Bool ())
10- val stall = Output (Bool ())
11- val id2ex = Flipped (new ID2EXIO )
12- val bypassMem = Flipped (new WBDATAIO )
13- val bypassWb = Flipped (new WBDATAIO )
14- val ex2mem = new EX2MEMIO
15- val nxtPC = new NXTPCIO
8+ val globalEn = Input (Bool ())
9+ val mtip = Input (Bool ())
10+ val stall = Output (Bool ())
11+ val id2ex = Flipped (new ID2EXIO )
12+ val bypassMem = Flipped (new WBDATAIO )
13+ val bypassWb = Flipped (new WBDATAIO )
14+ val ex2mem = new EX2MEMIO
15+ val nxtPC = new NXTPCIO
16+ val branchInfo = new BRANCHIO
1617 })
1718
18- protected val exReg = RegEnable (io.id2ex, WireInit (0 .U .asTypeOf(new ID2EXIO ())), io.globalEn)
19- protected val valid = exReg.valid
20- protected val inst = exReg.inst
21- protected val pc = exReg.pc
22- protected val isa = exReg.isa
23- protected val imm = exReg.imm
24- protected val wen = exReg.wen
25- protected val rs1 = exReg.inst(19 , 15 )
26- protected val rs2 = exReg.inst(24 , 20 )
27- protected val wdest = exReg.wdest
19+ protected val exReg = RegEnable (io.id2ex, WireInit (0 .U .asTypeOf(new ID2EXIO ())), io.globalEn)
20+ protected val valid = exReg.valid
21+ protected val inst = exReg.inst
22+ protected val pc = exReg.pc
23+ protected val branIdx = exReg.branIdx
24+ protected val predTaken = exReg.predTaken
25+ protected val isa = exReg.isa
26+ protected val imm = exReg.imm
27+ protected val wen = exReg.wen
28+ protected val rs1 = exReg.inst(19 , 15 )
29+ protected val rs2 = exReg.inst(24 , 20 )
30+ protected val wdest = exReg.wdest
2831
2932 protected val bypassMemSrc1En = io.bypassMem.wen && (rs1 === io.bypassMem.wdest) && (rs1 =/= 0 .U )
3033 protected val bypassMemSrc2En = io.bypassMem.wen && (rs2 === io.bypassMem.wdest) && (rs2 =/= 0 .U )
@@ -40,18 +43,26 @@ class EXU extends Module {
4043 alu.io.src2 := src2
4144 protected val aluRes = alu.io.res
4245
43- protected val mdu = Module (new MDU )
44- mdu.io.isa := isa
45- mdu.io.src1 := src1
46- mdu.io.src2 := src2
47- protected val mduRes = mdu.io.res
46+ // protected val mdu = Module(new MDU)
47+ // mdu.io.isa := isa
48+ // mdu.io.src1 := src1
49+ // mdu.io.src2 := src2
50+ // protected val mduRes = mdu.io.res
51+
52+ // protected val agu = Module(new AGU)
53+ // agu.io.isa := isa
54+ // agu.io.src1 := src1
55+ // agu.io.src2 := src2
56+ // protected val aguRes = agu.io.res
4857
4958 protected val beu = Module (new BEU )
50- beu.io.isa := isa
51- beu.io.imm := imm
52- beu.io.src1 := src1
53- beu.io.src2 := src2
54- beu.io.pc := pc
59+ beu.io.isa := isa
60+ beu.io.imm := imm
61+ beu.io.src1 := src1
62+ beu.io.src2 := src2
63+ beu.io.pc := pc
64+ beu.io.branIdx := branIdx
65+ beu.io.branchInfo <> io.branchInfo
5566 protected val branch = beu.io.branch
5667 protected val tgt = beu.io.tgt
5768
@@ -68,25 +79,29 @@ class EXU extends Module {
6879 protected val timeIntrEn = csrReg.io.timeIntrEn
6980 protected val ecallEn = csrReg.io.ecallEn
7081
71- io.nxtPC.trap := valid && (timeIntrEn || ecallEn)
72- io.nxtPC.mtvec := csrReg.io.csrState.mtvec
73- io.nxtPC.mret := valid && isa.MRET
74- io.nxtPC.mepc := csrReg.io.csrState.mepc
75- io.nxtPC.branch := valid && branch
76- io.nxtPC.tgt := tgt
77-
78- io.stall := valid && (branch || timeIntrEn || ecallEn || isa.MRET )
82+ io.nxtPC.trap := valid && (timeIntrEn || ecallEn)
83+ io.nxtPC.mtvec := csrReg.io.csrState.mtvec
84+ io.nxtPC.mret := valid && isa.MRET
85+ io.nxtPC.mepc := csrReg.io.csrState.mepc
86+ // (pred, fact)--->(NT, T) or (T, NT)
87+ protected val predNTfactT = branch && ! predTaken
88+ protected val predTfactNT = ! branch && predTaken
89+ io.nxtPC.branch := valid && (predNTfactT || predTfactNT)
90+ io.nxtPC.tgt := Mux (valid && predNTfactT, tgt, Mux (valid && predTfactNT, pc + 4 .U , 0 .U (64 .W )))
91+ io.stall := valid && (io.nxtPC.branch || timeIntrEn || ecallEn || isa.MRET )
7992
8093 io.ex2mem.valid := Mux (timeIntrEn, false .B , valid)
8194 io.ex2mem.inst := inst
8295 io.ex2mem.pc := pc
96+ io.ex2mem.branIdx := branIdx
97+ io.ex2mem.predTaken := predTaken
8398 io.ex2mem.isa := isa
8499 io.ex2mem.src1 := src1
85100 io.ex2mem.src2 := src2
86101 io.ex2mem.imm := imm
87102 io.ex2mem.wen := wen
88103 io.ex2mem.wdest := wdest
89- io.ex2mem.aluRes := aluRes | mduRes
104+ io.ex2mem.aluRes := aluRes
90105 io.ex2mem.branch := branch
91106 io.ex2mem.tgt := tgt
92107 io.ex2mem.link := link
0 commit comments