2024-11-01 14:53:52 +08:00
|
|
|
package BACK
|
|
|
|
|
|
|
|
|
|
import chisel3._
|
|
|
|
|
import chisel3.util._
|
|
|
|
|
|
|
|
|
|
import org.chipsalliance.cde.config._
|
|
|
|
|
import freechips.rocketchip.diplomacy._
|
|
|
|
|
import freechips.rocketchip.tilelink._
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SimpleSRAM()(implicit p: Parameters) extends BackModule{
|
|
|
|
|
class SimpleSRAMIO extends Bundle{
|
|
|
|
|
val mem = Flipped(new Mem_Port_Bundle)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val io: SimpleSRAMIO = IO(new SimpleSRAMIO)
|
|
|
|
|
|
2024-11-04 17:38:51 +08:00
|
|
|
val mem = SyncReadMem(1024, UInt(32.W))
|
2024-11-01 14:53:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
io.mem.rdata := DontCare
|
|
|
|
|
|
|
|
|
|
// when(io.mem.valid) {
|
|
|
|
|
|
2024-11-04 17:38:51 +08:00
|
|
|
when( io.mem.valid & io.mem.wstrb.extract(0) ){
|
|
|
|
|
mem.write( io.mem.addr(11,2), io.mem.wdata )
|
2024-11-01 14:53:52 +08:00
|
|
|
|
2024-11-04 17:38:51 +08:00
|
|
|
assert( io.mem.wstrb.extract(1) & io.mem.wstrb.extract(2) & io.mem.wstrb.extract(3) )
|
|
|
|
|
}
|
2024-11-01 14:53:52 +08:00
|
|
|
|
2024-11-04 17:38:51 +08:00
|
|
|
io.mem.rdata := mem.read(io.mem.addr(11,2), true.B)
|
2024-11-01 14:53:52 +08:00
|
|
|
|
2024-11-04 17:38:51 +08:00
|
|
|
|
2024-11-01 14:53:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
// when ( io.mem.wstrb =/= 0.U ) {
|
|
|
|
|
// when(io.mem.wstrb.extract(0)) { mem(io.mem.addr(11,2))(0) := io.mem.wdata(7,0) }
|
|
|
|
|
// when(io.mem.wstrb.extract(1)) { mem(io.mem.addr(11,2))(1) := io.mem.wdata(15,8) }
|
|
|
|
|
// when(io.mem.wstrb.extract(2)) { mem(io.mem.addr(11,2))(2) := io.mem.wdata(23,16) }
|
|
|
|
|
// when(io.mem.wstrb.extract(3)) { mem(io.mem.addr(11,2))(3) := io.mem.wdata(31,24) }
|
|
|
|
|
// } .otherwise { io.mem.rdata := Cat( mem(io.mem.addr(11,2)).reverse ) }
|
|
|
|
|
// }
|
|
|
|
|
|
2024-11-01 16:01:39 +08:00
|
|
|
val isReadAck = RegInit(false.B)
|
2024-11-01 14:53:52 +08:00
|
|
|
when( io.mem.fire ){
|
2024-11-01 16:01:39 +08:00
|
|
|
isReadAck := false.B
|
|
|
|
|
} .elsewhen( io.mem.valid & io.mem.wstrb === 0.U ){
|
|
|
|
|
isReadAck := true.B
|
2024-11-01 14:53:52 +08:00
|
|
|
}
|
|
|
|
|
|
2024-11-01 16:01:39 +08:00
|
|
|
io.mem.ready :=
|
|
|
|
|
( io.mem.wstrb =/= 0.U & true.B ) |
|
|
|
|
|
( io.mem.wstrb === 0.U & isReadAck )
|
2024-11-01 14:53:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|