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

import chisel3._
import chisel3.util._

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

Z
Zihao Yu 已提交
8
object LookupTree {
Z
Zihao Yu 已提交
9 10
  private val useMuxTree = true

Z
Zihao Yu 已提交
11 12
  def apply[T <: Data](key: UInt, mapping: Iterable[(UInt, T)]): T =
    Mux1H(mapping.map(p => (p._1 === key, p._2)))
Z
Zihao Yu 已提交
13 14 15

  def apply[T <: Data](key: UInt, default: T, mapping: Iterable[(UInt, T)]): T =
    if (useMuxTree) apply(key, mapping) else MuxLookup(key, default, mapping.toSeq)
Z
Zihao Yu 已提交
16 17
}

18
class EXU extends Module with HasFuType {
Z
Zihao Yu 已提交
19
  val io = IO(new Bundle {
20 21
    val in = Flipped(Valid(new PcCtrlDataIO))
    val out = Valid((new PcCtrlDataIO))
Z
Zihao Yu 已提交
22 23
    val br = new BranchIO
    val dmem = new MemIO
24 25 26
    val csrCtrl = new Bundle {
      val instrCommit = Input(Bool())
    }
Z
Zihao Yu 已提交
27 28
  })

29 30
  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 已提交
31 32 33 34

  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 已提交
35

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

Z
Zihao Yu 已提交
42 43 44 45 46
  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 已提交
47

Z
Zihao Yu 已提交
48 49 50
  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 已提交
51

Z
Zihao Yu 已提交
52 53 54 55 56 57
  val csr = Module(new CSR)
  val csrOut = csr.access(valid = (fuType === FuCsr), src1 = src1, src2 = src2, func = fuOpType)
  csr.io.pc := io.in.bits.pc
  csr.io.isException := (io.in.bits.ctrl.isInvOpcode)
  csr.io.exceptionNO := Mux(io.in.bits.ctrl.isInvOpcode, 2.U, 0.U)
  csr.io.out.ready := true.B
Z
Zihao Yu 已提交
58

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

Z
Zihao Yu 已提交
68
  when (csr.io.csrjmp.isTaken) { io.br <> csr.io.csrjmp }
Z
Zihao Yu 已提交
69
  .otherwise { io.br <> bru.io.branch }
Z
Zihao Yu 已提交
70

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

Z
Zihao Yu 已提交
82
  csr.io.instrCommit := io.csrCtrl.instrCommit
Z
Zihao Yu 已提交
83
}