@@ -20,6 +20,9 @@ case class LoadStoreUnitParams(
2020 val storeDataEntries : Int = 8 , // limited to 8 unissued store requests
2121 val addressEntries : Int = 16 , // limited to 16 unissued memory requests
2222
23+ // implementation details
24+ val metadataAsFlops : Boolean = false , // metadata can be implemented as flops or as SRAM
25+
2326 // purely performance optimizations; turn off if bad things are happening
2427 val smemDoesntReorder : Boolean = true , // see comment above LSQMemUpdate
2528 val fastHeadUpdate : Boolean = true , // allow logical head to update on same cycle as memUpdate / memResponse
@@ -1000,7 +1003,7 @@ class LoadStoreUnit(implicit p: Parameters) extends CoreModule()(p) {
10001003
10011004 val totalQueueEntries = muonParams.numWarps * (muonParams.lsu.numGlobalLdqEntries + muonParams.lsu.numGlobalStqEntries + muonParams.lsu.numSharedLdqEntries + muonParams.lsu.numSharedStqEntries)
10021005
1003- val (metadataMemR0, metadataMemR1, metadataMemW) = {
1006+ val (metadataMemR0, metadataMemR1, metadataMemW) = if (muonParams.lsu.metadataAsFlops) {
10041007 val addrWidth = log2Up(totalQueueEntries)
10051008 val metadataMem = RegInit (VecInit .fill(totalQueueEntries)(0 .U .asTypeOf(new Metadata )))
10061009 val metadataMemR0 = Wire (new MemoryReadPort (new Metadata , addrWidth))
@@ -1015,6 +1018,19 @@ class LoadStoreUnit(implicit p: Parameters) extends CoreModule()(p) {
10151018 metadataMem(metadataMemW.address) := metadataMemW.data
10161019 }
10171020
1021+ (metadataMemR0, metadataMemR1, metadataMemW)
1022+ } else {
1023+ val metadataMem = MultiReadOneWriteSRAM (
1024+ totalQueueEntries,
1025+ new Metadata ,
1026+ numReadPorts = 2 ,
1027+ masked = false
1028+ )
1029+
1030+ val metadataMemR0 = metadataMem.readPorts(0 )
1031+ val metadataMemR1 = metadataMem.readPorts(1 )
1032+ val metadataMemW = metadataMem.writePorts(0 )
1033+
10181034 (metadataMemR0, metadataMemR1, metadataMemW)
10191035 }
10201036
0 commit comments