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

import chisel3._
import chisel3.util._

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

9
class EXU extends Module with HasFuType {
Z
Zihao Yu 已提交
10
  val io = IO(new Bundle {
Z
Zihao Yu 已提交
11 12
    val in = Flipped(Decoupled(new PcCtrlDataIO))
    val out = Decoupled((new PcCtrlDataIO))
13
    val flush = Input(Bool())
Z
Zihao Yu 已提交
14
    val br = new BranchIO
15
    val csrjmp = Flipped(new BranchIO)
Z
Zihao Yu 已提交
16
    val dmem = new SimpleBus
Z
Zihao Yu 已提交
17
    val mmio = new SimpleBus
Z
Zihao Yu 已提交
18 19
    val forward = new ForwardIO
    val wbData = Input(UInt(32.W))
Z
Zihao Yu 已提交
20 21 22
    val csr = new Bundle {
      val isCsr = Output(Bool())
      val in = Flipped(Decoupled(UInt(32.W)))
23
      val instrType = Vec(FuTypeNum, Output(Bool()))
24
      val isMul = Output(Bool())
25
    }
Z
Zihao Yu 已提交
26 27
  })

28 29 30
  val wbDataLatch = RegEnable(io.out.bits.data.dest, io.out.fire())
  val src1 = Mux(io.in.bits.ctrl.isSrc1Forward, wbDataLatch, io.in.bits.data.src1)
  val src2 = Mux(io.in.bits.ctrl.isSrc2Forward, wbDataLatch, io.in.bits.data.src2)
31

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

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

Z
Zihao Yu 已提交
37
  val alu = Module(new ALU)
38
  val aluOut = alu.access(valid = fuValids(FuAlu), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
39
  alu.io.out.ready := true.B
Z
Zihao Yu 已提交
40

Z
Zihao Yu 已提交
41
  val bru = Module(new BRU)
Z
Zihao Yu 已提交
42
  val bruOut = bru.access(valid = fuValids(FuBru), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
43
  bru.io.pc := io.in.bits.pc
Z
Zihao Yu 已提交
44
  bru.io.offset := io.in.bits.data.imm
45
  io.br <> Mux(io.csrjmp.isTaken, io.csrjmp, bru.io.branch)
Z
Zihao Yu 已提交
46
  bru.io.out.ready := true.B
Z
Zihao Yu 已提交
47

Z
Zihao Yu 已提交
48
  val lsu = Module(new LSU)
Z
Zihao Yu 已提交
49 50
  val lsuOut = lsu.access(valid = fuValids(FuLsu), src1 = src1, src2 = io.in.bits.data.imm, func = fuOpType)
  lsu.io.wdata := src2
Z
Zihao Yu 已提交
51
  io.out.bits.isMMIO := lsu.io.isMMIO
Z
Zihao Yu 已提交
52
  io.dmem <> lsu.io.dmem
Z
Zihao Yu 已提交
53
  io.mmio <> lsu.io.mmio
Z
Zihao Yu 已提交
54
  lsu.io.out.ready := true.B
Z
Zihao Yu 已提交
55

Z
Zihao Yu 已提交
56
  val mdu = Module(new MDU)
57
  val mduOut = mdu.access(valid = fuValids(FuMdu), src1 = src1, src2 = src2, func = fuOpType)
Z
Zihao Yu 已提交
58
  mdu.io.out.ready := true.B
Z
Zihao Yu 已提交
59

Z
Zihao Yu 已提交
60
  // CSR is instantiated under NOOP
61
  io.csr.isCsr := fuValids(FuCsr)
Z
Zihao Yu 已提交
62
  io.csr.in.ready := true.B
Z
Zihao Yu 已提交
63

64 65
  io.out.bits.data := DontCare
  io.out.bits.data.dest := LookupTree(fuType, 0.U, List(
Z
Zihao Yu 已提交
66
    FuAlu -> aluOut,
Z
Zihao Yu 已提交
67
    FuBru -> bruOut,
Z
Zihao Yu 已提交
68
    FuLsu -> lsuOut,
Z
Zihao Yu 已提交
69
    FuCsr -> io.csr.in.bits,
Z
Zihao Yu 已提交
70 71
    FuMdu -> mduOut
  ))
Z
Zihao Yu 已提交
72

73 74
  io.out.bits.ctrl := DontCare
  (io.out.bits.ctrl, io.in.bits.ctrl) match { case (o, i) =>
Z
Zihao Yu 已提交
75 76 77
    o.rfWen := i.rfWen
    o.rfDest := i.rfDest
  }
78
  io.out.bits.pc := io.in.bits.pc
Z
Zihao Yu 已提交
79
  // FIXME: should handle io.out.ready == false
Z
Zihao Yu 已提交
80 81 82 83
  io.out.valid := io.in.valid && MuxLookup(fuType, true.B, List(
    FuLsu -> lsu.io.out.valid,
    FuMdu -> mdu.io.out.valid
  ))
84

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

87
  io.forward.valid := io.in.valid
Z
Zihao Yu 已提交
88 89 90
  io.forward.rfWen := io.in.bits.ctrl.rfWen
  io.forward.rfDest := io.in.bits.ctrl.rfDest

91 92 93 94 95 96
  // perfcnt
  io.csr.instrType(FuAlu) := alu.io.out.fire()
  io.csr.instrType(FuBru) := bru.io.out.fire()
  io.csr.instrType(FuLsu) := lsu.io.out.fire()
  io.csr.instrType(FuMdu) := mdu.io.out.fire()
  io.csr.instrType(FuCsr) := io.csr.isCsr && io.csr.in.ready
97
  io.csr.isMul := mdu.io.isMul
Z
Zihao Yu 已提交
98
}