EXU.scala 4.6 KB
Newer Older
Z
Zihao Yu 已提交
1
package noop
Z
Zihao Yu 已提交
2 3 4

import chisel3._
import chisel3.util._
5
import chisel3.util.experimental.BoringUtils
Z
Zihao Yu 已提交
6

7
import utils._
8
import bus.simplebus._
Z
Zihao Yu 已提交
9

Z
Zihao Yu 已提交
10
class EXU(implicit val p: NOOPConfig) extends NOOPModule {
Z
Zihao Yu 已提交
11
  val io = IO(new Bundle {
Z
Zihao Yu 已提交
12
    val in = Flipped(Decoupled(new DecodeIO))
Z
Zihao Yu 已提交
13
    val out = Decoupled(new CommitIO)
14
    val flush = Input(Bool())
15
    val dmem = new SimpleBusUC
Z
Zihao Yu 已提交
16
    val forward = new ForwardIO
Z
zhangzifei 已提交
17
    val tlb = new TLBExuIO
18
    val memMMU = Flipped(new MemMMUIO)
Z
Zihao Yu 已提交
19 20
  })

21 22
  val src1 = io.in.bits.data.src1
  val src2 = io.in.bits.data.src2
23

Z
Zihao Yu 已提交
24
  val (fuType, fuOpType) = (io.in.bits.ctrl.fuType, io.in.bits.ctrl.fuOpType)
Z
Zihao Yu 已提交
25

Z
Zihao Yu 已提交
26 27
  val fuValids = Wire(Vec(FuType.num, Bool()))
  (0 until FuType.num).map (i => fuValids(i) := (fuType === i.U) && io.in.valid && !io.flush)
28

Z
Zihao Yu 已提交
29
  val alu = Module(new ALU)
Z
Zihao Yu 已提交
30
  val aluOut = alu.access(valid = fuValids(FuType.alu), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
31
  alu.io.cfIn := io.in.bits.cf
Z
Zihao Yu 已提交
32
  alu.io.offset := io.in.bits.data.imm
Z
Zihao Yu 已提交
33
  alu.io.out.ready := true.B
Z
Zihao Yu 已提交
34

Z
Zihao Yu 已提交
35
  val lsu = Module(new LSU)
Z
Zihao Yu 已提交
36
  val lsuOut = lsu.access(valid = fuValids(FuType.lsu), src1 = src1, src2 = io.in.bits.data.imm, func = fuOpType)
Z
Zihao Yu 已提交
37
  lsu.io.wdata := src2
38
  lsu.io.instr := io.in.bits.cf.instr
Z
Zihao Yu 已提交
39
  io.out.bits.isMMIO := lsu.io.isMMIO
Z
Zihao Yu 已提交
40 41
  io.dmem <> lsu.io.dmem
  lsu.io.out.ready := true.B
Z
Zihao Yu 已提交
42

Z
Zihao Yu 已提交
43
  val mdu = Module(new MDU)
Z
Zihao Yu 已提交
44
  val mduOut = mdu.access(valid = fuValids(FuType.mdu), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
45
  mdu.io.out.ready := true.B
Z
Zihao Yu 已提交
46

47
  val csr = Module(new CSR)
Z
Zihao Yu 已提交
48
  val csrOut = csr.access(valid = fuValids(FuType.csr), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
49
  csr.io.cfIn := io.in.bits.cf
50
  csr.io.instrValid := io.in.valid && !io.flush
Z
Zihao Yu 已提交
51
  io.out.bits.intrNO := csr.io.intrNO
52 53
  csr.io.out.ready := true.B

54 55 56
  csr.io.imemMMU <> io.memMMU.imem
  csr.io.dmemMMU <> io.memMMU.dmem
/*
W
William Wang 已提交
57 58 59 60 61 62
  csr.io.dmemMMU.loadPF := false.B
  csr.io.dmemMMU.storePF := false.B
  csr.io.dmemMMU.addr := 0.U
  csr.io.imemMMU.loadPF := false.B
  csr.io.imemMMU.storePF := false.B
  csr.io.imemMMU.addr := 0.U
63
*/
Z
Zihao Yu 已提交
64 65 66 67 68 69
  val mou = Module(new MOU)
  // mou does not write register
  mou.access(valid = fuValids(FuType.mou), src1 = src1, src2 = src2, func = fuOpType)
  mou.io.cfIn := io.in.bits.cf
  mou.io.out.ready := true.B

Z
zhangzifei 已提交
70
  //tlb: tlb is implemented outside - added by lemover-zhangzifei
71 72 73
  io.tlb.access(valid = fuValids(FuType.tlb), src1 = src1, src2 = src2, func = fuOpType, satp = csr.io.satp) //func no use here
  val tlbRedirect = fuTlb(cf = io.in.bits.cf, valid = fuValids(FuType.tlb))
  
Z
Zihao Yu 已提交
74 75
  io.out.bits.decode := DontCare
  (io.out.bits.decode.ctrl, io.in.bits.ctrl) match { case (o, i) =>
Z
Zihao Yu 已提交
76 77
    o.rfWen := i.rfWen
    o.rfDest := i.rfDest
Z
Zihao Yu 已提交
78
    o.fuType := i.fuType
Z
Zihao Yu 已提交
79
  }
Z
Zihao Yu 已提交
80
  io.out.bits.decode.cf.pc := io.in.bits.cf.pc
W
William Wang 已提交
81

82
  io.out.bits.decode.cf.instr := io.in.bits.cf.instr
Z
Zihao Yu 已提交
83 84
  io.out.bits.decode.cf.redirect <>
    Mux(mou.io.redirect.valid, mou.io.redirect,
Z
zhangzifei 已提交
85
      Mux(csr.io.redirect.valid, csr.io.redirect, 
86
        Mux(alu.io.redirect.valid, alu.io.redirect, tlbRedirect))) //add tlb
Z
Zihao Yu 已提交
87

Z
Zihao Yu 已提交
88
  // FIXME: should handle io.out.ready == false
Z
Zihao Yu 已提交
89
  io.out.valid := io.in.valid && MuxLookup(fuType, true.B, List(
Z
Zihao Yu 已提交
90 91
    FuType.lsu -> lsu.io.out.valid,
    FuType.mdu -> mdu.io.out.valid
Z
Zihao Yu 已提交
92
  ))
93

Z
Zihao Yu 已提交
94 95 96 97
  io.out.bits.commits(FuType.alu) := aluOut
  io.out.bits.commits(FuType.lsu) := lsuOut
  io.out.bits.commits(FuType.csr) := csrOut
  io.out.bits.commits(FuType.mdu) := mduOut
Z
Zihao Yu 已提交
98
  io.out.bits.commits(FuType.mou) := 0.U
99
  io.out.bits.commits(FuType.tlb) := 0.U
Z
Zihao Yu 已提交
100

Z
Zihao Yu 已提交
101 102
  io.in.ready := !io.in.valid || io.out.fire()

103
  io.forward.valid := io.in.valid
Z
Zihao Yu 已提交
104 105 106
  io.forward.wb.rfWen := io.in.bits.ctrl.rfWen
  io.forward.wb.rfDest := io.in.bits.ctrl.rfDest
  io.forward.wb.rfData := Mux(alu.io.out.fire(), aluOut, lsuOut)
107
  io.forward.fuType := io.in.bits.ctrl.fuType
Z
Zihao Yu 已提交
108

Z
Zihao Yu 已提交
109
  val isBru = ALUOpType.isBru(fuOpType)
Z
Zihao Yu 已提交
110 111
  BoringUtils.addSource(alu.io.out.fire() && !isBru, "perfCntCondMaluInstr")
  BoringUtils.addSource(alu.io.out.fire() && isBru, "perfCntCondMbruInstr")
112 113 114
  BoringUtils.addSource(lsu.io.out.fire(), "perfCntCondMlsuInstr")
  BoringUtils.addSource(mdu.io.out.fire(), "perfCntCondMmduInstr")
  BoringUtils.addSource(csr.io.out.fire(), "perfCntCondMcsrInstr")
Z
Zihao Yu 已提交
115 116 117

  if (!p.FPGAPlatform) {
    val mon = Module(new Monitor)
Z
Zihao Yu 已提交
118 119
    val cycleCnt = WireInit(0.U(XLEN.W))
    val instrCnt = WireInit(0.U(XLEN.W))
Z
Zihao Yu 已提交
120 121 122 123 124
    val nooptrap = io.in.bits.ctrl.isNoopTrap && io.in.valid
    mon.io.clk := clock
    mon.io.reset := reset.asBool
    mon.io.isNoopTrap := nooptrap
    mon.io.trapCode := io.in.bits.data.src1
Z
Zihao Yu 已提交
125
    mon.io.trapPC := io.in.bits.cf.pc
Z
Zihao Yu 已提交
126 127 128 129 130 131 132
    mon.io.cycleCnt := cycleCnt
    mon.io.instrCnt := instrCnt

    BoringUtils.addSink(cycleCnt, "simCycleCnt")
    BoringUtils.addSink(instrCnt, "simInstrCnt")
    BoringUtils.addSource(nooptrap, "nooptrap")
  }
Z
Zihao Yu 已提交
133
}