SM sram化改造,探针改造,写接口
This commit is contained in:
@@ -3,177 +3,96 @@ package BACK
|
||||
import chisel3._
|
||||
import chisel3.util._
|
||||
|
||||
class SMUnitIO extends Bundle {
|
||||
val maxLen = Input(UInt(11.W))
|
||||
val enq = Flipped(Decoupled(UInt(8.W)))
|
||||
val deq = Decoupled(UInt(8.W))
|
||||
|
||||
val sram = Vec(4, new SRAM2kIO)
|
||||
// class SRAM2kWRIO extends Bundle {
|
||||
// val addrw = Output(UInt(11.W))
|
||||
// val dataw = Output( UInt(8.W) )
|
||||
// val enw = Output(Bool())
|
||||
// }
|
||||
|
||||
// class SRAM2kRDIO extends Bundle {
|
||||
// val addrr = Output(UInt(11.W))
|
||||
// val datar = Input( UInt(8.W) )
|
||||
// val enr = Output(Bool())
|
||||
// }
|
||||
|
||||
// class SRAM2kIO extends Bundle {
|
||||
// val addrr = Output(UInt(11.W))
|
||||
// val addrw = Output(UInt(11.W))
|
||||
|
||||
// val dataw = Output( UInt(8.W) )
|
||||
// val datar = Input( UInt(8.W) )
|
||||
// val enw = Output(Bool())
|
||||
// val enr = Output(Bool())
|
||||
// }
|
||||
|
||||
class SMUnitIO(depth: Int) extends Bundle {
|
||||
|
||||
val sram_w = Flipped(new SRAM2kWRIO)
|
||||
val sram_r = Flipped(new SRAM2kRDIO)
|
||||
|
||||
val enq = Input(Bool())
|
||||
val deq = Input(Bool())
|
||||
|
||||
val sram = Vec(depth, new SRAM2kIO)
|
||||
|
||||
}
|
||||
|
||||
abstract class SMUnitBase extends Module {
|
||||
val io: SMUnitIO = IO(new SMUnitIO)
|
||||
abstract class SMUnitBase(depth: Int = 4) extends Module {
|
||||
val io: SMUnitIO = IO(new SMUnitIO(depth))
|
||||
|
||||
|
||||
val enqCnt = Reg(UInt(11.W))
|
||||
val deqCnt = Reg(UInt(11.W))
|
||||
val wPtr = RegInit(0.U((log2Ceil(depth)+1).W))
|
||||
val rPtr = RegInit(0.U((log2Ceil(depth)+1).W))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
val dataBuf =
|
||||
for ( i <- 0 until 4 ) yield {
|
||||
val mdl = Module( new SRAM2kFifo )
|
||||
io.sram(i) <> mdl.io.sram
|
||||
mdl
|
||||
}
|
||||
|
||||
|
||||
|
||||
val wPtr = RegInit(0.U((2+1).W))
|
||||
val rPtr = RegInit(0.U((2+1).W))
|
||||
|
||||
val isFull =
|
||||
( wPtr.extract(2) =/= rPtr.extract(2) ) & ( wPtr(1,0) === rPtr(1,0) )
|
||||
val isFull = (wPtr ^ rPtr) === (1.U << log2Ceil(depth))
|
||||
// ( wPtr.extract(2) =/= rPtr.extract(2) ) & ( wPtr(1,0) === rPtr(1,0) )
|
||||
|
||||
|
||||
val isEmpty = ( wPtr === rPtr )
|
||||
|
||||
when( io.enq.fire ){
|
||||
when( enqCnt === io.maxLen ){
|
||||
enqCnt := 0.U
|
||||
} .otherwise{
|
||||
enqCnt := enqCnt + 1.U
|
||||
}
|
||||
}
|
||||
|
||||
when( io.deq.fire ){
|
||||
when( deqCnt === io.maxLen ){
|
||||
deqCnt := 0.U
|
||||
} .otherwise{
|
||||
deqCnt := deqCnt + 1.U
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
when( io.enq.fire & enqCnt === io.maxLen ){
|
||||
when( io.enq ){
|
||||
wPtr := wPtr + 1.U
|
||||
}
|
||||
|
||||
when( io.deq.fire & deqCnt === io.maxLen ){
|
||||
when( io.deq ){
|
||||
rPtr := rPtr + 1.U
|
||||
}
|
||||
|
||||
for( i <- 0 until depth ){
|
||||
io.sram(i).addrw := 0.U
|
||||
io.sram(i).dataw := 0.U
|
||||
io.sram(i).enw := false.B
|
||||
|
||||
when( wPtr === 0.U & ~isFull ){
|
||||
dataBuf(0).io.enq.valid := io.enq.valid
|
||||
dataBuf(0).io.enq.bits := io.enq.bits
|
||||
io.enq.ready := dataBuf(0).io.enq.ready
|
||||
|
||||
dataBuf(1).io.enq.valid := false.B
|
||||
dataBuf(1).io.enq.bits := 0.U
|
||||
dataBuf(2).io.enq.valid := false.B
|
||||
dataBuf(2).io.enq.bits := 0.U
|
||||
dataBuf(3).io.enq.valid := false.B
|
||||
dataBuf(3).io.enq.bits := 0.U
|
||||
} .elsewhen( wPtr === 1.U & ~isFull ){
|
||||
dataBuf(1).io.enq.valid := io.enq.valid
|
||||
dataBuf(1).io.enq.bits := io.enq.bits
|
||||
io.enq.ready := dataBuf(1).io.enq.ready
|
||||
|
||||
dataBuf(0).io.enq.valid := false.B
|
||||
dataBuf(0).io.enq.bits := 0.U
|
||||
dataBuf(2).io.enq.valid := false.B
|
||||
dataBuf(2).io.enq.bits := 0.U
|
||||
dataBuf(3).io.enq.valid := false.B
|
||||
dataBuf(3).io.enq.bits := 0.U
|
||||
} .elsewhen( wPtr === 2.U & ~isFull ){
|
||||
dataBuf(2).io.enq.valid := io.enq.valid
|
||||
dataBuf(2).io.enq.bits := io.enq.bits
|
||||
io.enq.ready := dataBuf(2).io.enq.ready
|
||||
|
||||
dataBuf(0).io.enq.valid := false.B
|
||||
dataBuf(0).io.enq.bits := 0.U
|
||||
dataBuf(1).io.enq.valid := false.B
|
||||
dataBuf(1).io.enq.bits := 0.U
|
||||
dataBuf(3).io.enq.valid := false.B
|
||||
dataBuf(3).io.enq.bits := 0.U
|
||||
} .elsewhen( wPtr === 3.U & ~isFull ){
|
||||
dataBuf(3).io.enq.valid := io.enq.valid
|
||||
dataBuf(3).io.enq.bits := io.enq.bits
|
||||
io.enq.ready := dataBuf(3).io.enq.ready
|
||||
|
||||
dataBuf(0).io.enq.valid := false.B
|
||||
dataBuf(0).io.enq.bits := 0.U
|
||||
dataBuf(1).io.enq.valid := false.B
|
||||
dataBuf(1).io.enq.bits := 0.U
|
||||
dataBuf(2).io.enq.valid := false.B
|
||||
dataBuf(2).io.enq.bits := 0.U
|
||||
|
||||
} .otherwise{
|
||||
|
||||
io.enq.ready := false.B
|
||||
|
||||
dataBuf(0).io.enq.valid := false.B
|
||||
dataBuf(0).io.enq.bits := 0.U
|
||||
dataBuf(1).io.enq.valid := false.B
|
||||
dataBuf(1).io.enq.bits := 0.U
|
||||
dataBuf(2).io.enq.valid := false.B
|
||||
dataBuf(2).io.enq.bits := 0.U
|
||||
dataBuf(3).io.enq.valid := false.B
|
||||
dataBuf(3).io.enq.bits := 0.U
|
||||
io.sram(i).addrr := 0.U
|
||||
io.sram(i).enr := false.B
|
||||
}
|
||||
|
||||
when( rPtr === 0.U & ~isEmpty){
|
||||
io.deq.valid := dataBuf(0).io.deq.valid
|
||||
io.deq.bits := dataBuf(0).io.deq.bits
|
||||
for( i <- 0 until depth ){
|
||||
when( wPtr === i.U & ~isFull ){
|
||||
io.sram(i).addrw := io.sram_w.addrw
|
||||
io.sram(i).dataw := io.sram_w.dataw
|
||||
io.sram(i).enw := io.sram_w.enw
|
||||
}
|
||||
|
||||
dataBuf(0).io.deq.ready := io.deq.ready
|
||||
dataBuf(1).io.deq.ready := false.B
|
||||
dataBuf(2).io.deq.ready := false.B
|
||||
dataBuf(3).io.deq.ready := false.B
|
||||
} .elsewhen( rPtr === 1.U & ~isEmpty){
|
||||
io.deq.valid := dataBuf(1).io.deq.valid
|
||||
io.deq.bits := dataBuf(1).io.deq.bits
|
||||
|
||||
dataBuf(0).io.deq.ready := false.B
|
||||
dataBuf(1).io.deq.ready := io.deq.ready
|
||||
dataBuf(2).io.deq.ready := false.B
|
||||
dataBuf(3).io.deq.ready := false.B
|
||||
} .elsewhen( rPtr === 2.U & ~isEmpty){
|
||||
io.deq.valid := dataBuf(2).io.deq.valid
|
||||
io.deq.bits := dataBuf(2).io.deq.bits
|
||||
|
||||
dataBuf(0).io.deq.ready := false.B
|
||||
dataBuf(1).io.deq.ready := false.B
|
||||
dataBuf(2).io.deq.ready := io.deq.ready
|
||||
dataBuf(3).io.deq.ready := false.B
|
||||
} .elsewhen( rPtr === 3.U & ~isEmpty){
|
||||
io.deq.valid := dataBuf(3).io.deq.valid
|
||||
io.deq.bits := dataBuf(3).io.deq.bits
|
||||
|
||||
dataBuf(0).io.deq.ready := false.B
|
||||
dataBuf(1).io.deq.ready := false.B
|
||||
dataBuf(2).io.deq.ready := false.B
|
||||
dataBuf(3).io.deq.ready := io.deq.ready
|
||||
} .otherwise{
|
||||
io.deq.valid := false.B
|
||||
io.deq.bits := 0.U
|
||||
|
||||
dataBuf(0).io.deq.ready := false.B
|
||||
dataBuf(1).io.deq.ready := false.B
|
||||
dataBuf(2).io.deq.ready := false.B
|
||||
dataBuf(3).io.deq.ready := io.deq.ready
|
||||
when( rPtr === i.U & ~isEmpty){
|
||||
io.sram(i).addrr := io.sram_r.addrr
|
||||
io.sram(i).enr := io.sram_r.enr
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
io.sram_r.datar := Mux1H( ( 0 until depth).map{ i =>
|
||||
( rPtr === i.U ) -> io.sram(i).datar,
|
||||
})
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
class SMUnit extends SMUnitBase {
|
||||
class SMUnit(depth: Int = 4) extends SMUnitBase(depth) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user