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

import chisel3._
import chisel3.util._

6
import utils._
Z
Zihao Yu 已提交
7 8
import memory.MemIO

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 14
    val br = new BranchIO
    val dmem = new MemIO
Z
Zihao Yu 已提交
15 16 17
    val csr = new Bundle {
      val isCsr = Output(Bool())
      val in = Flipped(Decoupled(UInt(32.W)))
18
    }
Z
Zihao Yu 已提交
19 20
  })

21 22
  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 已提交
23 24 25 26

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

Z
Zihao Yu 已提交
28
  val bru = Module(new BRU)
Z
Zihao Yu 已提交
29
  val bruOut = bru.access(valid = (fuType === FuBru), src1 = src1, src2 = io.in.bits.data.dest, func = fuOpType)
Z
Zihao Yu 已提交
30 31
  bru.io.pc := io.in.bits.pc
  bru.io.offset := src2
Z
Zihao Yu 已提交
32
  io.br <> bru.io.branch
Z
Zihao Yu 已提交
33
  bru.io.out.ready := true.B
Z
Zihao Yu 已提交
34

Z
Zihao Yu 已提交
35 36 37 38 39
  val lsu = Module(new LSU)
  val lsuOut = lsu.access(valid = (fuType === FuLsu), src1 = src1, src2 = src2, func = fuOpType)
  lsu.io.wdata := io.in.bits.data.dest
  io.dmem <> lsu.io.dmem
  lsu.io.out.ready := true.B
Z
Zihao Yu 已提交
40

Z
Zihao Yu 已提交
41 42 43
  val mdu = Module(new MDU)
  val mduOut = mdu.access(valid = (fuType === FuMdu), src1 = src1, src2 = src2, func = fuOpType)
  mdu.io.out.ready := true.B
Z
Zihao Yu 已提交
44

Z
Zihao Yu 已提交
45 46 47
  // CSR is instantiated under NOOP
  io.csr.isCsr := fuType === FuCsr
  io.csr.in.ready := true.B
Z
Zihao Yu 已提交
48

49 50
  io.out.bits.data := DontCare
  io.out.bits.data.dest := LookupTree(fuType, 0.U, List(
Z
Zihao Yu 已提交
51
    FuAlu -> aluOut,
Z
Zihao Yu 已提交
52
    FuBru -> bruOut,
Z
Zihao Yu 已提交
53
    FuLsu -> lsuOut,
Z
Zihao Yu 已提交
54
    FuCsr -> io.csr.in.bits,
Z
Zihao Yu 已提交
55 56
    FuMdu -> mduOut
  ))
Z
Zihao Yu 已提交
57

58 59
  io.out.bits.ctrl := DontCare
  (io.out.bits.ctrl, io.in.bits.ctrl) match { case (o, i) =>
Z
Zihao Yu 已提交
60 61 62
    o.rfWen := i.rfWen
    o.rfDest := i.rfDest
  }
63
  io.out.bits.pc := io.in.bits.pc
Z
Zihao Yu 已提交
64 65 66 67
  io.out.valid := io.in.valid && MuxLookup(fuType, true.B, List(
    FuLsu -> lsu.io.out.valid,
    FuMdu -> mdu.io.out.valid
  ))
Z
Zihao Yu 已提交
68
}