Skip to content

Commit

Permalink
[rtl] init sram.
Browse files Browse the repository at this point in the history
  • Loading branch information
qinjun-li committed Jul 28, 2024
1 parent 353d75c commit cbdaa37
Showing 1 changed file with 24 additions and 9 deletions.
33 changes: 24 additions & 9 deletions t1/src/vrf/VRF.scala
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,14 @@ class VRF(val parameter: VRFParam) extends Module with SerializableModule[VRFPar
@public
val loadDataInLSUWriteQueue: UInt = IO(Input(UInt(parameter.chainingSize.W)))

// reset sram
val sramReady: Bool = RegInit(false.B)
val sramResetCount: UInt = RegInit(0.U(log2Ceil(parameter.rfDepth).W))
val resetValid: Bool = !sramReady
when(resetValid) {
sramResetCount := sramResetCount + 1.U
when(sramResetCount.andR) { sramReady := true.B }
}
// TODO: add Chaining Check Probe

// todo: delete
Expand Down Expand Up @@ -316,7 +324,7 @@ class VRF(val parameter: VRFParam) extends Module with SerializableModule[VRFPar
// if there are additional read port for the bank.
(bank & (~readPortCheckSelect)).orR
}
v.ready := portReady
v.ready := portReady && sramReady
val firstUsed = (bank & o).orR
bankReadF(i) := bankCorrect & (~o)
bankReadS(i) := bankCorrect & (~t) & o
Expand All @@ -325,12 +333,19 @@ class VRF(val parameter: VRFParam) extends Module with SerializableModule[VRFPar
(o | bankCorrect, (bankCorrect & o) | t)
}
// @todo @Clo91eaf check write port is ready.
write.ready := (parameter.ramType match {
write.ready := sramReady && (parameter.ramType match {
case RamType.p0rw => (writeBank & (~firstOccupied)).orR
case RamType.p0rp1w => true.B
case RamType.p0rwp1rw => (writeBank & (~secondOccupied)).orR
})

val writeData: UInt = Mux(resetValid, 0.U(parameter.datapathWidth.W), writePipe.bits.data)
val writeAddress: UInt =
Mux(
resetValid,
sramResetCount,
((writePipe.bits.vd ## writePipe.bits.offset) >> log2Ceil(parameter.rfBankNum)).asUInt
)
// @todo @Clo91eaf VRF write&read singal should be captured here.
// @todo in the future, we need to maintain a layer to trace the original requester to each read&write.
val rfVec: Seq[SRAMInterface[UInt]] = Seq.tabulate(parameter.rfBankNum) { bank =>
Expand All @@ -354,20 +369,20 @@ class VRF(val parameter: VRFParam) extends Module with SerializableModule[VRFPar
case RamType.p0rwp1rw => 2
}
)
val writeValid: Bool = writePipe.valid && writeBankPipe(bank)
val writeValid: Bool = writePipe.valid && writeBankPipe(bank) || resetValid
parameter.ramType match {
case RamType.p0rw =>
firstReadPipe(bank).bits.address :=
Mux1H(bankReadF.map(_(bank)), readRequests.map(r => (r.bits.vs ## r.bits.offset) >> log2Ceil(parameter.rfBankNum)))
firstReadPipe(bank).valid := bankReadF.map(_(bank)).reduce(_ || _)
rf.readwritePorts.last.address := Mux(
writeValid,
(writePipe.bits.vd ## writePipe.bits.offset) >> log2Ceil(parameter.rfBankNum),
writeAddress,
firstReadPipe(bank).bits.address
)
rf.readwritePorts.last.enable := writeValid || firstReadPipe(bank).valid
rf.readwritePorts.last.isWrite := writeValid
rf.readwritePorts.last.writeData := writePipe.bits.data
rf.readwritePorts.last.writeData := writeData
assert(!(writeValid && firstReadPipe(bank).valid), "port conflict")

readResultF(bank) := rf.readwritePorts.head.readData
Expand All @@ -383,8 +398,8 @@ class VRF(val parameter: VRFParam) extends Module with SerializableModule[VRFPar
readResultS(bank) := DontCare

rf.writePorts.head.enable := writeValid
rf.writePorts.head.address := (writePipe.bits.vd ## writePipe.bits.offset) >> log2Ceil(parameter.rfBankNum)
rf.writePorts.head.data := writePipe.bits.data
rf.writePorts.head.address := writeAddress
rf.writePorts.head.data := writeData
case RamType.p0rwp1rw =>
firstReadPipe(bank).bits.address :=
Mux1H(bankReadF.map(_(bank)), readRequests.map(r => (r.bits.vs ## r.bits.offset) >> log2Ceil(parameter.rfBankNum)))
Expand All @@ -403,12 +418,12 @@ class VRF(val parameter: VRFParam) extends Module with SerializableModule[VRFPar
secondReadPipe(bank).valid := bankReadS.map(_(bank)).reduce(_ || _)
rf.readwritePorts.last.address := Mux(
writeValid,
(writePipe.bits.vd ## writePipe.bits.offset) >> log2Ceil(parameter.rfBankNum),
writeAddress,
secondReadPipe(bank).bits.address
)
rf.readwritePorts.last.enable := writeValid || secondReadPipe(bank).valid
rf.readwritePorts.last.isWrite := writeValid
rf.readwritePorts.last.writeData := writePipe.bits.data
rf.readwritePorts.last.writeData := writeData
assert(!(writeValid && secondReadPipe(bank).valid), "port conflict")
}

Expand Down

0 comments on commit cbdaa37

Please sign in to comment.