riscv-lab/chisel/playground/src/pipeline/decode/ARegfile.scala

59 lines
1.4 KiB
Scala

package cpu.pipeline.decode
import chisel3._
import chisel3.util._
import cpu.defines._
import cpu.defines.Const._
import cpu.CpuConfig
class SrcRead extends Bundle {
val raddr = Output(UInt(REG_ADDR_WID.W))
val rdata = Input(UInt(XLEN.W))
}
class Src12Read extends Bundle {
val src1 = new SrcRead()
val src2 = new SrcRead()
}
class RegWrite extends Bundle {
val wen = Output(Bool())
val waddr = Output(UInt(REG_ADDR_WID.W))
val wdata = Output(UInt(XLEN.W))
}
class ARegFile(implicit val cpuConfig: CpuConfig) extends Module {
val io = IO(new Bundle {
val read = Flipped(new Src12Read())
val write = Flipped(new RegWrite())
})
// 定义32个32位寄存器
val regs = RegInit(VecInit(Seq.fill(AREG_NUM)(0.U(XLEN.W))))
// 写寄存器堆
when(io.write.wen && io.write.waddr =/= 0.U) {
regs(io.write.waddr) := io.write.wdata
}
// 读寄存器堆
// src1
when(io.read.src1.raddr === 0.U) {
io.read.src1.rdata := 0.U
}.otherwise {
io.read.src1.rdata := regs(io.read.src1.raddr)
when(io.write.wen && io.read.src1.raddr === io.write.waddr) {
io.read.src1.rdata := io.write.wdata
}
}
// src2
when(io.read.src2.raddr === 0.U) {
io.read.src2.rdata := 0.U
}.otherwise {
io.read.src2.rdata := regs(io.read.src2.raddr)
when(io.write.wen && io.read.src2.raddr === io.write.waddr) {
io.read.src2.rdata := io.write.wdata
}
}
}