13feeca58Szfw/*************************************************************************************** 23feeca58Szfw* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 33feeca58Szfw* Copyright (c) 2020-2021 Peng Cheng Laboratory 43feeca58Szfw* 53feeca58Szfw* XiangShan is licensed under Mulan PSL v2. 63feeca58Szfw* You can use this software according to the terms and conditions of the Mulan PSL v2. 73feeca58Szfw* You may obtain a copy of Mulan PSL v2 at: 83feeca58Szfw* http://license.coscl.org.cn/MulanPSL2 93feeca58Szfw* 103feeca58Szfw* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 113feeca58Szfw* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 123feeca58Szfw* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 133feeca58Szfw* 143feeca58Szfw* See the Mulan PSL v2 for more details. 153feeca58Szfw***************************************************************************************/ 163feeca58Szfw 173feeca58Szfwpackage xiangshan.backend.fu 183feeca58Szfw 193feeca58Szfwimport chipsalliance.rocketchip.config.Parameters 203feeca58Szfwimport chisel3._ 213feeca58Szfwimport chisel3.util._ 22c0e98e86SYinan Xuimport utils.{LookupTreeDefault, ParallelMux, ParallelXOR, SignExt, XSDebug, XSError, ZeroExt} 233feeca58Szfwimport xiangshan._ 243feeca58Szfwimport xiangshan.backend.fu.util._ 253feeca58Szfw 263feeca58Szfw 273feeca58Szfw 283feeca58Szfw 293feeca58Szfwclass CountModule(implicit p: Parameters) extends XSModule { 303feeca58Szfw val io = IO(new Bundle() { 313feeca58Szfw val src = Input(UInt(XLEN.W)) 323feeca58Szfw val func = Input(UInt()) 33c0e98e86SYinan Xu val regEnable = Input(Bool()) 343feeca58Szfw val out = Output(UInt(XLEN.W)) 353feeca58Szfw }) 363feeca58Szfw 373feeca58Szfw def encode(bits: UInt): UInt = { 383feeca58Szfw LookupTreeDefault(bits, 0.U, List(0.U -> 2.U(2.W), 1.U -> 1.U(2.W))) 393feeca58Szfw } 403feeca58Szfw def clzi(msb: Int, left: UInt, right: UInt): UInt = { 413feeca58Szfw Mux(left(msb), 423feeca58Szfw Cat(left(msb) && right(msb), !right(msb), if(msb==1)right(0) else right(msb-1, 0)), 433feeca58Szfw left) 443feeca58Szfw } 453feeca58Szfw 46c0e98e86SYinan Xu // stage 0 473feeca58Szfw val c0 = Wire(Vec(32, UInt(2.W))) 483feeca58Szfw val c1 = Wire(Vec(16, UInt(3.W))) 493feeca58Szfw val countSrc = Mux(io.func(1), Reverse(io.src), io.src) 503feeca58Szfw 513feeca58Szfw for(i <- 0 until 32){ c0(i) := encode(countSrc(2*i+1, 2*i)) } 523feeca58Szfw for(i <- 0 until 16){ c1(i) := clzi(1, c0(i*2+1), c0(i*2)) } 53c0e98e86SYinan Xu 54c0e98e86SYinan Xu // pipeline registers 55c0e98e86SYinan Xu val funcReg = RegEnable(io.func, io.regEnable) 56c0e98e86SYinan Xu val c2 = Reg(Vec(8, UInt(4.W))) 57c0e98e86SYinan Xu val cpopTmp = Reg(Vec(4, UInt(5.W))) 58c0e98e86SYinan Xu when (io.regEnable) { 59c0e98e86SYinan Xu for (i <- 0 until 8) { 60c0e98e86SYinan Xu c2(i) := clzi(2, c1(i*2+1), c1(i*2)) 61c0e98e86SYinan Xu } 62c0e98e86SYinan Xu for (i <- 0 until 4) { 63c0e98e86SYinan Xu cpopTmp(i) := PopCount(io.src(i*16+15, i*16)) 64c0e98e86SYinan Xu } 65c0e98e86SYinan Xu } 66c0e98e86SYinan Xu 67c0e98e86SYinan Xu // stage 1 68c0e98e86SYinan Xu val c3 = Wire(Vec(4, UInt(5.W))) 69c0e98e86SYinan Xu val c4 = Wire(Vec(2, UInt(6.W))) 70c0e98e86SYinan Xu 713feeca58Szfw for(i <- 0 until 4){ c3(i) := clzi(3, c2(i*2+1), c2(i*2)) } 723feeca58Szfw for(i <- 0 until 2){ c4(i) := clzi(4, c3(i*2+1), c3(i*2)) } 733feeca58Szfw val zeroRes = clzi(5, c4(1), c4(0)) 743feeca58Szfw val zeroWRes = Mux(funcReg(1), c4(1), c4(0)) 753feeca58Szfw 763feeca58Szfw val cpopLo32 = cpopTmp(0) +& cpopTmp(1) 773feeca58Szfw val cpopHi32 = cpopTmp(2) +& cpopTmp(3) 783feeca58Szfw 793feeca58Szfw val cpopRes = cpopLo32 +& cpopHi32 803feeca58Szfw val cpopWRes = cpopLo32 813feeca58Szfw 823feeca58Szfw io.out := Mux(funcReg(2), Mux(funcReg(0), cpopWRes, cpopRes), Mux(funcReg(0), zeroWRes, zeroRes)) 833feeca58Szfw} 843feeca58Szfw 853feeca58Szfwclass ClmulModule(implicit p: Parameters) extends XSModule { 863feeca58Szfw val io = IO(new Bundle() { 873feeca58Szfw val src = Vec(2, Input(UInt(XLEN.W))) 883feeca58Szfw val func = Input(UInt()) 89c0e98e86SYinan Xu val regEnable = Input(Bool()) 903feeca58Szfw val out = Output(UInt(XLEN.W)) 913feeca58Szfw }) 923feeca58Szfw 93c0e98e86SYinan Xu // stage 0 943feeca58Szfw val (src1, src2) = (io.src(0), io.src(1)) 953feeca58Szfw 963feeca58Szfw val mul0 = Wire(Vec(64, UInt(128.W))) 973feeca58Szfw val mul1 = Wire(Vec(32, UInt(128.W))) 983feeca58Szfw val mul2 = Wire(Vec(16, UInt(128.W))) 993feeca58Szfw 1003feeca58Szfw (0 until XLEN) map { i => 1013feeca58Szfw mul0(i) := Mux(src1(i), if(i==0) src2 else Cat(src2, 0.U(i.W)), 0.U) 1023feeca58Szfw } 1033feeca58Szfw (0 until 32) map { i => mul1(i) := mul0(i*2) ^ mul0(i*2+1)} 1043feeca58Szfw (0 until 16) map { i => mul2(i) := mul1(i*2) ^ mul1(i*2+1)} 1053feeca58Szfw 106c0e98e86SYinan Xu // pipeline registers 107c0e98e86SYinan Xu val funcReg = RegEnable(io.func, io.regEnable) 108c0e98e86SYinan Xu val mul3 = Reg(Vec(8, UInt(128.W))) 109c0e98e86SYinan Xu when (io.regEnable) { 110c0e98e86SYinan Xu (0 until 8) map { i => mul3(i) := mul2(i*2) ^ mul2(i*2+1)} 111c0e98e86SYinan Xu } 112c0e98e86SYinan Xu 113c0e98e86SYinan Xu // stage 1 1143feeca58Szfw val res = ParallelXOR(mul3) 1153feeca58Szfw 1163feeca58Szfw val clmul = res(63,0) 1173feeca58Szfw val clmulh = res(127,64) 1183feeca58Szfw val clmulr = res(126,63) 1193feeca58Szfw 1203feeca58Szfw io.out := LookupTreeDefault(funcReg, clmul, List( 1213feeca58Szfw BKUOpType.clmul -> clmul, 1223feeca58Szfw BKUOpType.clmulh -> clmulh, 1233feeca58Szfw BKUOpType.clmulr -> clmulr 1243feeca58Szfw )) 1253feeca58Szfw} 1263feeca58Szfw 1273feeca58Szfwclass MiscModule(implicit p: Parameters) extends XSModule { 1283feeca58Szfw val io = IO(new Bundle() { 1293feeca58Szfw val src = Vec(2, Input(UInt(XLEN.W))) 1303feeca58Szfw val func = Input(UInt()) 131c0e98e86SYinan Xu val regEnable = Input(Bool()) 1323feeca58Szfw val out = Output(UInt(XLEN.W)) 1333feeca58Szfw }) 1343feeca58Szfw 1353feeca58Szfw val (src1, src2) = (io.src(0), io.src(1)) 1363feeca58Szfw 1373feeca58Szfw def xpermLUT(table: UInt, idx: UInt, width: Int) : UInt = { 1383feeca58Szfw // ParallelMux((0 until XLEN/width).map( i => i.U -> table(i)).map( x => (x._1 === idx, x._2))) 1393feeca58Szfw LookupTreeDefault(idx, 0.U(width.W), (0 until XLEN/width).map( i => i.U -> table(i*width+width-1, i*width))) 1403feeca58Szfw } 1413feeca58Szfw 1423feeca58Szfw val xpermnVec = Wire(Vec(16, UInt(4.W))) 1433feeca58Szfw (0 until 16).map( i => xpermnVec(i) := xpermLUT(src1, src2(i*4+3, i*4), 4)) 1443feeca58Szfw val xpermn = Cat(xpermnVec.reverse) 1453feeca58Szfw 1463feeca58Szfw val xpermbVec = Wire(Vec(8, UInt(8.W))) 1473feeca58Szfw (0 until 8).map( i => xpermbVec(i) := Mux(src2(i*8+7, i*8+3).orR, 0.U, xpermLUT(src1, src2(i*8+2, i*8), 8))) 1483feeca58Szfw val xpermb = Cat(xpermbVec.reverse) 1493feeca58Szfw 150c0e98e86SYinan Xu io.out := RegEnable(Mux(io.func(0), xpermb, xpermn), io.regEnable) 1513feeca58Szfw} 1523feeca58Szfw 1533feeca58Szfwclass HashModule(implicit p: Parameters) extends XSModule { 1543feeca58Szfw val io = IO(new Bundle() { 1553feeca58Szfw val src = Input(UInt(XLEN.W)) 1563feeca58Szfw val func = Input(UInt()) 157c0e98e86SYinan Xu val regEnable = Input(Bool()) 1583feeca58Szfw val out = Output(UInt(XLEN.W)) 1593feeca58Szfw }) 1603feeca58Szfw 1613feeca58Szfw val src1 = io.src 1623feeca58Szfw 1633feeca58Szfw val sha256sum0 = ROR32(src1, 2) ^ ROR32(src1, 13) ^ ROR32(src1, 22) 1643feeca58Szfw val sha256sum1 = ROR32(src1, 6) ^ ROR32(src1, 11) ^ ROR32(src1, 25) 1653feeca58Szfw val sha256sig0 = ROR32(src1, 7) ^ ROR32(src1, 18) ^ SHR32(src1, 3) 1663feeca58Szfw val sha256sig1 = ROR32(src1, 17) ^ ROR32(src1, 19) ^ SHR32(src1, 10) 1673feeca58Szfw val sha512sum0 = ROR64(src1, 28) ^ ROR64(src1, 34) ^ ROR64(src1, 39) 1683feeca58Szfw val sha512sum1 = ROR64(src1, 14) ^ ROR64(src1, 18) ^ ROR64(src1, 41) 1693feeca58Szfw val sha512sig0 = ROR64(src1, 1) ^ ROR64(src1, 8) ^ SHR64(src1, 7) 1703feeca58Szfw val sha512sig1 = ROR64(src1, 19) ^ ROR64(src1, 61) ^ SHR64(src1, 6) 1713feeca58Szfw val sm3p0 = ROR32(src1, 23) ^ ROR32(src1, 15) ^ src1 1723feeca58Szfw val sm3p1 = ROR32(src1, 9) ^ ROR32(src1, 17) ^ src1 1733feeca58Szfw 1743feeca58Szfw val shaSource = VecInit(Seq( 1753feeca58Szfw SignExt(sha256sum0(31,0), XLEN), 1763feeca58Szfw SignExt(sha256sum1(31,0), XLEN), 1773feeca58Szfw SignExt(sha256sig0(31,0), XLEN), 1783feeca58Szfw SignExt(sha256sig1(31,0), XLEN), 1793feeca58Szfw sha512sum0, 1803feeca58Szfw sha512sum1, 1813feeca58Szfw sha512sig0, 1823feeca58Szfw sha512sig1 1833feeca58Szfw )) 1843feeca58Szfw val sha = shaSource(io.func(2,0)) 1853feeca58Szfw val sm3 = Mux(io.func(0), SignExt(sm3p1(31,0), XLEN), SignExt(sm3p0(31,0), XLEN)) 1863feeca58Szfw 187c0e98e86SYinan Xu io.out := RegEnable(Mux(io.func(3), sm3, sha), io.regEnable) 1883feeca58Szfw} 1893feeca58Szfw 1903feeca58Szfwclass BlockCipherModule(implicit p: Parameters) extends XSModule { 1913feeca58Szfw val io = IO(new Bundle() { 1923feeca58Szfw val src = Vec(2, Input(UInt(XLEN.W))) 1933feeca58Szfw val func = Input(UInt()) 194c0e98e86SYinan Xu val regEnable = Input(Bool()) 1953feeca58Szfw val out = Output(UInt(XLEN.W)) 1963feeca58Szfw }) 1973feeca58Szfw 198c0e98e86SYinan Xu val (src1, src2, func, funcReg) = (io.src(0), io.src(1), io.func, RegEnable(io.func, io.regEnable)) 1993feeca58Szfw 2003feeca58Szfw val src1Bytes = VecInit((0 until 8).map(i => src1(i*8+7, i*8))) 2013feeca58Szfw val src2Bytes = VecInit((0 until 8).map(i => src2(i*8+7, i*8))) 2023feeca58Szfw 2033feeca58Szfw // AES 2043feeca58Szfw val aesSboxIn = ForwardShiftRows(src1Bytes, src2Bytes) 2053feeca58Szfw val aesSboxMid = Reg(Vec(8, Vec(18, Bool()))) 2063feeca58Szfw val aesSboxOut = Wire(Vec(8, UInt(8.W))) 2073feeca58Szfw 2083feeca58Szfw val iaesSboxIn = InverseShiftRows(src1Bytes, src2Bytes) 2093feeca58Szfw val iaesSboxMid = Reg(Vec(8, Vec(18, Bool()))) 2103feeca58Szfw val iaesSboxOut = Wire(Vec(8, UInt(8.W))) 2113feeca58Szfw 2123feeca58Szfw aesSboxOut.zip(aesSboxMid).zip(aesSboxIn)foreach { case ((out, mid), in) => 213c0e98e86SYinan Xu when (io.regEnable) { 2143feeca58Szfw mid := SboxInv(SboxAesTop(in)) 215c0e98e86SYinan Xu } 2163feeca58Szfw out := SboxAesOut(mid) 2173feeca58Szfw } 2183feeca58Szfw 2193feeca58Szfw iaesSboxOut.zip(iaesSboxMid).zip(iaesSboxIn)foreach { case ((out, mid), in) => 220c0e98e86SYinan Xu when (io.regEnable) { 2213feeca58Szfw mid := SboxInv(SboxIaesTop(in)) 222c0e98e86SYinan Xu } 2233feeca58Szfw out := SboxIaesOut(mid) 2243feeca58Szfw } 2253feeca58Szfw 2263feeca58Szfw val aes64es = aesSboxOut.asUInt 2273feeca58Szfw val aes64ds = iaesSboxOut.asUInt 2283feeca58Szfw 229c0e98e86SYinan Xu val imMinIn = RegEnable(src1Bytes, io.regEnable) 2303feeca58Szfw 2313feeca58Szfw val aes64esm = Cat(MixFwd(Seq(aesSboxOut(4), aesSboxOut(5), aesSboxOut(6), aesSboxOut(7))), 2323feeca58Szfw MixFwd(Seq(aesSboxOut(0), aesSboxOut(1), aesSboxOut(2), aesSboxOut(3)))) 2333feeca58Szfw val aes64dsm = Cat(MixInv(Seq(iaesSboxOut(4), iaesSboxOut(5), iaesSboxOut(6), iaesSboxOut(7))), 2343feeca58Szfw MixInv(Seq(iaesSboxOut(0), iaesSboxOut(1), iaesSboxOut(2), iaesSboxOut(3)))) 2353feeca58Szfw val aes64im = Cat(MixInv(Seq(imMinIn(4), imMinIn(5), imMinIn(6), imMinIn(7))), 2363feeca58Szfw MixInv(Seq(imMinIn(0), imMinIn(1), imMinIn(2), imMinIn(3)))) 2373feeca58Szfw 2383feeca58Szfw 2393feeca58Szfw val rcon = WireInit(VecInit(Seq("h01".U, "h02".U, "h04".U, "h08".U, 2403feeca58Szfw "h10".U, "h20".U, "h40".U, "h80".U, 2413feeca58Szfw "h1b".U, "h36".U, "h00".U))) 2423feeca58Szfw 2433feeca58Szfw val ksSboxIn = Wire(Vec(4, UInt(8.W))) 2443feeca58Szfw val ksSboxTop = Reg(Vec(4, Vec(21, Bool()))) 2453feeca58Szfw val ksSboxOut = Wire(Vec(4, UInt(8.W))) 2463feeca58Szfw ksSboxIn(0) := Mux(src2(3,0) === "ha".U, src1Bytes(4), src1Bytes(5)) 2473feeca58Szfw ksSboxIn(1) := Mux(src2(3,0) === "ha".U, src1Bytes(5), src1Bytes(6)) 2483feeca58Szfw ksSboxIn(2) := Mux(src2(3,0) === "ha".U, src1Bytes(6), src1Bytes(7)) 2493feeca58Szfw ksSboxIn(3) := Mux(src2(3,0) === "ha".U, src1Bytes(7), src1Bytes(4)) 2503feeca58Szfw ksSboxOut.zip(ksSboxTop).zip(ksSboxIn).foreach{ case ((out, top), in) => 251c0e98e86SYinan Xu when (io.regEnable) { 2523feeca58Szfw top := SboxAesTop(in) 253c0e98e86SYinan Xu } 2543feeca58Szfw out := SboxAesOut(SboxInv(top)) 2553feeca58Szfw } 2563feeca58Szfw 257c0e98e86SYinan Xu val ks1Idx = RegEnable(src2(3,0), io.regEnable) 2583feeca58Szfw val aes64ks1i = Cat(ksSboxOut.asUInt ^ rcon(ks1Idx), ksSboxOut.asUInt ^ rcon(ks1Idx)) 2593feeca58Szfw 2603feeca58Szfw val aes64ks2Temp = src1(63,32) ^ src2(31,0) 261c0e98e86SYinan Xu val aes64ks2 = RegEnable(Cat(aes64ks2Temp ^ src2(63,32), aes64ks2Temp), io.regEnable) 2623feeca58Szfw 2633feeca58Szfw val aesResult = LookupTreeDefault(funcReg, aes64es, List( 2643feeca58Szfw BKUOpType.aes64es -> aes64es, 2653feeca58Szfw BKUOpType.aes64esm -> aes64esm, 2663feeca58Szfw BKUOpType.aes64ds -> aes64ds, 2673feeca58Szfw BKUOpType.aes64dsm -> aes64dsm, 2683feeca58Szfw BKUOpType.aes64im -> aes64im, 2693feeca58Szfw BKUOpType.aes64ks1i -> aes64ks1i, 2703feeca58Szfw BKUOpType.aes64ks2 -> aes64ks2 2713feeca58Szfw )) 2723feeca58Szfw 2733feeca58Szfw // SM4 2743feeca58Szfw val sm4SboxIn = src2Bytes(func(1,0)) 2753feeca58Szfw val sm4SboxTop = Reg(Vec(21, Bool())) 276c0e98e86SYinan Xu when (io.regEnable) { 2773feeca58Szfw sm4SboxTop := SboxSm4Top(sm4SboxIn) 278c0e98e86SYinan Xu } 2793feeca58Szfw val sm4SboxOut = SboxSm4Out(SboxInv(sm4SboxTop)) 2803feeca58Szfw 281*19bcce38SFawang Zhang val sm4ed = sm4SboxOut ^ (sm4SboxOut<<8) ^ (sm4SboxOut<<2) ^ (sm4SboxOut<<18) ^ ((sm4SboxOut&"h3f".U)<<26) ^ ((sm4SboxOut&"hc0".U)<<10) 282*19bcce38SFawang Zhang val sm4ks = sm4SboxOut ^ ((sm4SboxOut&"h07".U)<<29) ^ ((sm4SboxOut&"hfe".U)<<7) ^ ((sm4SboxOut&"h01".U)<<23) ^ ((sm4SboxOut&"hf8".U)<<13) 2833feeca58Szfw val sm4Source = VecInit(Seq( 2843feeca58Szfw sm4ed(31,0), 2853feeca58Szfw Cat(sm4ed(23,0), sm4ed(31,24)), 2863feeca58Szfw Cat(sm4ed(15,0), sm4ed(31,16)), 2873feeca58Szfw Cat(sm4ed( 7,0), sm4ed(31,8)), 2883feeca58Szfw sm4ks(31,0), 2893feeca58Szfw Cat(sm4ks(23,0), sm4ks(31,24)), 2903feeca58Szfw Cat(sm4ks(15,0), sm4ks(31,16)), 2913feeca58Szfw Cat(sm4ks( 7,0), sm4ks(31,8)) 2923feeca58Szfw )) 293c0e98e86SYinan Xu val sm4Result = SignExt((sm4Source(funcReg(2,0)) ^ RegEnable(src1(31,0), io.regEnable))(31,0), XLEN) 2943feeca58Szfw 2953feeca58Szfw io.out := Mux(funcReg(3), sm4Result, aesResult) 2963feeca58Szfw} 2973feeca58Szfw 2983feeca58Szfwclass CryptoModule(implicit p: Parameters) extends XSModule { 2993feeca58Szfw val io = IO(new Bundle() { 3003feeca58Szfw val src = Vec(2, Input(UInt(XLEN.W))) 3013feeca58Szfw val func = Input(UInt()) 302c0e98e86SYinan Xu val regEnable = Input(Bool()) 3033feeca58Szfw val out = Output(UInt(XLEN.W)) 3043feeca58Szfw }) 3053feeca58Szfw 3063feeca58Szfw val (src1, src2, func) = (io.src(0), io.src(1), io.func) 307c0e98e86SYinan Xu val funcReg = RegEnable(func, io.regEnable) 3083feeca58Szfw 3093feeca58Szfw val hashModule = Module(new HashModule) 3103feeca58Szfw hashModule.io.src := src1 3113feeca58Szfw hashModule.io.func := func 312c0e98e86SYinan Xu hashModule.io.regEnable := io.regEnable 3133feeca58Szfw 3143feeca58Szfw val blockCipherModule = Module(new BlockCipherModule) 3153feeca58Szfw blockCipherModule.io.src(0) := src1 3163feeca58Szfw blockCipherModule.io.src(1) := src2 3173feeca58Szfw blockCipherModule.io.func := func 318c0e98e86SYinan Xu blockCipherModule.io.regEnable := io.regEnable 3193feeca58Szfw 3203feeca58Szfw io.out := Mux(funcReg(4), hashModule.io.out, blockCipherModule.io.out) 3213feeca58Szfw} 3223feeca58Szfw 3233feeca58Szfwclass Bku(implicit p: Parameters) extends FunctionUnit with HasPipelineReg { 3243feeca58Szfw 325c0e98e86SYinan Xu override def latency = 2 3263feeca58Szfw 327c0e98e86SYinan Xu val (src1, src2, func) = ( 3283feeca58Szfw io.in.bits.src(0), 3293feeca58Szfw io.in.bits.src(1), 330c0e98e86SYinan Xu io.in.bits.uop.ctrl.fuOpType 3313feeca58Szfw ) 3323feeca58Szfw 3333feeca58Szfw val countModule = Module(new CountModule) 3343feeca58Szfw countModule.io.src := src1 3353feeca58Szfw countModule.io.func := func 336c0e98e86SYinan Xu countModule.io.regEnable := regEnable(1) 3373feeca58Szfw 3383feeca58Szfw val clmulModule = Module(new ClmulModule) 3393feeca58Szfw clmulModule.io.src(0) := src1 3403feeca58Szfw clmulModule.io.src(1) := src2 3413feeca58Szfw clmulModule.io.func := func 342c0e98e86SYinan Xu clmulModule.io.regEnable := regEnable(1) 3433feeca58Szfw 3443feeca58Szfw val miscModule = Module(new MiscModule) 3453feeca58Szfw miscModule.io.src(0) := src1 3463feeca58Szfw miscModule.io.src(1) := src2 3473feeca58Szfw miscModule.io.func := func 348c0e98e86SYinan Xu miscModule.io.regEnable := regEnable(1) 3493feeca58Szfw 3503feeca58Szfw val cryptoModule = Module(new CryptoModule) 3513feeca58Szfw cryptoModule.io.src(0) := src1 3523feeca58Szfw cryptoModule.io.src(1) := src2 3533feeca58Szfw cryptoModule.io.func := func 354c0e98e86SYinan Xu cryptoModule.io.regEnable := regEnable(1) 3553feeca58Szfw 3563feeca58Szfw 357c0e98e86SYinan Xu // CountModule, ClmulModule, MiscModule, and CryptoModule have a latency of 1 cycle 358c0e98e86SYinan Xu val funcReg = uopVec(1).ctrl.fuOpType 3593feeca58Szfw val result = Mux(funcReg(5), cryptoModule.io.out, 3603feeca58Szfw Mux(funcReg(3), countModule.io.out, 3613feeca58Szfw Mux(funcReg(2),miscModule.io.out, clmulModule.io.out))) 3623feeca58Szfw 363c0e98e86SYinan Xu io.out.bits.data := RegEnable(result, regEnable(2)) 3643feeca58Szfw} 365