Rob.scala (ffebba96012c2d9027811c03f1b0bfa91aa6b6fc) Rob.scala (c0f8424bf94d8e6b9c520cebd68c2a0de3d4675c)
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

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

112 val bankNum = 8
113 assert(RobSize % bankNum == 0, "RobSize % bankNum must be 0")
114 val robEntries = Reg(Vec(RobSize, new RobEntryBundle))
115 // pointers
116 // For enqueue ptr, we don't duplicate it since only enqueue needs it.
117 val enqPtrVec = Wire(Vec(RenameWidth, new RobPtr))
118 val deqPtrVec = Wire(Vec(CommitWidth, new RobPtr))
119 val walkPtrVec = Reg(Vec(CommitWidth, new RobPtr))
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

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

112 val bankNum = 8
113 assert(RobSize % bankNum == 0, "RobSize % bankNum must be 0")
114 val robEntries = Reg(Vec(RobSize, new RobEntryBundle))
115 // pointers
116 // For enqueue ptr, we don't duplicate it since only enqueue needs it.
117 val enqPtrVec = Wire(Vec(RenameWidth, new RobPtr))
118 val deqPtrVec = Wire(Vec(CommitWidth, new RobPtr))
119 val walkPtrVec = Reg(Vec(CommitWidth, new RobPtr))
120 val walkPtrTrue = Reg(new RobPtr)
120 val lastWalkPtr = Reg(new RobPtr)
121 val allowEnqueue = RegInit(true.B)
122
123 /**
124 * Enqueue (from dispatch)
125 */
126 // special cases
127 val hasBlockBackward = RegInit(false.B)

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

535 shouldWalkVec := 0.U.asTypeOf(shouldWalkVec)
536 }.elsewhen(RegNext(io.redirect.valid)){
537 shouldWalkVec := 0.U.asTypeOf(shouldWalkVec)
538 }.elsewhen(state === s_walk){
539 shouldWalkVec := VecInit(walkingPtrVec.map(_ <= lastWalkPtr).zip(donotNeedWalk).map(x => x._1 && !x._2))
540 }.otherwise(
541 shouldWalkVec := 0.U.asTypeOf(shouldWalkVec)
542 )
121 val lastWalkPtr = Reg(new RobPtr)
122 val allowEnqueue = RegInit(true.B)
123
124 /**
125 * Enqueue (from dispatch)
126 */
127 // special cases
128 val hasBlockBackward = RegInit(false.B)

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

