1730cfbc0SXuan Hupackage xiangshan.backend.fu 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 5239413e5SXuan Huimport utils.EnumUtils.OHEnumeration 6730cfbc0SXuan Huimport xiangshan.ExceptionNO._ 7730cfbc0SXuan Huimport xiangshan.SelImm 8007f6122SXuan Huimport xiangshan.backend.fu.fpu.{IntToFP, IntFPToVec} 960f0c5aeSxiaofeibaoimport xiangshan.backend.fu.wrapper._ 10730cfbc0SXuan Huimport xiangshan.backend.Bundles.ExuInput 11730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig._ 12*c590fb32Scz4eimport xiangshan.mem.Std 13730cfbc0SXuan Hu 1474aafe69SXuan Hu/** 1574aafe69SXuan Hu * 1674aafe69SXuan Hu * @param name [[String]] name of fuConfig 1774aafe69SXuan Hu * @param fuType [[Int]] type of func, select from [[xiangshan.backend.fu.FuType]] 1874aafe69SXuan Hu * @param fuGen how to create $fu 1974aafe69SXuan Hu * @param srcData type of src data used by this $fu 2078115a00SXuan Hu * @param piped if the $fu is pipelined 2174aafe69SXuan Hu * @param maybeBlock the $fu need ready signal to block internal pipeline 2274aafe69SXuan Hu * @param writeIntRf the $fu write int regfiles 2374aafe69SXuan Hu * @param writeFpRf the $fu write float regfiles 2474aafe69SXuan Hu * @param writeVecRf the $fu write vector regfiles 25b8db7211Sxiaofeibao * @param writeV0Rf the $fu write v0 regfiles 26b8db7211Sxiaofeibao * @param writeVlRf the $fu write vl regfiles 2774aafe69SXuan Hu * @param writeFflags the $fu write fflags csr 2874aafe69SXuan Hu * @param writeVxsat the $fu write vxsat csr 292d12882cSxiaofeibao * @param destDataBits the width of output data in the $fu 302d12882cSxiaofeibao * @param srcDataBits the width of input data in the $fu, the default value is destDataBits 3174aafe69SXuan Hu * @param latency the latency of instuction executed in the $fu 3274aafe69SXuan Hu * @param hasInputBuffer if the $fu has input buffer 3374aafe69SXuan Hu * @param exceptionOut the $fu can produce these exception 3474aafe69SXuan Hu * @param hasLoadError if the $fu has load error out 3574aafe69SXuan Hu * @param flushPipe if the instuction executed in the $fu need flush out 3674aafe69SXuan Hu * @param replayInst if the instuction executed in the $fu can replay in some condition 3774aafe69SXuan Hu * @param trigger if the $fu need trigger out 3874aafe69SXuan Hu * @param needSrcFrm if the $fu need float rounding mode signal 3917985fbbSZiyue Zhang * @param needSrcVxrm if the $fu need vector fixed-point rounding mode signal 4074aafe69SXuan Hu * @param immType the immediate type of this $fu 4174aafe69SXuan Hu * @param vconfigWakeUp 4274aafe69SXuan Hu * @param maskWakeUp 4374aafe69SXuan Hu * 4474aafe69SXuan Hu * @define fu function unit 4574aafe69SXuan Hu */ 46730cfbc0SXuan Hucase class FuConfig ( 47730cfbc0SXuan Hu name : String, 48239413e5SXuan Hu fuType : FuType.OHType, 49730cfbc0SXuan Hu fuGen : (Parameters, FuConfig) => FuncUnit, 50730cfbc0SXuan Hu srcData : Seq[Seq[DataConfig]], 5178115a00SXuan Hu piped : Boolean, 5274aafe69SXuan Hu maybeBlock : Boolean = false, 53438d9a22SXuan Hu writeIntRf : Boolean = false, 54438d9a22SXuan Hu writeFpRf : Boolean = false, 55730cfbc0SXuan Hu writeVecRf : Boolean = false, 562aa3a761Ssinsanction writeV0Rf : Boolean = false, 572aa3a761Ssinsanction writeVlRf : Boolean = false, 585edcc45fSHaojin Tang writeFakeIntRf: Boolean = false, 59730cfbc0SXuan Hu writeFflags : Boolean = false, 60a8db15d8Sfdy writeVxsat : Boolean = false, 612d12882cSxiaofeibao destDataBits : Int = 64, 622d12882cSxiaofeibao srcDataBits : Option[Int] = None, 630ed0e482SGuanghui Cheng srcNeedCopy : Boolean = false, 649e200047Slewislzh latency : HasFuLatency = CertainLatency(0),// two field (base latency, extra latency(option)) 65730cfbc0SXuan Hu hasInputBuffer: (Boolean, Int, Boolean) = (false, 0, false), 66730cfbc0SXuan Hu exceptionOut : Seq[Int] = Seq(), 67730cfbc0SXuan Hu hasLoadError : Boolean = false, 68730cfbc0SXuan Hu flushPipe : Boolean = false, 69730cfbc0SXuan Hu replayInst : Boolean = false, 70730cfbc0SXuan Hu trigger : Boolean = false, 71730cfbc0SXuan Hu needSrcFrm : Boolean = false, 7217985fbbSZiyue Zhang needSrcVxrm : Boolean = false, 737e4f0b19SZiyue-Zhang writeVType : Boolean = false, 74730cfbc0SXuan Hu immType : Set[UInt] = Set(), 7574aafe69SXuan Hu // vector 7674aafe69SXuan Hu vconfigWakeUp : Boolean = false, 7774aafe69SXuan Hu maskWakeUp : Boolean = false, 78730cfbc0SXuan Hu) { 795edcc45fSHaojin Tang def needIntWen: Boolean = writeIntRf || writeFakeIntRf 805edcc45fSHaojin Tang def needFpWen: Boolean = writeFpRf 815edcc45fSHaojin Tang def needVecWen: Boolean = writeVecRf 82de8bd1d0Ssinsanction def needV0Wen: Boolean = writeV0Rf 83de8bd1d0Ssinsanction def needVlWen: Boolean = writeVlRf 8474aafe69SXuan Hu var vconfigIdx = -1 8574aafe69SXuan Hu var maskSrcIdx = -1 8674aafe69SXuan Hu if (vconfigWakeUp) { 87e4e52e7dSsinsanction vconfigIdx = getSpecialSrcIdx(VlData(), "when vconfigWakeUp is true, srcData must always contains VlData()") 8874aafe69SXuan Hu } 8974aafe69SXuan Hu if (maskWakeUp) { 90e4e52e7dSsinsanction maskSrcIdx = getSpecialSrcIdx(V0Data(), "when maskWakeUp is true, srcData must always contains V0Data()") 9174aafe69SXuan Hu } 9274aafe69SXuan Hu 9374aafe69SXuan Hu require(!piped || piped && latency.latencyVal.isDefined, "The latency value must be set when piped is enable") 9474aafe69SXuan Hu require(!vconfigWakeUp || vconfigWakeUp && vconfigIdx >= 0, "The index of vl src must be set when vlWakeUp is enable") 9574aafe69SXuan Hu require(!maskWakeUp || maskWakeUp && maskSrcIdx >= 0, "The index of mask src must be set when vlWakeUp is enable") 9674aafe69SXuan Hu 97670870b3SXuan Hu def numIntSrc : Int = srcData.map(_.count(x => IntRegSrcDataSet.contains(x))).fold(0)(_ max _) 98670870b3SXuan Hu def numFpSrc : Int = srcData.map(_.count(x => FpRegSrcDataSet.contains(x))).fold(0)(_ max _) 99670870b3SXuan Hu def numVecSrc : Int = srcData.map(_.count(x => VecRegSrcDataSet.contains(x))).fold(0)(_ max _) 100fbe46a0aSxiaofeibao def numVfSrc : Int = srcData.map(_.count(x => VecRegSrcDataSet.contains(x))).fold(0)(_ max _) 101de8bd1d0Ssinsanction def numV0Src : Int = srcData.map(_.count(x => V0RegSrcDataSet.contains(x))).fold(0)(_ max _) 102de8bd1d0Ssinsanction def numVlSrc : Int = srcData.map(_.count(x => VlRegSrcDataSet.contains(x))).fold(0)(_ max _) 103670870b3SXuan Hu def numRegSrc : Int = srcData.map(_.count(x => RegSrcDataSet.contains(x))).fold(0)(_ max _) 104670870b3SXuan Hu def numSrc : Int = srcData.map(_.length).fold(0)(_ max _) 105730cfbc0SXuan Hu 106730cfbc0SXuan Hu def readFp: Boolean = numFpSrc > 0 107730cfbc0SXuan Hu 108730cfbc0SXuan Hu def fuSel(uop: ExuInput): Bool = { 109730cfbc0SXuan Hu // Don't add more shit here!!! 110730cfbc0SXuan Hu // Todo: add new FuType to distinguish f2i, f2f 111730cfbc0SXuan Hu uop.fuType === this.fuType.U 112730cfbc0SXuan Hu } 113730cfbc0SXuan Hu 114730cfbc0SXuan Hu /** 115730cfbc0SXuan Hu * params(i): data type set of the ith src port 116730cfbc0SXuan Hu * @return 117730cfbc0SXuan Hu */ 118730cfbc0SXuan Hu def getRfReadDataCfgSet: Seq[Set[DataConfig]] = { 119670870b3SXuan Hu val numSrcMax = srcData.map(_.length).fold(0)(_ max _) 120730cfbc0SXuan Hu // make srcData is uniform sized to avoid exception when transpose 121730cfbc0SXuan Hu val alignedSrcData: Seq[Seq[DataConfig]] = srcData.map(x => x ++ Seq.fill(numSrcMax - x.length)(null)) 122730cfbc0SXuan Hu alignedSrcData.transpose.map(_.toSet.intersect(RegSrcDataSet)) 123730cfbc0SXuan Hu } 124730cfbc0SXuan Hu 125730cfbc0SXuan Hu def getSrcDataType(srcIdx: Int): Set[DataConfig] = { 126730cfbc0SXuan Hu srcData 127730cfbc0SXuan Hu .map((x: Seq[DataConfig]) => if(x.isDefinedAt(srcIdx)) Some(x(srcIdx)) else None) 128730cfbc0SXuan Hu .filter(_.nonEmpty) 129730cfbc0SXuan Hu .map(_.get) 130730cfbc0SXuan Hu .toSet 131730cfbc0SXuan Hu } 132730cfbc0SXuan Hu 133730cfbc0SXuan Hu def hasNoDataWB: Boolean = { 134b8db7211Sxiaofeibao !(writeIntRf || writeFpRf || writeVecRf || writeV0Rf || writeVlRf) 135730cfbc0SXuan Hu } 136730cfbc0SXuan Hu 137730cfbc0SXuan Hu def getSrcMaxWidthVec = { 138730cfbc0SXuan Hu getRfReadDataCfgSet.map(_.map(_.dataWidth).max) 139730cfbc0SXuan Hu } 140730cfbc0SXuan Hu 141730cfbc0SXuan Hu def genSrcDataVec: Seq[UInt] = { 142730cfbc0SXuan Hu getSrcMaxWidthVec.map(w => UInt(w.W)) 143730cfbc0SXuan Hu } 144730cfbc0SXuan Hu 145dcdd1406SXuan Hu // csr's redirect also uses redirect bundle 146dcdd1406SXuan Hu def hasRedirect: Boolean = Seq(FuType.jmp, FuType.brh, FuType.csr).contains(fuType) 147730cfbc0SXuan Hu 1489d8d7860SXuan Hu def hasPredecode: Boolean = Seq(FuType.jmp, FuType.brh, FuType.csr, FuType.ldu).contains(fuType) 1499d8d7860SXuan Hu 150c37914a4Sxiaofeibao def needTargetPc: Boolean = Seq(FuType.jmp, FuType.brh).contains(fuType) 1519d8d7860SXuan Hu 1529d8d7860SXuan Hu // predict info 1539d8d7860SXuan Hu def needPdInfo: Boolean = Seq(FuType.jmp, FuType.brh, FuType.csr).contains(fuType) 154730cfbc0SXuan Hu 155c37914a4Sxiaofeibao def needPc: Boolean = Seq(FuType.jmp, FuType.brh, FuType.ldu).contains(fuType) 156730cfbc0SXuan Hu 157730cfbc0SXuan Hu def needFPUCtrl: Boolean = { 158730cfbc0SXuan Hu import FuType._ 15960f0c5aeSxiaofeibao Seq(fmac, fDivSqrt, i2f).contains(fuType) 160730cfbc0SXuan Hu } 161730cfbc0SXuan Hu 1626a35d972SXuan Hu def needVecCtrl: Boolean = { 1636a35d972SXuan Hu import FuType._ 16439be24bcSxiaofeibao Seq(vipu, vialuF, vimac, vidiv, vfpu, vppu, vfalu, vfma, vfdiv, vfcvt, vldu, vstu).contains(fuType) 1656a35d972SXuan Hu } 1666a35d972SXuan Hu 16785a8d7caSZehao Liu def needCriticalErrors: Boolean = Seq(FuType.csr).contains(fuType) 16885a8d7caSZehao Liu 169730cfbc0SXuan Hu def isMul: Boolean = fuType == FuType.mul 170730cfbc0SXuan Hu 171730cfbc0SXuan Hu def isDiv: Boolean = fuType == FuType.div 172730cfbc0SXuan Hu 173730cfbc0SXuan Hu def isCsr: Boolean = fuType == FuType.csr 174730cfbc0SXuan Hu 175c1b28b66STang Haojin def isBrh: Boolean = fuType == FuType.brh 176c1b28b66STang Haojin 177c1b28b66STang Haojin def isJmp: Boolean = fuType == FuType.jmp 178c1b28b66STang Haojin 179730cfbc0SXuan Hu def isFence: Boolean = fuType == FuType.fence 18074aafe69SXuan Hu 18199bd2aafSHaojin Tang def isVecArith: Boolean = fuType == FuType.vialuF || fuType == FuType.vimac || 18299bd2aafSHaojin Tang fuType == FuType.vppu || fuType == FuType.vipu || 18399bd2aafSHaojin Tang fuType == FuType.vfalu || fuType == FuType.vfma || 1840bca6cb3SZiyue Zhang fuType == FuType.vfdiv || fuType == FuType.vfcvt || 1850bca6cb3SZiyue Zhang fuType == FuType.vidiv 18699bd2aafSHaojin Tang 18742b6cdf9Ssinsanction def isVecMem: Boolean = fuType == FuType.vldu || fuType == FuType.vstu || 18842b6cdf9Ssinsanction fuType == FuType.vsegldu || fuType == FuType.vsegstu 18942b6cdf9Ssinsanction 19042b6cdf9Ssinsanction def needOg2: Boolean = isVecArith || fuType == FuType.vsetfwf || isVecMem 191c38df446SzhanglyGit 19299bd2aafSHaojin Tang def isSta: Boolean = name.contains("sta") 19399bd2aafSHaojin Tang 194472967baSxiaofeibao def isStd: Boolean = name.contains("std") 195472967baSxiaofeibao 1967ffbf5fdSZhaoyang You def ckAlwaysEn: Boolean = isCsr || isFence 19729275910SsinceforYy 19874aafe69SXuan Hu /** 19907b5cc60Sxiaofeibao * Get index of special src data, like [[VlData]], [[V0Data]] 20007b5cc60Sxiaofeibao * 20174aafe69SXuan Hu * @param data [[DataConfig]] 20274aafe69SXuan Hu * @param tips tips if get failed 20374aafe69SXuan Hu * @return the index of special src data 20474aafe69SXuan Hu */ 20574aafe69SXuan Hu protected def getSpecialSrcIdx(data: DataConfig, tips: String): Int = { 20674aafe69SXuan Hu val srcIdxVec = srcData.map(x => x.indexOf(data)) 20774aafe69SXuan Hu val idx0 = srcIdxVec.head 20874aafe69SXuan Hu for (idx <- srcIdxVec) { 20974aafe69SXuan Hu require(idx >= 0 && idx == idx0, tips + ", and at the same index.") 21074aafe69SXuan Hu } 21174aafe69SXuan Hu idx0 21274aafe69SXuan Hu } 213b6b11f60SXuan Hu 214b6b11f60SXuan Hu override def toString: String = { 215b6b11f60SXuan Hu var str = s"${this.name}: " 216b6b11f60SXuan Hu if (vconfigWakeUp) str += s"vconfigIdx($vconfigIdx), " 217b6b11f60SXuan Hu if (maskWakeUp) str += s"maskSrcIdx($maskSrcIdx), " 218b6b11f60SXuan Hu str += s"latency($latency)" 219670870b3SXuan Hu str += s"src($srcData)" 220b6b11f60SXuan Hu str 221b6b11f60SXuan Hu } 222730cfbc0SXuan Hu} 223730cfbc0SXuan Hu 224730cfbc0SXuan Huobject FuConfig { 225730cfbc0SXuan Hu val JmpCfg: FuConfig = FuConfig ( 226730cfbc0SXuan Hu name = "jmp", 227730cfbc0SXuan Hu fuType = FuType.jmp, 228730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new JumpUnit(cfg)(p)).suggestName("jmp"), 229730cfbc0SXuan Hu srcData = Seq( 230730cfbc0SXuan Hu Seq(IntData()), // jal 231730cfbc0SXuan Hu ), 23278115a00SXuan Hu piped = true, 233730cfbc0SXuan Hu writeIntRf = true, 234730cfbc0SXuan Hu immType = Set(SelImm.IMM_I, SelImm.IMM_UJ, SelImm.IMM_U), 235730cfbc0SXuan Hu ) 236730cfbc0SXuan Hu 237730cfbc0SXuan Hu val BrhCfg: FuConfig = FuConfig ( 238730cfbc0SXuan Hu name = "brh", 239730cfbc0SXuan Hu fuType = FuType.brh, 240730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new BranchUnit(cfg)(p).suggestName("brh")), 241730cfbc0SXuan Hu srcData = Seq( 242730cfbc0SXuan Hu Seq(IntData(), IntData()), 243730cfbc0SXuan Hu ), 24478115a00SXuan Hu piped = true, 245730cfbc0SXuan Hu immType = Set(SelImm.IMM_SB), 246730cfbc0SXuan Hu ) 247730cfbc0SXuan Hu 248730cfbc0SXuan Hu val I2fCfg: FuConfig = FuConfig ( 249730cfbc0SXuan Hu name = "i2f", 250730cfbc0SXuan Hu FuType.i2f, 251730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new IntToFP(cfg)(p).suggestName("i2f")), 252730cfbc0SXuan Hu srcData = Seq( 253730cfbc0SXuan Hu Seq(IntData()), 254730cfbc0SXuan Hu ), 25578115a00SXuan Hu piped = true, 256730cfbc0SXuan Hu writeFpRf = true, 257730cfbc0SXuan Hu writeFflags = true, 258730cfbc0SXuan Hu latency = CertainLatency(2), 259730cfbc0SXuan Hu needSrcFrm = true, 260730cfbc0SXuan Hu ) 261730cfbc0SXuan Hu 262fc85f18fSZiyue Zhang val I2vCfg: FuConfig = FuConfig ( 263fc85f18fSZiyue Zhang name = "i2v", 264fc85f18fSZiyue Zhang FuType.i2v, 265395c8649SZiyue-Zhang fuGen = (p: Parameters, cfg: FuConfig) => Module(new IntFPToVec(cfg)(p).suggestName("i2v")), 266fc85f18fSZiyue Zhang srcData = Seq( 267fc85f18fSZiyue Zhang Seq(IntData(), IntData()), 268fc85f18fSZiyue Zhang ), 269fc85f18fSZiyue Zhang piped = true, 270964d9a87SZiyue Zhang writeFpRf = true, 271fc85f18fSZiyue Zhang writeVecRf = true, 272b8db7211Sxiaofeibao writeV0Rf = true, 273d6059658SZiyue Zhang latency = CertainLatency(0), 2742d12882cSxiaofeibao destDataBits = 128, 2752d12882cSxiaofeibao srcDataBits = Some(64), 276c2ce03f7SZiyue Zhang immType = Set(SelImm.IMM_OPIVIU, SelImm.IMM_OPIVIS, SelImm.IMM_VRORVI), 277fc85f18fSZiyue Zhang ) 278fc85f18fSZiyue Zhang 279395c8649SZiyue-Zhang val F2vCfg: FuConfig = FuConfig ( 280395c8649SZiyue-Zhang name = "f2v", 281395c8649SZiyue-Zhang FuType.f2v, 282395c8649SZiyue-Zhang fuGen = (p: Parameters, cfg: FuConfig) => Module(new IntFPToVec(cfg)(p).suggestName("f2v")), 283395c8649SZiyue-Zhang srcData = Seq( 284395c8649SZiyue-Zhang Seq(FpData(), FpData()), 285395c8649SZiyue-Zhang Seq(FpData()), 286395c8649SZiyue-Zhang ), 287395c8649SZiyue-Zhang piped = true, 28820b2b626SsinceforYy writeFpRf = true, 289395c8649SZiyue-Zhang writeVecRf = true, 290b8db7211Sxiaofeibao writeV0Rf = true, 291395c8649SZiyue-Zhang latency = CertainLatency(0), 2922d12882cSxiaofeibao destDataBits = 128, 2932d12882cSxiaofeibao srcDataBits = Some(64), 294395c8649SZiyue-Zhang ) 295395c8649SZiyue-Zhang 296730cfbc0SXuan Hu val CsrCfg: FuConfig = FuConfig ( 297730cfbc0SXuan Hu name = "csr", 298730cfbc0SXuan Hu fuType = FuType.csr, 299730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new CSR(cfg)(p).suggestName("csr")), 300730cfbc0SXuan Hu srcData = Seq( 301730cfbc0SXuan Hu Seq(IntData()), 302730cfbc0SXuan Hu ), 3032b6ba927SsinceforYy piped = false, 304730cfbc0SXuan Hu writeIntRf = true, 3052b6ba927SsinceforYy latency = UncertainLatency(), 3061af31f11SXiaokun-Pei exceptionOut = Seq(illegalInstr, virtualInstr, breakPoint, ecallU, ecallS, ecallVS, ecallM), 30778115a00SXuan Hu flushPipe = true, 308730cfbc0SXuan Hu ) 309730cfbc0SXuan Hu 310730cfbc0SXuan Hu val AluCfg: FuConfig = FuConfig ( 311730cfbc0SXuan Hu name = "alu", 312730cfbc0SXuan Hu fuType = FuType.alu, 313730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new Alu(cfg)(p).suggestName("Alu")), 314730cfbc0SXuan Hu srcData = Seq( 315730cfbc0SXuan Hu Seq(IntData(), IntData()), 316730cfbc0SXuan Hu ), 31778115a00SXuan Hu piped = true, 318730cfbc0SXuan Hu writeIntRf = true, 319fe528fd6Ssinsanction immType = Set(SelImm.IMM_I, SelImm.IMM_U, SelImm.IMM_LUI32), 320730cfbc0SXuan Hu ) 321730cfbc0SXuan Hu 322730cfbc0SXuan Hu val MulCfg: FuConfig = FuConfig ( 323730cfbc0SXuan Hu name = "mul", 324730cfbc0SXuan Hu fuType = FuType.mul, 325730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new MulUnit(cfg)(p).suggestName("Mul")), 326730cfbc0SXuan Hu srcData = Seq( 327730cfbc0SXuan Hu Seq(IntData(), IntData()), 328730cfbc0SXuan Hu ), 32978115a00SXuan Hu piped = true, 330730cfbc0SXuan Hu writeIntRf = true, 331730cfbc0SXuan Hu latency = CertainLatency(2), 332730cfbc0SXuan Hu ) 333730cfbc0SXuan Hu 334730cfbc0SXuan Hu val DivCfg: FuConfig = FuConfig ( 335730cfbc0SXuan Hu name = "div", 336730cfbc0SXuan Hu fuType = FuType.div, 337730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new DivUnit(cfg)(p).suggestName("Div")), 338730cfbc0SXuan Hu srcData = Seq( 339730cfbc0SXuan Hu Seq(IntData(), IntData()), 340730cfbc0SXuan Hu ), 34178115a00SXuan Hu piped = false, 342730cfbc0SXuan Hu writeIntRf = true, 343730cfbc0SXuan Hu latency = UncertainLatency(), 344730cfbc0SXuan Hu hasInputBuffer = (true, 4, true) 345730cfbc0SXuan Hu ) 346730cfbc0SXuan Hu 347730cfbc0SXuan Hu val FenceCfg: FuConfig = FuConfig ( 348730cfbc0SXuan Hu name = "fence", 349730cfbc0SXuan Hu FuType.fence, 350730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new Fence(cfg)(p).suggestName("Fence")), 351730cfbc0SXuan Hu srcData = Seq( 352730cfbc0SXuan Hu Seq(IntData(), IntData()), 353730cfbc0SXuan Hu ), 3542b6ba927SsinceforYy piped = false, 3552b6ba927SsinceforYy latency = UncertainLatency(), 3561af31f11SXiaokun-Pei exceptionOut = Seq(illegalInstr, virtualInstr), 357730cfbc0SXuan Hu flushPipe = true 358730cfbc0SXuan Hu ) 359730cfbc0SXuan Hu 360730cfbc0SXuan Hu // Todo: split it to simple bitmap exu and complex bku 361730cfbc0SXuan Hu val BkuCfg: FuConfig = FuConfig ( 362730cfbc0SXuan Hu name = "bku", 363730cfbc0SXuan Hu fuType = FuType.bku, 364730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new Bku(cfg)(p).suggestName("Bku")), 365730cfbc0SXuan Hu srcData = Seq( 366730cfbc0SXuan Hu Seq(IntData(), IntData()), 367730cfbc0SXuan Hu ), 36878115a00SXuan Hu piped = true, 369730cfbc0SXuan Hu writeIntRf = true, 370c4af9849SzhanglyGit latency = CertainLatency(2), 371730cfbc0SXuan Hu ) 372730cfbc0SXuan Hu 373a8db15d8Sfdy val VSetRvfWvfCfg: FuConfig = FuConfig( 374a8db15d8Sfdy name = "vsetrvfwvf", 375b1712600SZiyue Zhang fuType = FuType.vsetfwf, 376a8db15d8Sfdy fuGen = (p: Parameters, cfg: FuConfig) => Module(new VSetRvfWvf(cfg)(p).suggestName("VSetRvfWvf")), 377d91483a6Sfdy srcData = Seq( 378b37ee2eeSZiyue-Zhang Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 379d91483a6Sfdy ), 38078115a00SXuan Hu piped = true, 381b8db7211Sxiaofeibao writeVlRf = true, 3827e4f0b19SZiyue-Zhang writeVType = true, 38387c5d21dSZiyue Zhang writeIntRf = true, 384d91483a6Sfdy latency = CertainLatency(0), 385d91483a6Sfdy immType = Set(SelImm.IMM_VSETVLI, SelImm.IMM_VSETIVLI), 386d91483a6Sfdy ) 387d91483a6Sfdy 388a8db15d8Sfdy val VSetRiWvfCfg: FuConfig = FuConfig( 389a8db15d8Sfdy name = "vsetriwvf", 390d91483a6Sfdy fuType = FuType.vsetiwf, 391a8db15d8Sfdy fuGen = (p: Parameters, cfg: FuConfig) => Module(new VSetRiWvf(cfg)(p).suggestName("VSetRiWvf")), 392d91483a6Sfdy srcData = Seq( 393d91483a6Sfdy Seq(IntData(), IntData()), 394d91483a6Sfdy ), 39578115a00SXuan Hu piped = true, 396b8db7211Sxiaofeibao writeVlRf = true, 3977e4f0b19SZiyue-Zhang writeVType = true, 398d91483a6Sfdy latency = CertainLatency(0), 399d91483a6Sfdy immType = Set(SelImm.IMM_VSETVLI, SelImm.IMM_VSETIVLI), 400d91483a6Sfdy ) 401d91483a6Sfdy 402a8db15d8Sfdy val VSetRiWiCfg: FuConfig = FuConfig( 403a8db15d8Sfdy name = "vsetriwi", 404d91483a6Sfdy fuType = FuType.vsetiwi, 405a8db15d8Sfdy fuGen = (p: Parameters, cfg: FuConfig) => Module(new VSetRiWi(cfg)(p).suggestName("VSetRiWi")), 406730cfbc0SXuan Hu srcData = Seq( 407730cfbc0SXuan Hu Seq(IntData(), IntData()), 408730cfbc0SXuan Hu ), 40978115a00SXuan Hu piped = true, 410730cfbc0SXuan Hu writeIntRf = true, 411d91483a6Sfdy latency = CertainLatency(0), 412d91483a6Sfdy immType = Set(SelImm.IMM_VSETVLI, SelImm.IMM_VSETIVLI), 413730cfbc0SXuan Hu ) 414730cfbc0SXuan Hu 415730cfbc0SXuan Hu val LduCfg: FuConfig = FuConfig ( 416730cfbc0SXuan Hu name = "ldu", 417730cfbc0SXuan Hu fuType = FuType.ldu, 418730cfbc0SXuan Hu fuGen = null, // Todo 419730cfbc0SXuan Hu srcData = Seq( 420730cfbc0SXuan Hu Seq(IntData()), 421730cfbc0SXuan Hu ), 42278115a00SXuan Hu piped = false, // Todo: check it 423730cfbc0SXuan Hu writeIntRf = true, 424730cfbc0SXuan Hu writeFpRf = true, 42523c67001SHaojin Tang latency = UncertainLatency(3), 42672dab974Scz4e exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, loadGuestPageFault, breakPoint, hardwareError), 427730cfbc0SXuan Hu flushPipe = true, 428730cfbc0SXuan Hu replayInst = true, 429730cfbc0SXuan Hu hasLoadError = true, 430f7af4c74Schengguanghui trigger = true, 431730cfbc0SXuan Hu immType = Set(SelImm.IMM_I), 432730cfbc0SXuan Hu ) 433730cfbc0SXuan Hu 434730cfbc0SXuan Hu val StaCfg: FuConfig = FuConfig ( 435730cfbc0SXuan Hu name = "sta", 436730cfbc0SXuan Hu fuType = FuType.stu, 437730cfbc0SXuan Hu fuGen = null, // Todo 438730cfbc0SXuan Hu srcData = Seq( 439730cfbc0SXuan Hu Seq(IntData()), 440730cfbc0SXuan Hu ), 44178115a00SXuan Hu piped = false, 442730cfbc0SXuan Hu latency = UncertainLatency(), 44304b415dbSchengguanghui exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault, breakPoint), 44441d8d239Shappy-lx flushPipe = true, 445f7af4c74Schengguanghui trigger = true, 446730cfbc0SXuan Hu immType = Set(SelImm.IMM_S), 447730cfbc0SXuan Hu ) 448730cfbc0SXuan Hu 449730cfbc0SXuan Hu val StdCfg: FuConfig = FuConfig ( 450730cfbc0SXuan Hu name = "std", 451730cfbc0SXuan Hu fuType = FuType.stu, 452730cfbc0SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new Std(cfg)(p).suggestName("Std")), 453730cfbc0SXuan Hu srcData = Seq( 454730cfbc0SXuan Hu Seq(IntData()), 455730cfbc0SXuan Hu Seq(FpData()), 456730cfbc0SXuan Hu ), 45778115a00SXuan Hu piped = true, 45899bd2aafSHaojin Tang latency = CertainLatency(0) 459730cfbc0SXuan Hu ) 460730cfbc0SXuan Hu 461670870b3SXuan Hu val HyldaCfg = FuConfig ( 462670870b3SXuan Hu name = "hylda", 463670870b3SXuan Hu fuType = FuType.ldu, 464670870b3SXuan Hu fuGen = null, // Todo 465670870b3SXuan Hu srcData = Seq( 466670870b3SXuan Hu Seq(IntData()), 467670870b3SXuan Hu ), 468670870b3SXuan Hu piped = false, // Todo: check it 469670870b3SXuan Hu writeIntRf = true, 470670870b3SXuan Hu writeFpRf = true, 471670870b3SXuan Hu latency = UncertainLatency(3), 47213a87dc5SXiaokun-Pei exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, loadGuestPageFault), 473670870b3SXuan Hu flushPipe = true, 474670870b3SXuan Hu replayInst = true, 475670870b3SXuan Hu hasLoadError = true, 476670870b3SXuan Hu immType = Set(SelImm.IMM_I), 477670870b3SXuan Hu ) 478670870b3SXuan Hu 479670870b3SXuan Hu val HystaCfg = FuConfig ( 480670870b3SXuan Hu name = "hysta", 481670870b3SXuan Hu fuType = FuType.stu, 482670870b3SXuan Hu fuGen = null, // Todo 483670870b3SXuan Hu srcData = Seq( 484670870b3SXuan Hu Seq(IntData()), 485670870b3SXuan Hu ), 486670870b3SXuan Hu piped = false, 487670870b3SXuan Hu latency = UncertainLatency(), 48813a87dc5SXiaokun-Pei exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault), 489670870b3SXuan Hu immType = Set(SelImm.IMM_S), 490670870b3SXuan Hu ) 491670870b3SXuan Hu 492670870b3SXuan Hu val FakeHystaCfg = FuConfig ( 493670870b3SXuan Hu name = "hysta", 494670870b3SXuan Hu fuType = FuType.stu, 495670870b3SXuan Hu fuGen = null, // Todo 496670870b3SXuan Hu srcData = Seq(), 497670870b3SXuan Hu piped = false, 498670870b3SXuan Hu latency = UncertainLatency(), 49913a87dc5SXiaokun-Pei exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault), 500670870b3SXuan Hu immType = Set(), 501670870b3SXuan Hu ) 502670870b3SXuan Hu 503730cfbc0SXuan Hu val MouCfg: FuConfig = FuConfig ( 504730cfbc0SXuan Hu name = "mou", 505730cfbc0SXuan Hu fuType = FuType.mou, 506730cfbc0SXuan Hu fuGen = null, // Todo 507730cfbc0SXuan Hu srcData = Seq( 508730cfbc0SXuan Hu Seq(IntData()), 509730cfbc0SXuan Hu ), 51078115a00SXuan Hu piped = false, // Todo: check it 5115edcc45fSHaojin Tang writeFakeIntRf = true, 512730cfbc0SXuan Hu latency = UncertainLatency(), 513f7af4c74Schengguanghui exceptionOut = (LduCfg.exceptionOut ++ StaCfg.exceptionOut ++ StdCfg.exceptionOut).distinct, 514f7af4c74Schengguanghui trigger = true, 515730cfbc0SXuan Hu ) 516730cfbc0SXuan Hu 517730cfbc0SXuan Hu val MoudCfg: FuConfig = FuConfig ( 518730cfbc0SXuan Hu name = "moud", 519730cfbc0SXuan Hu fuType = FuType.mou, 520730cfbc0SXuan Hu fuGen = null, // Todo 521730cfbc0SXuan Hu srcData = Seq( 522730cfbc0SXuan Hu Seq(IntData()), 523730cfbc0SXuan Hu ), 52478115a00SXuan Hu piped = true, 52578115a00SXuan Hu latency = CertainLatency(0), 526730cfbc0SXuan Hu ) 527730cfbc0SXuan Hu 52874aafe69SXuan Hu val VialuCfg = FuConfig ( 529b6b11f60SXuan Hu name = "vialuFix", 5306a35d972SXuan Hu fuType = FuType.vialuF, 531b6b11f60SXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIAluFix(cfg)(p).suggestName("VialuFix")), 5326a35d972SXuan Hu srcData = Seq( 53307b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 5346a35d972SXuan Hu ), 53578115a00SXuan Hu piped = true, 5366a35d972SXuan Hu writeVecRf = true, 537b8db7211Sxiaofeibao writeV0Rf = true, 5382ee1e93dSXuan Hu writeVxsat = true, 53917985fbbSZiyue Zhang needSrcVxrm = true, 5406a35d972SXuan Hu latency = CertainLatency(1), 541b6b11f60SXuan Hu vconfigWakeUp = true, 542b6b11f60SXuan Hu maskWakeUp = true, 5432d12882cSxiaofeibao destDataBits = 128, 5449a46f19dSsinsanction exceptionOut = Seq(illegalInstr), 5456a35d972SXuan Hu ) 5466a35d972SXuan Hu 5472ee1e93dSXuan Hu val VimacCfg = FuConfig ( 5482ee1e93dSXuan Hu name = "vimac", 5492ee1e93dSXuan Hu fuType = FuType.vimac, 5502ee1e93dSXuan Hu fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIMacU(cfg)(p).suggestName("Vimac")), 5512ee1e93dSXuan Hu srcData = Seq( 55207b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 5532ee1e93dSXuan Hu ), 5542ee1e93dSXuan Hu piped = true, 5552ee1e93dSXuan Hu writeVecRf = true, 556b8db7211Sxiaofeibao writeV0Rf = true, 5572ee1e93dSXuan Hu writeVxsat = true, 55817985fbbSZiyue Zhang needSrcVxrm = true, 5592ee1e93dSXuan Hu latency = CertainLatency(2), 5602ee1e93dSXuan Hu vconfigWakeUp = true, 5612ee1e93dSXuan Hu maskWakeUp = true, 5622d12882cSxiaofeibao destDataBits = 128, 5639a46f19dSsinsanction exceptionOut = Seq(illegalInstr), 5642ee1e93dSXuan Hu ) 5652ee1e93dSXuan Hu 5660bca6cb3SZiyue Zhang val VidivCfg = FuConfig ( 5670bca6cb3SZiyue Zhang name = "vidiv", 5680bca6cb3SZiyue Zhang fuType = FuType.vidiv, 5690bca6cb3SZiyue Zhang fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIDiv(cfg)(p).suggestName("Vidiv")), 5700bca6cb3SZiyue Zhang srcData = Seq( 57107b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 5720bca6cb3SZiyue Zhang ), 5730bca6cb3SZiyue Zhang piped = false, 5740bca6cb3SZiyue Zhang writeVecRf = true, 575b8db7211Sxiaofeibao writeV0Rf = true, 5760bca6cb3SZiyue Zhang latency = UncertainLatency(), 5770bca6cb3SZiyue Zhang vconfigWakeUp = true, 5780bca6cb3SZiyue Zhang maskWakeUp = true, 5792d12882cSxiaofeibao destDataBits = 128, 5800bca6cb3SZiyue Zhang exceptionOut = Seq(illegalInstr), 5810bca6cb3SZiyue Zhang ) 5820bca6cb3SZiyue Zhang 583ad22c988SZiyue Zhang val VppuCfg = FuConfig ( 584ad22c988SZiyue Zhang name = "vppu", 585ad22c988SZiyue Zhang fuType = FuType.vppu, 586ad22c988SZiyue Zhang fuGen = (p: Parameters, cfg: FuConfig) => Module(new VPPU(cfg)(p).suggestName("Vppu")), 587ad22c988SZiyue Zhang srcData = Seq( 58807b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 589ad22c988SZiyue Zhang ), 590ad22c988SZiyue Zhang piped = true, 591ad22c988SZiyue Zhang writeVecRf = true, 592b8db7211Sxiaofeibao writeV0Rf = true, 593b5474268SsinceforYy latency = CertainLatency(2), 594ad22c988SZiyue Zhang vconfigWakeUp = true, 595ad22c988SZiyue Zhang maskWakeUp = true, 5962d12882cSxiaofeibao destDataBits = 128, 5979a46f19dSsinsanction exceptionOut = Seq(illegalInstr), 598ad22c988SZiyue Zhang ) 599ad22c988SZiyue Zhang 600730cfbc0SXuan Hu val VipuCfg: FuConfig = FuConfig ( 601730cfbc0SXuan Hu name = "vipu", 602730cfbc0SXuan Hu fuType = FuType.vipu, 603a74b2cdaSZiyue Zhang fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIPU(cfg)(p).suggestName("Vipu")), 604730cfbc0SXuan Hu srcData = Seq( 60507b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0 606730cfbc0SXuan Hu ), 607a74b2cdaSZiyue Zhang piped = true, 608cd2c45feSZiyue Zhang writeIntRf = true, 609730cfbc0SXuan Hu writeVecRf = true, 610b8db7211Sxiaofeibao writeV0Rf = true, 61102029386Slewislzh latency = CertainLatency(2), 612a74b2cdaSZiyue Zhang vconfigWakeUp = true, 613a74b2cdaSZiyue Zhang maskWakeUp = true, 6142d12882cSxiaofeibao destDataBits = 128, 6159a46f19dSsinsanction exceptionOut = Seq(illegalInstr), 616730cfbc0SXuan Hu ) 617730cfbc0SXuan Hu 618efdf5c1cSxiaofeibao-xjtu val VfaluCfg = FuConfig ( 619efdf5c1cSxiaofeibao-xjtu name = "vfalu", 620efdf5c1cSxiaofeibao-xjtu fuType = FuType.vfalu, 621efdf5c1cSxiaofeibao-xjtu fuGen = (p: Parameters, cfg: FuConfig) => Module(new VFAlu(cfg)(p).suggestName("Vfalu")), 622efdf5c1cSxiaofeibao-xjtu srcData = Seq( 62307b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 624efdf5c1cSxiaofeibao-xjtu ), 625efdf5c1cSxiaofeibao-xjtu piped = true, 626efdf5c1cSxiaofeibao-xjtu writeVecRf = true, 627b8db7211Sxiaofeibao writeV0Rf = true, 62842a750a8Ssinsanction writeFpRf = true, 629efdf5c1cSxiaofeibao-xjtu writeFflags = true, 630efdf5c1cSxiaofeibao-xjtu latency = CertainLatency(1), 631efdf5c1cSxiaofeibao-xjtu vconfigWakeUp = true, 632efdf5c1cSxiaofeibao-xjtu maskWakeUp = true, 6332d12882cSxiaofeibao destDataBits = 128, 6349a46f19dSsinsanction exceptionOut = Seq(illegalInstr), 63534f9ccd0SZiyue Zhang needSrcFrm = true, 636efdf5c1cSxiaofeibao-xjtu ) 637efdf5c1cSxiaofeibao-xjtu 638efdf5c1cSxiaofeibao-xjtu val VfmaCfg = FuConfig ( 639efdf5c1cSxiaofeibao-xjtu name = "vfma", 640efdf5c1cSxiaofeibao-xjtu fuType = FuType.vfma, 641efdf5c1cSxiaofeibao-xjtu fuGen = (p: Parameters, cfg: FuConfig) => Module(new VFMA(cfg)(p).suggestName("Vfma")), 642efdf5c1cSxiaofeibao-xjtu srcData = Seq( 64307b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 644efdf5c1cSxiaofeibao-xjtu ), 645efdf5c1cSxiaofeibao-xjtu piped = true, 646efdf5c1cSxiaofeibao-xjtu writeVecRf = true, 647b8db7211Sxiaofeibao writeV0Rf = true, 648efdf5c1cSxiaofeibao-xjtu writeFflags = true, 649efdf5c1cSxiaofeibao-xjtu latency = CertainLatency(3), 650efdf5c1cSxiaofeibao-xjtu vconfigWakeUp = true, 651efdf5c1cSxiaofeibao-xjtu maskWakeUp = true, 6522d12882cSxiaofeibao destDataBits = 128, 6539a46f19dSsinsanction exceptionOut = Seq(illegalInstr), 65434f9ccd0SZiyue Zhang needSrcFrm = true, 655efdf5c1cSxiaofeibao-xjtu ) 656efdf5c1cSxiaofeibao-xjtu 657efdf5c1cSxiaofeibao-xjtu val VfdivCfg = FuConfig( 658efdf5c1cSxiaofeibao-xjtu name = "vfdiv", 659efdf5c1cSxiaofeibao-xjtu fuType = FuType.vfdiv, 66075841254Sxiaofeibao-xjtu fuGen = (p: Parameters, cfg: FuConfig) => Module(new VFDivSqrt(cfg)(p).suggestName("Vfdiv")), 661efdf5c1cSxiaofeibao-xjtu srcData = Seq( 66207b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 663efdf5c1cSxiaofeibao-xjtu ), 664efdf5c1cSxiaofeibao-xjtu piped = false, 665efdf5c1cSxiaofeibao-xjtu writeVecRf = true, 666b8db7211Sxiaofeibao writeV0Rf = true, 667efdf5c1cSxiaofeibao-xjtu writeFflags = true, 668efdf5c1cSxiaofeibao-xjtu latency = UncertainLatency(), 669efdf5c1cSxiaofeibao-xjtu vconfigWakeUp = true, 670efdf5c1cSxiaofeibao-xjtu maskWakeUp = true, 6712d12882cSxiaofeibao destDataBits = 128, 6729a46f19dSsinsanction exceptionOut = Seq(illegalInstr), 67334f9ccd0SZiyue Zhang needSrcFrm = true, 674efdf5c1cSxiaofeibao-xjtu ) 675efdf5c1cSxiaofeibao-xjtu 6769d3cebe7Schengguanghui val VfcvtCfg = FuConfig( 6779d3cebe7Schengguanghui name = "vfcvt", 6789d3cebe7Schengguanghui fuType = FuType.vfcvt, 6799d3cebe7Schengguanghui fuGen = (p: Parameters, cfg: FuConfig) => Module(new VCVT(cfg)(p).suggestName("Vfcvt")), 6809d3cebe7Schengguanghui srcData = Seq( 68107b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl 6829d3cebe7Schengguanghui ), 6839d3cebe7Schengguanghui piped = true, 6849d3cebe7Schengguanghui writeVecRf = true, 685b8db7211Sxiaofeibao writeV0Rf = true, 6869d3cebe7Schengguanghui writeFflags = true, 6879d3cebe7Schengguanghui latency = CertainLatency(2), 6889d3cebe7Schengguanghui vconfigWakeUp = true, 6899d3cebe7Schengguanghui maskWakeUp = true, 6902d12882cSxiaofeibao destDataBits = 128, 6919d3cebe7Schengguanghui exceptionOut = Seq(illegalInstr), 69234f9ccd0SZiyue Zhang needSrcFrm = true, 6939d3cebe7Schengguanghui ) 6949d3cebe7Schengguanghui 69560f0c5aeSxiaofeibao val FaluCfg = FuConfig( 69660f0c5aeSxiaofeibao name = "falu", 69760f0c5aeSxiaofeibao fuType = FuType.falu, 69860f0c5aeSxiaofeibao fuGen = (p: Parameters, cfg: FuConfig) => Module(new FAlu(cfg)(p).suggestName("Falu")), 69960f0c5aeSxiaofeibao srcData = Seq( 70060f0c5aeSxiaofeibao Seq(FpData(), FpData()), 70160f0c5aeSxiaofeibao ), 70260f0c5aeSxiaofeibao piped = true, 70360f0c5aeSxiaofeibao writeFpRf = true, 70460f0c5aeSxiaofeibao writeIntRf = true, 70560f0c5aeSxiaofeibao writeFflags = true, 70660f0c5aeSxiaofeibao latency = CertainLatency(1), 7072d12882cSxiaofeibao destDataBits = 64, 70860f0c5aeSxiaofeibao needSrcFrm = true, 70960f0c5aeSxiaofeibao ) 71060f0c5aeSxiaofeibao 71160f0c5aeSxiaofeibao val FmacCfg = FuConfig( 71260f0c5aeSxiaofeibao name = "fmac", 71360f0c5aeSxiaofeibao fuType = FuType.fmac, 71460f0c5aeSxiaofeibao fuGen = (p: Parameters, cfg: FuConfig) => Module(new FMA(cfg)(p).suggestName("Fmac")), 71560f0c5aeSxiaofeibao srcData = Seq( 71660f0c5aeSxiaofeibao Seq(FpData(), FpData(), FpData()), 71760f0c5aeSxiaofeibao ), 71860f0c5aeSxiaofeibao piped = true, 71960f0c5aeSxiaofeibao writeFpRf = true, 72060f0c5aeSxiaofeibao writeFflags = true, 72160f0c5aeSxiaofeibao latency = CertainLatency(3), 7222d12882cSxiaofeibao destDataBits = 64, 72360f0c5aeSxiaofeibao needSrcFrm = true, 72460f0c5aeSxiaofeibao ) 72560f0c5aeSxiaofeibao 72660f0c5aeSxiaofeibao val FdivCfg = FuConfig( 72760f0c5aeSxiaofeibao name = "fdiv", 72860f0c5aeSxiaofeibao fuType = FuType.fDivSqrt, 72960f0c5aeSxiaofeibao fuGen = (p: Parameters, cfg: FuConfig) => Module(new FDivSqrt(cfg)(p).suggestName("Fdiv")), 73060f0c5aeSxiaofeibao srcData = Seq( 73160f0c5aeSxiaofeibao Seq(FpData(), FpData()), 73260f0c5aeSxiaofeibao ), 73360f0c5aeSxiaofeibao piped = false, 73460f0c5aeSxiaofeibao writeFpRf = true, 73560f0c5aeSxiaofeibao writeFflags = true, 73660f0c5aeSxiaofeibao latency = UncertainLatency(), 7372d12882cSxiaofeibao destDataBits = 64, 73860f0c5aeSxiaofeibao needSrcFrm = true, 73960f0c5aeSxiaofeibao ) 74060f0c5aeSxiaofeibao 74160f0c5aeSxiaofeibao val FcvtCfg = FuConfig( 74260f0c5aeSxiaofeibao name = "fcvt", 74360f0c5aeSxiaofeibao fuType = FuType.fcvt, 74460f0c5aeSxiaofeibao fuGen = (p: Parameters, cfg: FuConfig) => Module(new FCVT(cfg)(p).suggestName("Fcvt")), 74560f0c5aeSxiaofeibao srcData = Seq( 74660f0c5aeSxiaofeibao Seq(FpData()), 74760f0c5aeSxiaofeibao ), 74860f0c5aeSxiaofeibao piped = true, 74960f0c5aeSxiaofeibao writeFpRf = true, 75060f0c5aeSxiaofeibao writeIntRf = true, 75160f0c5aeSxiaofeibao writeFflags = true, 75260f0c5aeSxiaofeibao latency = CertainLatency(2), 7532d12882cSxiaofeibao destDataBits = 64, 75460f0c5aeSxiaofeibao needSrcFrm = true, 75560f0c5aeSxiaofeibao ) 7569d3cebe7Schengguanghui 7574ee69032SzhanglyGit val VlduCfg: FuConfig = FuConfig ( 7584ee69032SzhanglyGit name = "vldu", 7594ee69032SzhanglyGit fuType = FuType.vldu, 7604ee69032SzhanglyGit fuGen = null, 7614ee69032SzhanglyGit srcData = Seq( 76207b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), //vs1, vs2, vd_old, v0, vconfig 7634ee69032SzhanglyGit ), 7644ee69032SzhanglyGit piped = false, // Todo: check it 7654ee69032SzhanglyGit writeVecRf = true, 766b8db7211Sxiaofeibao writeV0Rf = true, 767df3b4b92SAnzooooo writeVlRf = true, 7684ee69032SzhanglyGit latency = UncertainLatency(), 76994998b06Shappy-lx exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, loadGuestPageFault, breakPoint), 7704ee69032SzhanglyGit flushPipe = true, 7714ee69032SzhanglyGit replayInst = true, 772506ca2a3SAnzooooo trigger = true, 7734ee69032SzhanglyGit hasLoadError = true, 7744ee69032SzhanglyGit vconfigWakeUp = true, 7754ee69032SzhanglyGit maskWakeUp = true, 7762d12882cSxiaofeibao destDataBits = 128, 7774ee69032SzhanglyGit ) 77820a5248fSzhanglinjuan 779e703da02SzhanglyGit val VstuCfg: FuConfig = FuConfig ( 78020a5248fSzhanglinjuan name = "vstu", 78120a5248fSzhanglinjuan fuType = FuType.vstu, 78220a5248fSzhanglinjuan fuGen = null, 78320a5248fSzhanglinjuan srcData = Seq( 78407b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), //vs1, vs2, vd_old, v0, vconfig 78520a5248fSzhanglinjuan ), 786e703da02SzhanglyGit piped = false, 78720a5248fSzhanglinjuan latency = UncertainLatency(), 78894998b06Shappy-lx exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault, breakPoint), 78920a5248fSzhanglinjuan flushPipe = true, 79020a5248fSzhanglinjuan replayInst = true, 791506ca2a3SAnzooooo trigger = true, 79220a5248fSzhanglinjuan hasLoadError = true, 79320a5248fSzhanglinjuan vconfigWakeUp = true, 79420a5248fSzhanglinjuan maskWakeUp = true, 7952d12882cSxiaofeibao destDataBits = 128, 79620a5248fSzhanglinjuan ) 797730cfbc0SXuan Hu 798985804e6SXuan Hu val VseglduSeg: FuConfig = FuConfig ( 799985804e6SXuan Hu name = "vsegldu", 800985804e6SXuan Hu fuType = FuType.vsegldu, 801985804e6SXuan Hu fuGen = null, 802985804e6SXuan Hu srcData = Seq( 80307b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), //vs1, vs2, vd_old, v0, vconfig 804985804e6SXuan Hu ), 805985804e6SXuan Hu piped = false, // Todo: check it 806985804e6SXuan Hu writeVecRf = true, 807b8db7211Sxiaofeibao writeV0Rf = true, 808df3b4b92SAnzooooo writeVlRf = true, 809985804e6SXuan Hu latency = UncertainLatency(), 81094998b06Shappy-lx exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, breakPoint), 811985804e6SXuan Hu flushPipe = true, 812985804e6SXuan Hu replayInst = true, 813506ca2a3SAnzooooo trigger = true, 814985804e6SXuan Hu hasLoadError = true, 815985804e6SXuan Hu vconfigWakeUp = true, 816985804e6SXuan Hu maskWakeUp = true, 8172d12882cSxiaofeibao destDataBits = 128, 818985804e6SXuan Hu ) 819985804e6SXuan Hu 820985804e6SXuan Hu val VsegstuCfg: FuConfig = FuConfig( 821985804e6SXuan Hu name = "vsegstu", 822985804e6SXuan Hu fuType = FuType.vsegstu, 823985804e6SXuan Hu fuGen = null, 824985804e6SXuan Hu srcData = Seq( 82507b5cc60Sxiaofeibao Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), //vs1, vs2, vd_old, v0, vconfig 826985804e6SXuan Hu ), 827985804e6SXuan Hu piped = false, 828985804e6SXuan Hu latency = UncertainLatency(), 82994998b06Shappy-lx exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, breakPoint), 830985804e6SXuan Hu flushPipe = true, 831985804e6SXuan Hu replayInst = true, 832506ca2a3SAnzooooo trigger = true, 833985804e6SXuan Hu hasLoadError = true, 834985804e6SXuan Hu vconfigWakeUp = true, 835985804e6SXuan Hu maskWakeUp = true, 8362d12882cSxiaofeibao destDataBits = 128, 837985804e6SXuan Hu ) 838985804e6SXuan Hu 839b6b11f60SXuan Hu def allConfigs = Seq( 840395c8649SZiyue-Zhang JmpCfg, BrhCfg, I2fCfg, I2vCfg, F2vCfg, CsrCfg, AluCfg, MulCfg, DivCfg, FenceCfg, BkuCfg, VSetRvfWvfCfg, VSetRiWvfCfg, VSetRiWiCfg, 841985804e6SXuan Hu LduCfg, StaCfg, StdCfg, MouCfg, MoudCfg, VialuCfg, VipuCfg, VlduCfg, VstuCfg, VseglduSeg, VsegstuCfg, 84260f0c5aeSxiaofeibao FaluCfg, FmacCfg, FcvtCfg, FdivCfg, 843e703da02SzhanglyGit VfaluCfg, VfmaCfg, VfcvtCfg, HyldaCfg, HystaCfg 844b6b11f60SXuan Hu ) 845da778e6fSXuan Hu 846da778e6fSXuan Hu def VecArithFuConfigs = Seq( 84736040c62Schengguanghui VialuCfg, VimacCfg, VppuCfg, VipuCfg, VfaluCfg, VfmaCfg, VfcvtCfg 848da778e6fSXuan Hu ) 849730cfbc0SXuan Hu} 850730cfbc0SXuan Hu 851