xref: /XiangShan/src/main/scala/xiangshan/backend/issue/WakeupQueue.scala (revision 4b0d80d87574e82ba31737496d63ac30bed0d40a)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
175c7674feSYinan Xupackage xiangshan.backend.issue
185c7674feSYinan Xu
19*8891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
205c7674feSYinan Xuimport chisel3._
215c7674feSYinan Xuimport chisel3.util._
225c7674feSYinan Xuimport xiangshan._
235c7674feSYinan Xuimport utils._
243c02ee8fSwakafaimport utility._
255c7674feSYinan Xu
265c7674feSYinan Xuclass WakeupQueue(number: Int)(implicit p: Parameters) extends XSModule {
275c7674feSYinan Xu  val io = IO(new Bundle {
285c7674feSYinan Xu    val in  = Flipped(ValidIO(new MicroOp))
295c7674feSYinan Xu    val out = ValidIO(new MicroOp)
305c7674feSYinan Xu    val redirect = Flipped(ValidIO(new Redirect))
315c7674feSYinan Xu  })
325c7674feSYinan Xu  if (number < 0) {
335c7674feSYinan Xu    io.out.valid := false.B
345c7674feSYinan Xu    io.out.bits := DontCare
355c7674feSYinan Xu  } else if(number == 0) {
365c7674feSYinan Xu    io.in <> io.out
375c7674feSYinan Xu    io.out.valid := io.in.valid
385c7674feSYinan Xu    // NOTE: no delay bypass don't care redirect
395c7674feSYinan Xu  } else {
405c7674feSYinan Xu    val queue = Seq.fill(number)(RegInit(0.U.asTypeOf(new Bundle{
415c7674feSYinan Xu      val valid = Bool()
425c7674feSYinan Xu      val bits = new MicroOp
435c7674feSYinan Xu    })))
44f4b2089aSYinan Xu    queue(0).valid := io.in.valid && !io.in.bits.robIdx.needFlush(io.redirect)
455c7674feSYinan Xu    queue(0).bits  := io.in.bits
465c7674feSYinan Xu    (0 until (number-1)).map{i =>
475c7674feSYinan Xu      queue(i+1) := queue(i)
48f4b2089aSYinan Xu      queue(i+1).valid := queue(i).valid && !queue(i).bits.robIdx.needFlush(io.redirect)
495c7674feSYinan Xu    }
505c7674feSYinan Xu    io.out.valid := queue(number-1).valid
515c7674feSYinan Xu    io.out.bits := queue(number-1).bits
525c7674feSYinan Xu    for (i <- 0 until number) {
539aca92b9SYinan Xu      XSDebug(queue(i).valid, p"BPQue(${i.U}): pc:${Hexadecimal(queue(i).bits.cf.pc)} robIdx:${queue(i).bits.robIdx}" +
540f038924SZhangZifei        p" pdest:${queue(i).bits.pdest} rfWen:${queue(i).bits.ctrl.rfWen} fpWen:${queue(i).bits.ctrl.fpWen} vecWen:${queue(i).bits.ctrl.vecWen}\n")
555c7674feSYinan Xu    }
565c7674feSYinan Xu  }
575c7674feSYinan Xu}
58