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

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

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

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

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

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

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

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

54 55
  io.out.bits.data := DontCare
  io.out.bits.data.dest := LookupTree(fuType, 0.U, List(
Z
Zihao Yu 已提交
56
    FuAlu -> aluOut,
Z
Zihao Yu 已提交
57
    FuBru -> bruOut,
Z
Zihao Yu 已提交
58
    FuLsu -> lsuOut,
Z
Zihao Yu 已提交
59
    FuCsr -> io.csr.in.bits,
Z
Zihao Yu 已提交
60 61
    FuMdu -> mduOut
  ))
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 67
    o.rfWen := i.rfWen
    o.rfDest := i.rfDest
  }
68
  io.out.bits.pc := io.in.bits.pc
Z
Zihao Yu 已提交
69 70 71 72
  io.out.valid := io.in.valid && MuxLookup(fuType, true.B, List(
    FuLsu -> lsu.io.out.valid,
    FuMdu -> mdu.io.out.valid
  ))
73 74 75 76 77 78 79

  // 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
80
  io.csr.isMul := mdu.io.isMul
Z
Zihao Yu 已提交
81
}