Skip to content

Commit 15ee59e

Browse files
wakafa1Guo-HYIvyfeather
authored
Merge coupledL2 into master (OpenXiangShan#2064)
* icache: Acquire -> Get to L2 * gitmodules: add coupledL2 as submodule * cpl2: merge coupledL2 into master * Changes includes: * coupledL2 integration * modify user&echo fields in i$/d$/ptw * set d$ never always-releasedata * remove hw perfcnt connection for L2 * bump utility * icache: remove unused releaseUnit * config: minimalconfig includes l2 * Otherwise, dirty bits maintainence may be broken * Known issue: L2 should have more than 1 bank to avoid compiling problem * bump Utility * bump coupledL2: fix bugs in dual-core * bump coupledL2 * icache: set icache as non-coherent node * bump coupledL2: fix dirty problem in L2 ProbeAckData --------- Co-authored-by: guohongyu <[email protected]> Co-authored-by: XiChen <[email protected]>
1 parent e3cd2c1 commit 15ee59e

File tree

12 files changed

+66
-54
lines changed

12 files changed

+66
-54
lines changed

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,6 @@
1616
[submodule "utility"]
1717
path = utility
1818
url = https://github.com/OpenXiangShan/utility
19+
[submodule "coupledL2"]
20+
path = coupledL2
21+
url = https://github.com/OpenXiangShan/coupledL2

build.sc

+14
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ object huancun extends XSModule with SbtModule {
119119
)
120120
}
121121

