Skip to content

Commit a7fe2a3

Browse files
committed
Preprocess: fix VecCommitData index and add numPregs check
1 parent 62151a3 commit a7fe2a3

File tree

4 files changed

+55
-28
lines changed

4 files changed

+55
-28
lines changed

src/main/scala/Bundles.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,12 @@ class TriggerCSRState extends DifftestBaseBundle {
175175
val tinfo = UInt(64.W)
176176
}
177177

178-
class ArchRenameTable(numRegs: Int, pregIdxWidth: Int) extends DifftestBaseBundle {
179-
val value = Vec(numRegs, UInt(pregIdxWidth.W))
178+
class ArchRenameTable(numRegs: Int, numPregs: Int) extends DifftestBaseBundle {
179+
val value = Vec(numRegs, UInt(log2Ceil(numPregs).W))
180180
}
181181

182-
class PhyRegState(numRegs: Int) extends DifftestBaseBundle {
183-
val value = Vec(numRegs, UInt(64.W))
182+
class PhyRegState(numPregs: Int) extends DifftestBaseBundle {
183+
val value = Vec(numPregs, UInt(64.W))
184184
}
185185

186186
class DataWriteback(val numElements: Int) extends DifftestBaseBundle with HasValid with HasAddress {
@@ -194,7 +194,7 @@ class VecDataWriteback(val numElements: Int) extends DifftestBaseBundle with Has
194194
class ArchRegState(numRegs: Int) extends DifftestBaseBundle {
195195
val value = Vec(numRegs, UInt(64.W))
196196

197-
def apply(i: UInt): UInt = value(i(log2Ceil(numRegs + 1), 0))
197+
def apply(i: UInt): UInt = value(i(log2Ceil(numRegs), 0))
198198
def apply(i: Int): UInt = value(i)
199199
def toSeq: Seq[UInt] = value
200200

src/main/scala/Difftest.scala

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -365,34 +365,40 @@ class DiffArchVecRegState extends ArchVecRegState with DifftestBundle {
365365
override val supportsDelta: Boolean = true
366366
}
367367

368-
abstract class DiffArchRenameTable(numRegs: Int, pregIdxWidth: Int)
369-
extends ArchRenameTable(numRegs, pregIdxWidth)
368+
abstract class DiffArchRenameTable(numRegs: Int, val numPregs: Int)
369+
extends ArchRenameTable(numRegs, numPregs)
370370
with DifftestBundle {
371371
override val updateDependency: Seq[String] = Seq("commit", "event")
372372
override val supportsDelta: Boolean = true
373-
override def classArgs: Map[String, Any] = Map("pregIdxWidth" -> pregIdxWidth)
373+
override def classArgs: Map[String, Any] = Map("numPregs" -> numPregs)
374374
}
375-
class DiffArchIntRenameTable(pregIdxWidth: Int) extends DiffArchRenameTable(32, pregIdxWidth) {
375+
376+
class DiffArchIntRenameTable(numPregs: Int) extends DiffArchRenameTable(32, numPregs) {
376377
override val desiredCppName: String = "rat_int"
377378
}
378-
class DiffArchFpRenameTable(pregIdxWidth: Int) extends DiffArchRenameTable(32, pregIdxWidth) {
379+
380+
class DiffArchFpRenameTable(numPregs: Int) extends DiffArchRenameTable(32, numPregs) {
379381
override val desiredCppName: String = "rat_fp"
380382
}
381-
class DiffArchVecRenameTable(pregIdxWidth: Int) extends DiffArchRenameTable(64, pregIdxWidth) {
383+
384+
class DiffArchVecRenameTable(numPregs: Int) extends DiffArchRenameTable(64, numPregs) {
382385
override val desiredCppName: String = "rat_vec"
383386
}
384387

385-
abstract class DiffPhyRegState(numRegs: Int) extends PhyRegState(numRegs) with DifftestBundle {
388+
abstract class DiffPhyRegState(val numPregs: Int) extends PhyRegState(numPregs) with DifftestBundle {
386389
override val supportsDelta: Boolean = true
387-
override def classArgs: Map[String, Any] = Map("numRegs" -> numRegs)
390+
override def classArgs: Map[String, Any] = Map("numPregs" -> numPregs)
388391
}
389-
class DiffPhyIntRegState(numRegs: Int) extends DiffPhyRegState(numRegs) {
392+
393+
class DiffPhyIntRegState(numPregs: Int) extends DiffPhyRegState(numPregs) {
390394
override val desiredCppName: String = "pregs_int"
391395
}
392-
class DiffPhyFpRegState(numRegs: Int) extends DiffPhyRegState(numRegs) {
396+
397+
class DiffPhyFpRegState(numPregs: Int) extends DiffPhyRegState(numPregs) {
393398
override val desiredCppName: String = "pregs_fp"
394399
}
395-
class DiffPhyVecRegState(numRegs: Int) extends DiffPhyRegState(numRegs) {
400+
401+
class DiffPhyVecRegState(numPregs: Int) extends DiffPhyRegState(numPregs) {
396402
override val desiredCppName: String = "pregs_vec"
397403
}
398404

src/main/scala/Gateway.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,12 @@ object Gateway {
185185
}
186186

187187
def getInstance(bundles: Seq[DifftestBundle]): Seq[DifftestBundle] = {
188-
bundles ++ Preprocess.getArchRegs(bundles, false)
188+
val archRegs = if (!bundles.exists(_.desiredCppName == "regs_int")) {
189+
Preprocess.getArchRegs(bundles, false)
190+
} else {
191+
Seq.empty
192+
}
193+
bundles ++ archRegs
189194
}
190195

191196
def collect(): GatewayResult = {

src/main/scala/Preprocess.scala

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,31 @@ object Preprocess {
3232
Seq(("int", new DiffArchIntRegState), ("fp", new DiffArchFpRegState), ("vec", new DiffArchVecRegState)).flatMap {
3333
case (suffix, gen) =>
3434
val pregs = bundles.filter(_.desiredCppName == "pregs_" + suffix).asInstanceOf[Seq[DiffPhyRegState]]
35-
val rats = bundles.filter(_.desiredCppName == "rat_" + suffix).asInstanceOf[Seq[DiffArchRenameTable]]
36-
pregs.zip(rats).map { case (preg, rat) =>
35+
if (pregs.nonEmpty) {
36+
require(!bundles.exists(_.desiredCppName == "regs_" + suffix))
3737
if (isHardware) {
38-
val archReg = Wire(gen)
39-
archReg.coreid := preg.coreid
40-
archReg.value.zipWithIndex.foreach { case (data, idx) =>
41-
data := preg.value(rat.value(idx))
38+
val needRat = pregs.head.numPregs != gen.value.size
39+
val rats = bundles.filter(_.desiredCppName == "rat_" + suffix).asInstanceOf[Seq[DiffArchRenameTable]]
40+
if (needRat) require(rats.length == pregs.length)
41+
pregs.zipWithIndex.map { case (preg, idx) =>
42+
val archReg = Wire(gen)
43+
archReg.coreid := preg.coreid
44+
if (needRat) {
45+
val rat = rats(idx)
46+
require(rat.numPregs == preg.numPregs)
47+
archReg.value.zipWithIndex.foreach { case (data, vid) =>
48+
data := preg.value(rat.value(vid))
49+
}
50+
} else {
51+
archReg.value := preg.value
52+
}
53+
archReg
4254
}
43-
archReg
4455
} else {
45-
gen
56+
Seq.fill(pregs.length)(gen)
4657
}
58+
} else {
59+
Seq.empty
4760
}
4861
}
4962
}
@@ -74,7 +87,10 @@ object Preprocess {
7487
gen.coreid := c.coreid
7588
gen.index := c.index
7689
gen.valid := c.valid && (c.v0wen || c.vecwen)
77-
gen.data := VecInit(c.otherwpdest.map { wpdest => vreg(wpdest) })
90+
gen.data := VecInit(c.otherwpdest.flatMap { wpdest =>
91+
val splitDest = (wpdest << 1).asUInt
92+
Seq(vreg(splitDest), vreg(splitDest + 1))
93+
})
7894
gen
7995
}
8096
Seq(cd) ++ vcd.toSeq
@@ -87,8 +103,8 @@ object Preprocess {
87103
class PreprocessEndpoint(bundles: Seq[DifftestBundle], config: GatewayConfig) extends Module {
88104
val in = IO(Input(MixedVec(bundles)))
89105

90-
def hasBundle(name: String): Boolean = in.exists(_.desiredCppName == name)
91-
val replaceReg = if (!config.lazyArchUpdate && hasBundle("pregs_int")) { // extract ArchReg in Hardware
106+
val replaceReg = if (!config.lazyArchUpdate && in.exists(_.desiredCppName == "pregs_int")) {
107+
// extract ArchReg in Hardware
92108
Preprocess.replaceRegs(in)
93109
} else {
94110
in

0 commit comments

Comments
 (0)