EXU.scala 2.8 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))
Z
Zihao Yu 已提交
13
    val br = new BranchIO
Z
Zihao Yu 已提交
14
    val dmem = new SimpleBus
Z
Zihao Yu 已提交
15 16
    val forward = new ForwardIO
    val wbData = Input(UInt(32.W))
Z
Zihao Yu 已提交
17 18 19
    val csr = new Bundle {
      val isCsr = Output(Bool())
      val in = Flipped(Decoupled(UInt(32.W)))
20
      val instrType = Vec(FuTypeNum, Output(Bool()))
21
      val isMul = Output(Bool())
22
    }
Z
Zihao Yu 已提交
23 24
  })

Z
Zihao Yu 已提交
25 26 27
  val src1 = Mux(io.in.bits.ctrl.isSrc1Forward, io.wbData, io.in.bits.data.src1)
  val src2 = Mux(io.in.bits.ctrl.isSrc2Forward, io.wbData, io.in.bits.data.src2)
  val (fuType, fuOpType) = (io.in.bits.ctrl.fuType, io.in.bits.ctrl.fuOpType)
Z
Zihao Yu 已提交
28

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

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

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

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

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

Z
Zihao Yu 已提交
53
  // CSR is instantiated under NOOP
54
  io.csr.isCsr := fuValids(FuCsr)
Z
Zihao Yu 已提交
55
  io.csr.in.ready := true.B
Z
Zihao Yu 已提交
56

57 58
  io.out.bits.data := DontCare
  io.out.bits.data.dest := LookupTree(fuType, 0.U, List(
Z
Zihao Yu 已提交
59
    FuAlu -> aluOut,
Z
Zihao Yu 已提交
60
    FuBru -> bruOut,
Z
Zihao Yu 已提交
61
    FuLsu -> lsuOut,
Z
Zihao Yu 已提交
62
    FuCsr -> io.csr.in.bits,
Z
Zihao Yu 已提交
63 64
    FuMdu -> mduOut
  ))
Z
Zihao Yu 已提交
65

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

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

Z
Zihao Yu 已提交
80 81 82 83
  io.forward.fire := io.out.fire()
  io.forward.rfWen := io.in.bits.ctrl.rfWen
  io.forward.rfDest := io.in.bits.ctrl.rfDest

84 85 86 87 88 89
  // 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
90
  io.csr.isMul := mdu.io.isMul
Z
Zihao Yu 已提交
91
}