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 9* 10* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13* 14* See the Mulan PSL v2 for more details. 15***************************************************************************************/ 16 17package xiangshan.backend.issue 18 19import chipsalliance.rocketchip.config.Parameters 20import chisel3._ 21import chisel3.util._ 22import utility._ 23import utils._ 24import xiangshan._ 25import xiangshan.backend.decode.{ImmUnion, Imm_LUI_LOAD} 26import xiangshan.v2backend.Bundles.DynInst 27 28class DataArrayReadIO(numEntries: Int, numSrc: Int, dataBits: Int)(implicit p: Parameters) extends XSBundle { 29 val addr = Input(UInt(numEntries.W)) 30 val data = Vec(numSrc, Output(UInt(dataBits.W))) 31} 32 33class DataArrayWriteIO(numEntries: Int, numSrc: Int, dataBits: Int)(implicit p: Parameters) extends XSBundle { 34 val enable = Input(Bool()) 35 val mask = Vec(numSrc, Input(Bool())) 36 val addr = Input(UInt(numEntries.W)) 37 val data = Vec(numSrc, Input(UInt(dataBits.W))) 38} 39 40class DataArrayMultiWriteIO(numEntries: Int, numSrc: Int, dataBits: Int)(implicit p: Parameters) extends XSBundle { 41 val enable = Input(Bool()) 42 val addr = Vec(numSrc, Input(UInt(numEntries.W))) 43 val data = Input(UInt(dataBits.W)) 44} 45 46class DataArrayDelayedWriteIO(numEntries: Int, numSrc: Int, dataBits: Int)(implicit p: Parameters) extends XSBundle { 47 val mask = Vec(numSrc, Input(Bool())) 48 val addr = Input(UInt(numEntries.W)) 49 val data = Vec(numSrc, Input(UInt(dataBits.W))) 50} 51 52//class DataArrayIO(params: RSParams)(implicit p: Parameters) extends XSBundle { 53// val read = Vec(params.numDeq + 1, new DataArrayReadIO(params.numEntries, params.numSrc, params.dataBits)) 54// val write = Vec(params.numEnq, new DataArrayWriteIO(params.numEntries, params.numSrc, params.dataBits)) 55// val multiWrite = Vec(params.numWakeup, new DataArrayMultiWriteIO(params.numEntries, params.numSrc, params.dataBits)) 56//// val delayedWrite = if (params.delayedSrc) Vec(params.numEnq, new DataArrayDelayedWriteIO(params.numEntries, params.numSrc, params.dataBits)) else null 57//} 58 59//class DataArray(params: RSParams)(implicit p: Parameters) extends XSModule { 60// val io = IO(new DataArrayIO(params)) 61// 62// for (i <- 0 until params.numSrc) { 63//// val delayedWen = if (params.delayedSrc) io.delayedWrite.map(_.mask(i)) else Seq() 64//// val delayedWaddr = if (params.delayedSrc) io.delayedWrite.map(_.addr) else Seq() 65//// val delayedWdata = if (params.delayedSrc) io.delayedWrite.map(_.data(i)) else Seq() 66// 67// val wen = io.write.map(w => w.enable && w.mask(i)) ++ io.multiWrite.map(_.enable) 68// val waddr = io.write.map(_.addr) ++ io.multiWrite.map(_.addr(i)) 69// val wdata = io.write.map(_.data(i)) ++ io.multiWrite.map(_.data) 70// 71// val dataModule = Module(new AsyncRawDataModuleTemplate(UInt(params.dataBits.W), params.numEntries, io.read.length, wen.length)) 72// dataModule.io.rvec := VecInit(io.read.map(_.addr)) 73// io.read.map(_.data(i)).zip(dataModule.io.rdata).foreach{ case (d, r) => d := r } 74// dataModule.io.wen := wen 75// dataModule.io.wvec := waddr 76// dataModule.io.wdata := wdata 77// 78// for (i <- 0 until params.numEntries) { 79// val w = VecInit(wen.indices.map(j => dataModule.io.wen(j) && dataModule.io.wvec(j)(i))) 80// XSError(RegNext(PopCount(w) > 1.U), s"why not OH $i?") 81// when(PopCount(w) > 1.U) { 82// XSDebug("ERROR: RS DataArray write overlap!\n") 83// } 84// } 85// } 86// 87//} 88 89class ImmExtractor(numSrc: Int, dataBits: Int)(implicit p: Parameters) extends XSModule { 90 val io = IO(new Bundle { 91 val uop = Input(new DynInst) 92 val data_in = Vec(numSrc, Input(UInt(dataBits.W))) 93 val data_out = Vec(numSrc, Output(UInt(dataBits.W))) 94 }) 95 io.data_out := io.data_in 96 97 val jump_pc = IO(Input(UInt(VAddrBits.W))) 98 val jalr_target = IO(Input(UInt(VAddrBits.W))) 99 jump_pc <> DontCare 100 jalr_target <> DontCare 101} 102 103class JumpImmExtractor(implicit p: Parameters) extends ImmExtractor(2, 64) { 104 when (SrcType.isPc(io.uop.srcType(0))) { 105 io.data_out(0) := SignExt(jump_pc, XLEN) 106 } 107 // when src1 is reg (like sfence's asid) do not let data_out(1) be the jalr_target 108 when (SrcType.isPcOrImm(io.uop.srcType(1))) { 109 io.data_out(1) := jalr_target 110 } 111} 112 113class AluImmExtractor(implicit p: Parameters) extends ImmExtractor(2, 64) { 114 when (SrcType.isImm(io.uop.srcType(1))) { 115 val imm32 = Mux(io.uop.selImm === SelImm.IMM_VSETIVLI, ImmUnion.VSETIVLI.toImm32(io.uop.imm), 116 Mux(io.uop.selImm === SelImm.IMM_VSETVLI, ImmUnion.VSETVLI.toImm32(io.uop.imm), 117 Mux(io.uop.selImm === SelImm.IMM_U, ImmUnion.U.toImm32(io.uop.imm), ImmUnion.I.toImm32(io.uop.imm)))) 118 io.data_out(1) := SignExt(imm32, XLEN) 119 } 120} 121 122class MduImmExtractor(implicit p: Parameters) extends ImmExtractor(2, 64) { 123 when (SrcType.isImm(io.uop.srcType(1))) { 124 val imm32 = ImmUnion.I.toImm32(io.uop.imm) 125 io.data_out(1) := SignExt(imm32, XLEN) 126 } 127} 128 129class LoadImmExtractor(implicit p: Parameters) extends ImmExtractor(1, 64) { 130 when (SrcType.isImm(io.uop.srcType(0))) { 131 io.data_out(0) := SignExt(Imm_LUI_LOAD().getLuiImm(io.uop), XLEN) 132 } 133} 134 135//object ImmExtractor { 136// def apply(params: RSParams, uop: MicroOp, data_in: Vec[UInt]) 137// (implicit p: Parameters) = { 138// val immExt = Module(params.subMod.immExtractorGen(params.numSrc, params.dataBits, p)) 139// immExt.io.uop := uop 140// immExt.io.data_in := data_in 141// 142// immExt.jalr_target <> DontCare 143// immExt.jump_pc <> DontCare 144// immExt 145// } 146//} 147