122+
object coupledL2 extends XSModule with SbtModule {
123+
124+
override def millSourcePath = os.pwd / "coupledL2"
125+
126+
override def moduleDeps = super.moduleDeps ++ Seq(
127+
rocketchip,
128+
huancun,
129+
utility
130+
)
131+
}
132+
122133
object difftest extends XSModule with SbtModule {
123134
override def millSourcePath = os.pwd / "difftest"
124135
}
@@ -141,6 +152,7 @@ trait CommonXiangShan extends XSModule with SbtModule { m =>
141152
def rocketModule: PublishModule
142153
def difftestModule: PublishModule
143154
def huancunModule: PublishModule
155+
def coupledL2Module: PublishModule
144156
def fudianModule: PublishModule
145157
def utilityModule: PublishModule
146158

@@ -154,6 +166,7 @@ trait CommonXiangShan extends XSModule with SbtModule { m =>
154166
rocketModule,
155167
difftestModule,
156168
huancunModule,
169+
coupledL2Module,
157170
fudianModule,
158171
utilityModule
159172
)
@@ -174,6 +187,7 @@ object XiangShan extends CommonXiangShan {
174187
override def rocketModule = rocketchip
175188
override def difftestModule = difftest
176189
override def huancunModule = huancun
190+
override def coupledL2Module = coupledL2
177191
override def fudianModule = fudian
178192
override def utilityModule = utility
179193
}

coupledL2

Submodule coupledL2 added at 779ec27

src/main/scala/top/Configs.scala

+19-23
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import xiangshan.cache.DCacheParameters
3333
import xiangshan.cache.mmu.{L2TLBParameters, TLBParameters}
3434
import device.{EnableJtag, XSDebugModuleParams}
3535
import huancun._
36+
import coupledL2._
3637

3738
class BaseConfig(n: Int) extends Config((site, here, up) => {
3839
case XLen => 64
@@ -180,7 +181,14 @@ class MinimalConfig(n: Int = 1) extends Config(
180181
l3nWays = 8,
181182
spSize = 2,
182183
),
183-
L2CacheParamsOpt = None, // remove L2 Cache
184+
L2CacheParamsOpt = Some(L2Param(
185+
name = "L2",
186+
ways = 8,
187+
sets = 128,
188+
echoField = Seq(huancun.DirtyField()),
189+
prefetch = None
190+
)),
191+
L2NBanks = 2,
184192
prefetcher = None // if L2 pf_recv_node does not exist, disable SMS prefetcher
185193
)
186194
)
@@ -190,14 +198,12 @@ class MinimalConfig(n: Int = 1) extends Config(
190198
L3CacheParamsOpt = Some(up(SoCParamsKey).L3CacheParamsOpt.get.copy(
191199
sets = 1024,
192200
inclusive = false,
193-
clientCaches = tiles.map{ p =>
194-
CacheParameters(
195-
"dcache",
196-
sets = 2 * p.dcacheParametersOpt.get.nSets,
197-
ways = p.dcacheParametersOpt.get.nWays + 2,
198-
blockGranularity = log2Ceil(2 * p.dcacheParametersOpt.get.nSets),
199-
aliasBitsOpt = None
200-
)
201+
clientCaches = tiles.map{ core =>
202+
val clientDirBytes = tiles.map{ t =>
203+
t.L2NBanks * t.L2CacheParamsOpt.map(_.toCacheParams.capacity).getOrElse(0)
204+
}.sum
205+
val l2params = core.L2CacheParamsOpt.get.toCacheParams
206+
l2params.copy(sets = 2 * clientDirBytes / core.L2NBanks / l2params.ways / 64)
201207
},
202208
simulation = !site(DebugOptionsKey).FPGAPlatform
203209
)),
@@ -248,28 +254,18 @@ class WithNKBL2
248254
val upParams = up(XSTileKey)
249255
val l2sets = n * 1024 / banks / ways / 64
250256
upParams.map(p => p.copy(
251-
L2CacheParamsOpt = Some(HCCacheParameters(
257+
L2CacheParamsOpt = Some(L2Param(
252258
name = "L2",
253-
level = 2,
254259
ways = ways,
255260
sets = l2sets,
256-
inclusive = inclusive,
257-
alwaysReleaseData = alwaysReleaseData,
258-
clientCaches = Seq(CacheParameters(
261+
clientCaches = Seq(L1Param(
259262
"dcache",
260263
sets = 2 * p.dcacheParametersOpt.get.nSets / banks,
261264
ways = p.dcacheParametersOpt.get.nWays + 2,
262-
blockGranularity = log2Ceil(2 * p.dcacheParametersOpt.get.nSets / banks),
263265
aliasBitsOpt = p.dcacheParametersOpt.get.aliasBitsOpt
264266
)),
265-
reqField = Seq(PreferCacheField()),
266-
echoField = Seq(DirtyField()),
267-
prefetch = Some(huancun.prefetch.PrefetchReceiverParams()),
268-
enablePerf = true,
269-
sramDepthDiv = 2,
270-
tagECC = Some("secded"),
271-
dataECC = Some("secded"),
272-
simulation = !site(DebugOptionsKey).FPGAPlatform
267+
echoField = Seq(huancun.DirtyField()),
268+
prefetch = Some(coupledL2.prefetch.PrefetchReceiverParams())
273269
)),
274270
L2NBanks = banks
275271
))

src/main/scala/xiangshan/Parameters.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import freechips.rocketchip.diplomacy.AddressSet
3030
import system.SoCParamsKey
3131
import huancun._
3232
import huancun.debug._
33+
import coupledL2._
3334
import xiangshan.mem.prefetch.{PrefetcherParams, SMSParams}
3435

3536
import scala.math.min
@@ -258,12 +259,11 @@ case class XSCoreParameters
258259
nProbeEntries = 8,
259260
nReleaseEntries = 18
260261
)),
261-
L2CacheParamsOpt: Option[HCCacheParameters] = Some(HCCacheParameters(
262+
L2CacheParamsOpt: Option[L2Param] = Some(L2Param(
262263
name = "l2",
263-
level = 2,
264264
ways = 8,
265265
sets = 1024, // default 512KB L2
266-
prefetch = Some(huancun.prefetch.PrefetchReceiverParams())
266+
prefetch = Some(coupledL2.prefetch.PrefetchReceiverParams())
267267
)),
268268
L2NBanks: Int = 1,
269269
usePTWRepeater: Boolean = false,

src/main/scala/xiangshan/XSTile.scala

+11-8
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import freechips.rocketchip.interrupts._
88
import freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, BusErrors}
99
import freechips.rocketchip.tilelink._
1010
import huancun.debug.TLLogger
11-
import huancun.{HCCacheParamsKey, HuanCun}
11+
import coupledL2.{L2ParamKey, CoupledL2}
1212
import system.HasSoCParameter
1313
import top.BusPerfMonitor
1414
import utility.{DelayN, ResetGen, TLClientsMerger, TLEdgeBuffer}
@@ -79,8 +79,8 @@ class XSTile()(implicit p: Parameters) extends LazyModule
7979
private val core = LazyModule(new XSCore())
8080
private val misc = LazyModule(new XSTileMisc())
8181
private val l2cache = coreParams.L2CacheParamsOpt.map(l2param =>
82-
LazyModule(new HuanCun()(new Config((_, _, _) => {
83-
case HCCacheParamsKey => l2param.copy(enableTopDown = env.EnableTopDown)
82+
LazyModule(new CoupledL2()(new Config((_, _, _) => {
83+
case L2ParamKey => l2param
8484
})))
8585
)
8686

@@ -140,18 +140,21 @@ class XSTile()(implicit p: Parameters) extends LazyModule
140140
core.module.io.hartId := io.hartId
141141
core.module.io.reset_vector := DelayN(io.reset_vector, 5)
142142
io.cpu_halt := core.module.io.cpu_halt
143-
if(l2cache.isDefined){
144-
core.module.io.perfEvents.zip(l2cache.get.module.io.perfEvents.flatten).foreach(x => x._1.value := x._2)
143+
if (l2cache.isDefined) {
144+
// TODO: add perfEvents of L2
145+
// core.module.io.perfEvents.zip(l2cache.get.module.io.perfEvents.flatten).foreach(x => x._1.value := x._2)
145146
}
146147
else {
147148
core.module.io.perfEvents <> DontCare
148149
}
149150

150151
misc.module.beu_errors.icache <> core.module.io.beu_errors.icache
151152
misc.module.beu_errors.dcache <> core.module.io.beu_errors.dcache
152-
if(l2cache.isDefined){
153-
misc.module.beu_errors.l2.ecc_error.valid := l2cache.get.module.io.ecc_error.valid
154-
misc.module.beu_errors.l2.ecc_error.bits := l2cache.get.module.io.ecc_error.bits
153+
if (l2cache.isDefined) {
154+
// TODO: add ECC interface of L2
155+
// misc.module.beu_errors.l2.ecc_error.valid := l2cache.get.module.io.ecc_error.valid
156+
// misc.module.beu_errors.l2.ecc_error.bits := l2cache.get.module.io.ecc_error.bits
157+
misc.module.beu_errors.l2 <> 0.U.asTypeOf(misc.module.beu_errors.l2)
155158
} else {
156159
misc.module.beu_errors.l2 <> 0.U.asTypeOf(misc.module.beu_errors.l2)
157160
}

src/main/scala/xiangshan/backend/MemBlock.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import chisel3._
2121
import chisel3.util._
2222
import freechips.rocketchip.diplomacy.{BundleBridgeSource, LazyModule, LazyModuleImp}
2323
import freechips.rocketchip.tile.HasFPUParameters
24-
import huancun.PrefetchRecv
24+
import coupledL2.PrefetchRecv
2525
import utils._
2626
import utility._
2727
import xiangshan._

src/main/scala/xiangshan/cache/dcache/DCacheWrapper.scala

+4-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import freechips.rocketchip.diplomacy.{IdRange, LazyModule, LazyModuleImp, Trans
2727
import freechips.rocketchip.tilelink._
2828
import freechips.rocketchip.util.{BundleFieldBase, UIntToOH1}
2929
import device.RAMHelper
30-
import huancun.{AliasField, AliasKey, DirtyField, PreferCacheField, PrefetchField}
30+
import coupledL2.{AliasField, AliasKey, DirtyField, PrefetchField}
3131
import utility.FastArbiter
3232
import mem.{AddPipelineReg}
3333
import xiangshan.cache.dcache.ReplayCarry
@@ -50,18 +50,17 @@ case class DCacheParameters
5050
nMMIOEntries: Int = 1,
5151
nMMIOs: Int = 1,
5252
blockBytes: Int = 64,
53-
alwaysReleaseData: Boolean = true
53+
alwaysReleaseData: Boolean = false
5454
) extends L1CacheParameters {
5555
// if sets * blockBytes > 4KB(page size),
5656
// cache alias will happen,
5757
// we need to avoid this by recoding additional bits in L2 cache
5858
val setBytes = nSets * blockBytes
5959
val aliasBitsOpt = if(setBytes > pageSize) Some(log2Ceil(setBytes / pageSize)) else None
6060
val reqFields: Seq[BundleFieldBase] = Seq(
61-
PrefetchField(),
62-
PreferCacheField()
61+
PrefetchField()
6362
) ++ aliasBitsOpt.map(AliasField)
64-
val echoFields: Seq[BundleFieldBase] = Seq(DirtyField())
63+
val echoFields: Seq[BundleFieldBase] = Nil
6564

6665
def tagCode: Code = Code.fromString(tagECC)
6766

src/main/scala/xiangshan/cache/dcache/mainpipe/MissQueue.scala

+1-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import freechips.rocketchip.tilelink.ClientStates._
2727
import freechips.rocketchip.tilelink.MemoryOpCategories._
2828
import freechips.rocketchip.tilelink.TLPermissions._
2929
import difftest._
30-
import huancun.{AliasKey, DirtyKey, PreferCacheKey, PrefetchKey}
30+
import coupledL2.{AliasKey, DirtyKey, PrefetchKey}
3131
import utility.FastArbiter
3232
import mem.{AddPipelineReg}
3333
import mem.trace._
@@ -465,8 +465,6 @@ class MissEntry(edge: TLEdgeOut)(implicit p: Parameters) extends DCacheModule {
465465
io.mem_acquire.bits.user.lift(AliasKey).foreach( _ := req.vaddr(13, 12))
466466
// trigger prefetch
467467
io.mem_acquire.bits.user.lift(PrefetchKey).foreach(_ := Mux(io.l2_pf_store_only, req.isFromStore, true.B))
468-
// prefer not to cache data in L2 by default
469-
io.mem_acquire.bits.user.lift(PreferCacheKey).foreach(_ := false.B)
470468
require(nSets <= 256)
471469

472470
io.mem_grant.ready := !w_grantlast && s_acquire

src/main/scala/xiangshan/cache/dcache/mainpipe/WritebackQueue.scala

+5-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import chisel3._
2121
import chisel3.util._
2222
import freechips.rocketchip.tilelink.TLPermissions._
2323
import freechips.rocketchip.tilelink.{TLArbiter, TLBundleC, TLBundleD, TLEdgeOut}
24-
import huancun.DirtyKey
24+
import coupledL2.DirtyKey
2525
import utils.{HasPerfEvents, HasTLDump, XSDebug, XSPerfAccumulate}
2626

2727
class WritebackReqCtrl(implicit p: Parameters) extends DCacheBundle {
@@ -210,7 +210,8 @@ class WritebackEntry(edge: TLEdgeOut)(implicit p: Parameters) extends DCacheModu
210210
// --------------------------------------------------------------------------------
211211
// s_invalid: receive requests
212212
// new req entering
213-
when (io.req.valid && io.primary_valid && io.primary_ready) {
213+
val alloc = io.req.valid && io.primary_valid && io.primary_ready
214+
when (alloc) {
214215
assert (remain === 0.U)
215216
req := io.req.bits
216217
s_data_override := false.B
@@ -313,7 +314,7 @@ class WritebackEntry(edge: TLEdgeOut)(implicit p: Parameters) extends DCacheModu
313314
data = beat_data(beat)
314315
)._2
315316

316-
voluntaryReleaseData.echo.lift(DirtyKey).foreach(_ := req.dirty)
317+
// voluntaryReleaseData.echo.lift(DirtyKey).foreach(_ := req.dirty)
317318
when(busy) {
318319
assert(!req.dirty || req.hasData)
319320
}
@@ -517,7 +518,7 @@ class WritebackEntry(edge: TLEdgeOut)(implicit p: Parameters) extends DCacheModu
517518
data := mergeData(data, io.release_update.bits.data_delayed, io.release_update.bits.mask_delayed)
518519
}
519520

520-
when (!s_data_override && req.hasData) {
521+
when (!s_data_override && (req.hasData || RegNext(alloc))) {
521522
data := io.req_data.data
522523
}
523524

src/main/scala/xiangshan/frontend/icache/ICache.scala

+3-6
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import chisel3.util.{DecoupledIO, _}
2222
import freechips.rocketchip.diplomacy.{IdRange, LazyModule, LazyModuleImp, TransferSizes}
2323
import freechips.rocketchip.tilelink._
2424
import freechips.rocketchip.util.BundleFieldBase
25-
import huancun.{AliasField, DirtyField, PreferCacheField, PrefetchField}
25+
import coupledL2.{AliasField, DirtyField, PrefetchField}
2626
import xiangshan._
2727
import xiangshan.frontend._
2828
import xiangshan.cache._
@@ -54,10 +54,9 @@ case class ICacheParameters(
5454
val setBytes = nSets * blockBytes
5555
val aliasBitsOpt = DCacheParameters().aliasBitsOpt //if(setBytes > pageSize) Some(log2Ceil(setBytes / pageSize)) else None
5656
val reqFields: Seq[BundleFieldBase] = Seq(
57-
PrefetchField(),
58-
PreferCacheField()
57+
PrefetchField()
5958
) ++ aliasBitsOpt.map(AliasField)
60-
val echoFields: Seq[BundleFieldBase] = Seq(DirtyField())
59+
val echoFields: Seq[BundleFieldBase] = Nil
6160
def tagCode: Code = Code.fromString(tagECC)
6261
def dataCode: Code = Code.fromString(dataECC)
6362
def replacement = ReplacementPolicy.fromString(replacer,nWays,nSets)
@@ -510,8 +509,6 @@ class ICache()(implicit p: Parameters) extends LazyModule with HasICacheParamete
510509
Seq(TLMasterParameters.v1(
511510
name = "icache",
512511
sourceId = IdRange(0, cacheParams.nMissEntries + cacheParams.nPrefetchEntries),
513-
supportsProbe = TransferSizes(blockBytes),
514-
supportsHint = TransferSizes(blockBytes)
515512
)),
516513
requestFields = cacheParams.reqFields,
517514
echoFields = cacheParams.echoFields

src/main/scala/xiangshan/frontend/icache/ICacheMissUnit.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import freechips.rocketchip.tilelink.ClientStates._
2424
import freechips.rocketchip.tilelink.TLPermissions._
2525
import freechips.rocketchip.tilelink._
2626
import xiangshan._
27-
import huancun.{AliasKey, DirtyKey}
27+
import coupledL2.AliasKey
2828
import xiangshan.cache._
2929
import utils._
3030
import utility._

0 commit comments

Comments
 (0)