EXU.scala 3.2 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.SimpleBus
Z
Zihao Yu 已提交
9

10
class EXU(implicit val p: NOOPConfig) extends Module with HasFuType {
Z
Zihao Yu 已提交
11
  val io = IO(new Bundle {
Z
Zihao Yu 已提交
12
    val in = Flipped(Decoupled(new PcCtrlDataIO))
Z
Zihao Yu 已提交
13
    val out = Decoupled(new CommitIO)
14
    val flush = Input(Bool())
Z
Zihao Yu 已提交
15
    val dmem = new SimpleBus
Z
Zihao Yu 已提交
16
    val mmio = new SimpleBus
Z
Zihao Yu 已提交
17 18
    val forward = new ForwardIO
    val wbData = Input(UInt(32.W))
19
    val bpu1Update = Output(new BRUIO)
Z
Zihao Yu 已提交
20 21
  })

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

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

27
  val fuValids = Wire(Vec(FuTypeNum, Bool()))
28
  (0 until FuTypeNum).map (i => fuValids(i) := (fuType === i.U) && io.in.valid && !io.flush)
29

Z
Zihao Yu 已提交
30
  val alu = Module(new ALU)
31
  val aluOut = alu.access(valid = fuValids(FuAlu), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
32
  alu.io.out.ready := true.B
Z
Zihao Yu 已提交
33

Z
Zihao Yu 已提交
34
  val bru = Module(new BRU)
Z
Zihao Yu 已提交
35
  val bruOut = bru.access(valid = fuValids(FuBru), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
36
  bru.io.pc := io.in.bits.pc
Z
Zihao Yu 已提交
37
  bru.io.offset := io.in.bits.data.imm
38
  bru.io.npc := io.in.bits.npc
Z
Zihao Yu 已提交
39
  bru.io.out.ready := true.B
40
  io.bpu1Update := bru.io
Z
Zihao Yu 已提交
41

Z
Zihao Yu 已提交
42
  val lsu = Module(new LSU)
Z
Zihao Yu 已提交
43 44
  val lsuOut = lsu.access(valid = fuValids(FuLsu), src1 = src1, src2 = io.in.bits.data.imm, func = fuOpType)
  lsu.io.wdata := src2
Z
Zihao Yu 已提交
45
  io.out.bits.isMMIO := lsu.io.isMMIO
Z
Zihao Yu 已提交
46
  io.dmem <> lsu.io.dmem
Z
Zihao Yu 已提交
47
  io.mmio <> lsu.io.mmio
Z
Zihao Yu 已提交
48
  lsu.io.out.ready := true.B
Z
Zihao Yu 已提交
49

Z
Zihao Yu 已提交
50
  val mdu = Module(new MDU)
51
  val mduOut = mdu.access(valid = fuValids(FuMdu), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
52
  mdu.io.out.ready := true.B
Z
Zihao Yu 已提交
53

54
  val csr = Module(new CSR)
55 56 57 58 59 60 61
  val csrOut = csr.access(valid = fuValids(FuCsr), src1 = src1, src2 = src2, func = fuOpType)
  csr.io.pc := io.in.bits.pc
  csr.io.isInvOpcode := io.in.bits.ctrl.isInvOpcode
  csr.io.out.ready := true.B

  io.out.bits.br <> Mux(csr.io.csrjmp.isTaken, csr.io.csrjmp, bru.io.branch)
  io.out.bits.npc := io.in.bits.npc
Z
Zihao Yu 已提交
62

63 64
  io.out.bits.ctrl := DontCare
  (io.out.bits.ctrl, io.in.bits.ctrl) match { case (o, i) =>
Z
Zihao Yu 已提交
65 66
    o.rfWen := i.rfWen
    o.rfDest := i.rfDest
Z
Zihao Yu 已提交
67
    o.fuType := i.fuType
Z
Zihao Yu 已提交
68
  }
69
  io.out.bits.pc := io.in.bits.pc
Z
Zihao Yu 已提交
70
  // FIXME: should handle io.out.ready == false
Z
Zihao Yu 已提交
71 72 73 74
  io.out.valid := io.in.valid && MuxLookup(fuType, true.B, List(
    FuLsu -> lsu.io.out.valid,
    FuMdu -> mdu.io.out.valid
  ))
75

Z
Zihao Yu 已提交
76 77 78 79
  io.out.bits.commits := DontCare
  io.out.bits.commits(FuAlu).rfWdata := aluOut
  io.out.bits.commits(FuBru).rfWdata := bruOut
  io.out.bits.commits(FuLsu).rfWdata := lsuOut
80
  io.out.bits.commits(FuCsr).rfWdata := csrOut
Z
Zihao Yu 已提交
81 82
  io.out.bits.commits(FuMdu).rfWdata := mduOut

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

85
  io.forward.valid := io.in.valid
Z
Zihao Yu 已提交
86 87
  io.forward.rfWen := io.in.bits.ctrl.rfWen
  io.forward.rfDest := io.in.bits.ctrl.rfDest
88
  io.forward.fuType := io.in.bits.ctrl.fuType
Z
Zihao Yu 已提交
89
  io.forward.rfData := Mux(alu.io.out.fire(), aluOut, lsuOut)
Z
Zihao Yu 已提交
90

91 92 93 94 95
  BoringUtils.addSource(alu.io.out.fire(), "perfCntCondMaluInstr")
  BoringUtils.addSource(bru.io.out.fire(), "perfCntCondMbruInstr")
  BoringUtils.addSource(lsu.io.out.fire(), "perfCntCondMlsuInstr")
  BoringUtils.addSource(mdu.io.out.fire(), "perfCntCondMmduInstr")
  BoringUtils.addSource(csr.io.out.fire(), "perfCntCondMcsrInstr")
Z
Zihao Yu 已提交
96
}