536 shouldWalkVec := 0.U.asTypeOf(shouldWalkVec)
537 }.elsewhen(RegNext(io.redirect.valid)){
538 shouldWalkVec := 0.U.asTypeOf(shouldWalkVec)
539 }.elsewhen(state === s_walk){
540 shouldWalkVec := VecInit(walkingPtrVec.map(_ <= lastWalkPtr).zip(donotNeedWalk).map(x => x._1 && !x._2))
541 }.otherwise(
542 shouldWalkVec := 0.U.asTypeOf(shouldWalkVec)
543 )
543 val walkFinished = walkPtrVec.head > lastWalkPtr
544 val walkFinished = walkPtrTrue > lastWalkPtr
544 rab.io.fromRob.walkEnd := state === s_walk && walkFinished
545 vtypeBuffer.io.fromRob.walkEnd := state === s_walk && walkFinished
546
547 require(RenameWidth <= CommitWidth)
548
549 // wiring to csr
550 val (wflags, dirtyFs) = (0 until CommitWidth).map(i => {
551 val v = io.commits.commitValid(i)

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

696
697 // next walkPtrVec:
698 // (1) redirect occurs: update according to state
699 // (2) walk: move forwards
700 val deqPtrReadBank = deqPtrVec_next(0).lineHeadPtr
701 val deqPtrVecForWalk = VecInit((0 until CommitWidth).map(i => deqPtrReadBank + i.U))
702 val snapPtrReadBank = snapshots(io.snpt.snptSelect)(0).lineHeadPtr
703 val snapPtrVecForWalk = VecInit((0 until CommitWidth).map(i => snapPtrReadBank + i.U))
545 rab.io.fromRob.walkEnd := state === s_walk && walkFinished
546 vtypeBuffer.io.fromRob.walkEnd := state === s_walk && walkFinished
547
548 require(RenameWidth <= CommitWidth)
549
550 // wiring to csr
551 val (wflags, dirtyFs) = (0 until CommitWidth).map(i => {
552 val v = io.commits.commitValid(i)

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

697
698 // next walkPtrVec:
699 // (1) redirect occurs: update according to state
700 // (2) walk: move forwards
701 val deqPtrReadBank = deqPtrVec_next(0).lineHeadPtr
702 val deqPtrVecForWalk = VecInit((0 until CommitWidth).map(i => deqPtrReadBank + i.U))
703 val snapPtrReadBank = snapshots(io.snpt.snptSelect)(0).lineHeadPtr
704 val snapPtrVecForWalk = VecInit((0 until CommitWidth).map(i => snapPtrReadBank + i.U))
704 val walkPtrVec_next = Mux(io.redirect.valid,
705 val walkPtrVec_next: Vec[RobPtr] = Mux(io.redirect.valid,
705 Mux(io.snpt.useSnpt, snapPtrVecForWalk, deqPtrVecForWalk),
706 Mux((state === s_walk) && !walkFinished, VecInit(walkPtrVec.map(_ + CommitWidth.U)), walkPtrVec)
707 )
706 Mux(io.snpt.useSnpt, snapPtrVecForWalk, deqPtrVecForWalk),
707 Mux((state === s_walk) && !walkFinished, VecInit(walkPtrVec.map(_ + CommitWidth.U)), walkPtrVec)
708 )
709 val walkPtrTrue_next: RobPtr = Mux(io.redirect.valid,
710 Mux(io.snpt.useSnpt, snapshots(io.snpt.snptSelect)(0), deqPtrVec_next(0)),
711 Mux((state === s_walk) && !walkFinished, walkPtrVec_next.head, walkPtrTrue)
712 )
708 walkPtrHead := walkPtrVec_next.head
709 walkPtrVec := walkPtrVec_next
713 walkPtrHead := walkPtrVec_next.head
714 walkPtrVec := walkPtrVec_next
715 walkPtrTrue := walkPtrTrue_next
710 // T io.redirect.valid, T+1 walkPtrLowBits update, T+2 donotNeedWalk update
711 val walkPtrLowBits = Reg(UInt(bankAddrWidth.W))
712 when(io.redirect.valid){
713 walkPtrLowBits := Mux(io.snpt.useSnpt, snapshots(io.snpt.snptSelect)(0).value(bankAddrWidth-1, 0), deqPtrVec_next(0).value(bankAddrWidth-1, 0))
714 }
715 when(io.redirect.valid) {
716 donotNeedWalk := Fill(donotNeedWalk.length, true.B).asTypeOf(donotNeedWalk)
717 }.elsewhen(RegNext(io.redirect.valid)){
718 donotNeedWalk := (0 until CommitWidth).map(i => (i.U < walkPtrLowBits))
716 // T io.redirect.valid, T+1 walkPtrLowBits update, T+2 donotNeedWalk update
717 val walkPtrLowBits = Reg(UInt(bankAddrWidth.W))
718 when(io.redirect.valid){
719 walkPtrLowBits := Mux(io.snpt.useSnpt, snapshots(io.snpt.snptSelect)(0).value(bankAddrWidth-1, 0), deqPtrVec_next(0).value(bankAddrWidth-1, 0))
720 }
721 when(io.redirect.valid) {
722 donotNeedWalk := Fill(donotNeedWalk.length, true.B).asTypeOf(donotNeedWalk)
723 }.elsewhen(RegNext(io.redirect.valid)){
724 donotNeedWalk := (0 until CommitWidth).map(i => (i.U < walkPtrLowBits))
719 }.otherwise(
725 }.otherwise{
720 donotNeedWalk := 0.U.asTypeOf(donotNeedWalk)
726 donotNeedWalk := 0.U.asTypeOf(donotNeedWalk)
721 )
727 }
722 walkDestSizeDeqGroup.zip(walkPtrVec_next).map {
723 case (reg, ptrNext) => reg := robEntries(deqPtr.value).realDestSize
724 }
725 val numValidEntries = distanceBetween(enqPtr, deqPtr)
726 val commitCnt = PopCount(io.commits.commitValid)
727
728 allowEnqueue := numValidEntries + dispatchNum <= (RobSize - CommitWidth).U
729

--- 647 unchanged lines hidden ---
728 walkDestSizeDeqGroup.zip(walkPtrVec_next).map {
729 case (reg, ptrNext) => reg := robEntries(deqPtr.value).realDestSize
730 }
731 val numValidEntries = distanceBetween(enqPtr, deqPtr)
732 val commitCnt = PopCount(io.commits.commitValid)
733
734 allowEnqueue := numValidEntries + dispatchNum <= (RobSize - CommitWidth).U
735

--- 647 unchanged lines hidden ---