Rob.scala (0d32f7132f120ac0b32ab552fe0da4934208dd01) Rob.scala (7d45a146d3c44839ba821bb91ca4950dc2b817f2)
1/***************************************************************************************
2* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3* Copyright (c) 2020-2021 Peng Cheng Laboratory
4*
5* XiangShan is licensed under Mulan PSL v2.
6* You can use this software according to the terms and conditions of the Mulan PSL v2.
7* You may obtain a copy of Mulan PSL v2 at:
8* http://license.coscl.org.cn/MulanPSL2

--- 1232 unchanged lines hidden (view full) ---

1241 val wpc = Wire(Vec(CommitWidth, UInt(XLEN.W)))
1242
1243 for(i <- 0 until CommitWidth) {
1244 val idx = deqPtrVec(i).value
1245 wdata(i) := debug_exuData(idx)
1246 wpc(i) := SignExt(commitDebugUop(i).cf.pc, XLEN)
1247 }
1248
1/***************************************************************************************
2* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3* Copyright (c) 2020-2021 Peng Cheng Laboratory
4*
5* XiangShan is licensed under Mulan PSL v2.
6* You can use this software according to the terms and conditions of the Mulan PSL v2.
7* You may obtain a copy of Mulan PSL v2 at:
8* http://license.coscl.org.cn/MulanPSL2

--- 1232 unchanged lines hidden (view full) ---

1241 val wpc = Wire(Vec(CommitWidth, UInt(XLEN.W)))
1242
1243 for(i <- 0 until CommitWidth) {
1244 val idx = deqPtrVec(i).value
1245 wdata(i) := debug_exuData(idx)
1246 wpc(i) := SignExt(commitDebugUop(i).cf.pc, XLEN)
1247 }
1248
1249 if (env.EnableDifftest) {
1250 for (i <- 0 until CommitWidth) {
1251 val difftest = Module(new DifftestInstrCommit)
1252 // assgin default value
1253 difftest.io := DontCare
1254
1255 difftest.io.clock := clock
1256 difftest.io.coreid := io.hartId
1257 difftest.io.index := i.U
1258
1259 val ptr = deqPtrVec(i).value
1260 val uop = commitDebugUop(i)
1261 val exuOut = debug_exuDebug(ptr)
1262 val exuData = debug_exuData(ptr)
1263 difftest.io.valid := RegNext(RegNext(RegNext(io.commits.commitValid(i) && io.commits.isCommit)))
1264 difftest.io.pc := RegNext(RegNext(RegNext(SignExt(uop.cf.pc, XLEN))))
1265 difftest.io.instr := RegNext(RegNext(RegNext(uop.cf.instr)))
1266 difftest.io.robIdx := RegNext(RegNext(RegNext(ZeroExt(ptr, 10))))
1267 difftest.io.lqIdx := RegNext(RegNext(RegNext(ZeroExt(uop.lqIdx.value, 7))))
1268 difftest.io.sqIdx := RegNext(RegNext(RegNext(ZeroExt(uop.sqIdx.value, 7))))
1269 difftest.io.isLoad := RegNext(RegNext(RegNext(io.commits.info(i).commitType === CommitType.LOAD)))
1270 difftest.io.isStore := RegNext(RegNext(RegNext(io.commits.info(i).commitType === CommitType.STORE)))
1271 difftest.io.special := RegNext(RegNext(RegNext(CommitType.isFused(io.commits.info(i).commitType))))
1272 // when committing an eliminated move instruction,
1273 // we must make sure that skip is properly set to false (output from EXU is random value)
1274 difftest.io.skip := RegNext(RegNext(RegNext(Mux(uop.eliminatedMove, false.B, exuOut.isMMIO || exuOut.isPerfCnt))))
1275 difftest.io.isRVC := RegNext(RegNext(RegNext(uop.cf.pd.isRVC)))
1276 difftest.io.rfwen := RegNext(RegNext(RegNext(io.commits.commitValid(i) && io.commits.info(i).rfWen && io.commits.info(i).ldest =/= 0.U)))
1277 difftest.io.fpwen := RegNext(RegNext(RegNext(io.commits.commitValid(i) && io.commits.info(i).fpWen)))
1278 difftest.io.wpdest := RegNext(RegNext(RegNext(io.commits.info(i).pdest)))
1279 difftest.io.wdest := RegNext(RegNext(RegNext(io.commits.info(i).ldest)))
1280
1281 // // runahead commit hint
1282 // val runahead_commit = Module(new DifftestRunaheadCommitEvent)
1283 // runahead_commit.io.clock := clock
1284 // runahead_commit.io.coreid := io.hartId
1285 // runahead_commit.io.index := i.U
1286 // runahead_commit.io.valid := difftest.io.valid &&
1287 // (commitBranchValid(i) || commitIsStore(i))
1288 // // TODO: is branch or store
1289 // runahead_commit.io.pc := difftest.io.pc
1290 }
1291 }
1292 else if (env.AlwaysBasicDiff) {
1249 if (env.EnableDifftest || env.AlwaysBasicDiff) {
1293 // These are the structures used by difftest only and should be optimized after synthesis.
1294 val dt_eliminatedMove = Mem(RobSize, Bool())
1295 val dt_isRVC = Mem(RobSize, Bool())
1296 val dt_exuDebug = Reg(Vec(RobSize, new DebugBundle))
1297 for (i <- 0 until RenameWidth) {
1298 when (canEnqueue(i)) {
1299 dt_eliminatedMove(allocatePtrVec(i).value) := io.enq.req(i).bits.eliminatedMove
1300 dt_isRVC(allocatePtrVec(i).value) := io.enq.req(i).bits.cf.pd.isRVC
1301 }
1302 }
1303 for (wb <- exuWriteback) {
1304 when (wb.valid) {
1305 val wbIdx = wb.bits.uop.robIdx.value
1306 dt_exuDebug(wbIdx) := wb.bits.debug
1307 }
1308 }
1250 // These are the structures used by difftest only and should be optimized after synthesis.
1251 val dt_eliminatedMove = Mem(RobSize, Bool())
1252 val dt_isRVC = Mem(RobSize, Bool())
1253 val dt_exuDebug = Reg(Vec(RobSize, new DebugBundle))
1254 for (i <- 0 until RenameWidth) {
1255 when (canEnqueue(i)) {
1256 dt_eliminatedMove(allocatePtrVec(i).value) := io.enq.req(i).bits.eliminatedMove
1257 dt_isRVC(allocatePtrVec(i).value) := io.enq.req(i).bits.cf.pd.isRVC
1258 }
1259 }
1260 for (wb <- exuWriteback) {
1261 when (wb.valid) {
1262 val wbIdx = wb.bits.uop.robIdx.value
1263 dt_exuDebug(wbIdx) := wb.bits.debug
1264 }
1265 }
1309 // Always instantiate basic difftest modules.
1310 for (i <- 0 until CommitWidth) {
1311 val commitInfo = io.commits.info(i)
1312 val ptr = deqPtrVec(i).value
1313 val exuOut = dt_exuDebug(ptr)
1314 val eliminatedMove = dt_eliminatedMove(ptr)
1315 val isRVC = dt_isRVC(ptr)
1316
1266 for (i <- 0 until CommitWidth) {
1267 val commitInfo = io.commits.info(i)
1268 val ptr = deqPtrVec(i).value
1269 val exuOut = dt_exuDebug(ptr)
1270 val eliminatedMove = dt_eliminatedMove(ptr)
1271 val isRVC = dt_isRVC(ptr)
1272
1317 val difftest = Module(new DifftestBasicInstrCommit)
1318 difftest.io.clock := clock
1319 difftest.io.coreid := io.hartId
1320 difftest.io.index := i.U
1321 difftest.io.valid := RegNext(RegNext(RegNext(io.commits.commitValid(i) && io.commits.isCommit)))
1322 difftest.io.special := RegNext(RegNext(RegNext(CommitType.isFused(commitInfo.commitType))))
1323 difftest.io.skip := RegNext(RegNext(RegNext(Mux(eliminatedMove, false.B, exuOut.isMMIO || exuOut.isPerfCnt))))
1324 difftest.io.isRVC := RegNext(RegNext(RegNext(isRVC)))
1325 difftest.io.rfwen := RegNext(RegNext(RegNext(io.commits.commitValid(i) && commitInfo.rfWen && commitInfo.ldest =/= 0.U)))
1326 difftest.io.fpwen := RegNext(RegNext(RegNext(io.commits.commitValid(i) && commitInfo.fpWen)))
1327 difftest.io.wpdest := RegNext(RegNext(RegNext(commitInfo.pdest)))
1328 difftest.io.wdest := RegNext(RegNext(RegNext(commitInfo.ldest)))
1273 val difftest = DifftestModule(new DiffInstrCommit(NRPhyRegs), delay = 3, dontCare = true)
1274 difftest.clock := clock
1275 difftest.coreid := io.hartId
1276 difftest.index := i.U
1277 difftest.valid := io.commits.commitValid(i) && io.commits.isCommit
1278 difftest.skip := Mux(eliminatedMove, false.B, exuOut.isMMIO || exuOut.isPerfCnt)
1279 difftest.isRVC := isRVC
1280 difftest.rfwen := io.commits.commitValid(i) && commitInfo.rfWen && commitInfo.ldest =/= 0.U
1281 difftest.fpwen := io.commits.commitValid(i) && commitInfo.fpWen
1282 difftest.wpdest := commitInfo.pdest
1283 difftest.wdest := commitInfo.ldest
1284 difftest.nFused := Mux(CommitType.isFused(commitInfo.commitType), 1.U, 0.U)
1285
1286 if (env.EnableDifftest) {
1287 val uop = commitDebugUop(i)
1288 difftest.pc := SignExt(uop.cf.pc, XLEN)
1289 difftest.instr := uop.cf.instr
1290 difftest.robIdx := ZeroExt(ptr, 10)
1291 difftest.lqIdx := ZeroExt(uop.lqIdx.value, 7)
1292 difftest.sqIdx := ZeroExt(uop.sqIdx.value, 7)
1293 difftest.isLoad := io.commits.info(i).commitType === CommitType.LOAD
1294 difftest.isStore := io.commits.info(i).commitType === CommitType.STORE
1295 }
1329 }
1330 }
1331
1332 if (env.EnableDifftest) {
1333 for (i <- 0 until CommitWidth) {
1296 }
1297 }
1298
1299 if (env.EnableDifftest) {
1300 for (i <- 0 until CommitWidth) {
1334 val difftest = Module(new DifftestLoadEvent)
1335 difftest.io.clock := clock
1336 difftest.io.coreid := io.hartId
1337 difftest.io.index := i.U
1301 val difftest = DifftestModule(new DiffLoadEvent, delay = 3)
1302 difftest.clock := clock
1303 difftest.coreid := io.hartId
1304 difftest.index := i.U
1338
1339 val ptr = deqPtrVec(i).value
1340 val uop = commitDebugUop(i)
1341 val exuOut = debug_exuDebug(ptr)
1305
1306 val ptr = deqPtrVec(i).value
1307 val uop = commitDebugUop(i)
1308 val exuOut = debug_exuDebug(ptr)
1342 difftest.io.valid := RegNext(RegNext(RegNext(io.commits.commitValid(i) && io.commits.isCommit)))
1343 difftest.io.paddr := RegNext(RegNext(RegNext(exuOut.paddr)))
1344 difftest.io.opType := RegNext(RegNext(RegNext(uop.ctrl.fuOpType)))
1345 difftest.io.fuType := RegNext(RegNext(RegNext(uop.ctrl.fuType)))
1309 difftest.valid := io.commits.commitValid(i) && io.commits.isCommit
1310 difftest.paddr := exuOut.paddr
1311 difftest.opType := uop.ctrl.fuOpType
1312 difftest.fuType := uop.ctrl.fuType
1346 }
1347 }
1348
1313 }
1314 }
1315
1349 // Always instantiate basic difftest modules.
1350 if (env.EnableDifftest) {
1316 if (env.EnableDifftest || env.AlwaysBasicDiff) {
1351 val dt_isXSTrap = Mem(RobSize, Bool())
1352 for (i <- 0 until RenameWidth) {
1353 when (canEnqueue(i)) {
1354 dt_isXSTrap(allocatePtrVec(i).value) := io.enq.req(i).bits.ctrl.isXSTrap
1355 }
1356 }
1317 val dt_isXSTrap = Mem(RobSize, Bool())
1318 for (i <- 0 until RenameWidth) {
1319 when (canEnqueue(i)) {
1320 dt_isXSTrap(allocatePtrVec(i).value) := io.enq.req(i).bits.ctrl.isXSTrap
1321 }
1322 }
1357 val trapVec = io.commits.commitValid.zip(deqPtrVec).map{ case (v, d) => io.commits.isCommit && v && dt_isXSTrap(d.value) }
1358 val hitTrap = trapVec.reduce(_||_)
1359 val trapCode = PriorityMux(wdata.zip(trapVec).map(x => x._2 -> x._1))
1360 val trapPC = SignExt(PriorityMux(wpc.zip(trapVec).map(x => x._2 ->x._1)), XLEN)
1361 val difftest = Module(new DifftestTrapEvent)
1362 difftest.io.clock := clock
1363 difftest.io.coreid := io.hartId
1364 difftest.io.valid := hitTrap
1365 difftest.io.code := trapCode
1366 difftest.io.pc := trapPC
1367 difftest.io.cycleCnt := timer
1368 difftest.io.instrCnt := instrCnt
1369 difftest.io.hasWFI := hasWFI
1370 }
1371 else if (env.AlwaysBasicDiff) {
1372 val dt_isXSTrap = Mem(RobSize, Bool())
1373 for (i <- 0 until RenameWidth) {
1374 when (canEnqueue(i)) {
1375 dt_isXSTrap(allocatePtrVec(i).value) := io.enq.req(i).bits.ctrl.isXSTrap
1376 }
1323 val trapVec = io.commits.commitValid.zip(deqPtrVec).map{ case (v, d) =>
1324 io.commits.isCommit && v && dt_isXSTrap(d.value)
1377 }
1325 }
1378 val trapVec = io.commits.commitValid.zip(deqPtrVec).map{ case (v, d) => io.commits.isCommit && v && dt_isXSTrap(d.value) }
1379 val hitTrap = trapVec.reduce(_||_)
1326 val hitTrap = trapVec.reduce(_||_)
1380 val difftest = Module(new DifftestBasicTrapEvent)
1381 difftest.io.clock := clock
1382 difftest.io.coreid := io.hartId
1383 difftest.io.valid := hitTrap
1384 difftest.io.cycleCnt := timer
1385 difftest.io.instrCnt := instrCnt
1327 val difftest = DifftestModule(new DiffTrapEvent, dontCare = true)
1328 difftest.clock := clock
1329 difftest.coreid := io.hartId
1330 difftest.hasTrap := hitTrap
1331 difftest.cycleCnt := timer
1332 difftest.instrCnt := instrCnt
1333 difftest.hasWFI := hasWFI
1334
1335 if (env.EnableDifftest) {
1336 val trapCode = PriorityMux(wdata.zip(trapVec).map(x => x._2 -> x._1))
1337 val trapPC = SignExt(PriorityMux(wpc.zip(trapVec).map(x => x._2 ->x._1)), XLEN)
1338 difftest.code := trapCode
1339 difftest.pc := trapPC
1340 }
1386 }
1387
1388 val validEntriesBanks = (0 until (RobSize + 31) / 32).map(i => RegNext(PopCount(valid.drop(i * 32).take(32))))
1389 val validEntries = RegNext(VecInit(validEntriesBanks).reduceTree(_ +& _))
1390 val commitMoveVec = VecInit(io.commits.commitValid.zip(commitIsMove).map{ case (v, m) => v && m })
1391 val commitLoadVec = VecInit(commitLoadValid)
1392 val commitBranchVec = VecInit(commitBranchValid)
1393 val commitLoadWaitVec = VecInit(commitLoadValid.zip(commitLoadWaitBit).map{ case (v, w) => v && w })

--- 23 unchanged lines hidden ---
1341 }
1342
1343 val validEntriesBanks = (0 until (RobSize + 31) / 32).map(i => RegNext(PopCount(valid.drop(i * 32).take(32))))
1344 val validEntries = RegNext(VecInit(validEntriesBanks).reduceTree(_ +& _))
1345 val commitMoveVec = VecInit(io.commits.commitValid.zip(commitIsMove).map{ case (v, m) => v && m })
1346 val commitLoadVec = VecInit(commitLoadValid)
1347 val commitBranchVec = VecInit(commitBranchValid)
1348 val commitLoadWaitVec = VecInit(commitLoadValid.zip(commitLoadWaitBit).map{ case (v, w) => v && w })

--- 23 unchanged lines hidden ---