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