1/*************************************************************************************** 2* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC) 3* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences 4* Copyright (c) 2020-2021 Peng Cheng Laboratory 5* 6* XiangShan is licensed under Mulan PSL v2. 7* You can use this software according to the terms and conditions of the Mulan PSL v2. 8* You may obtain a copy of Mulan PSL v2 at: 9* http://license.coscl.org.cn/MulanPSL2 10* 11* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 12* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 13* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 14* 15* See the Mulan PSL v2 for more details. 16***************************************************************************************/ 17 18// This file contains components originally written by Yifei He, see 19// https://github.com/OpenXiangShan/XS-Verilog-Library/tree/main/int_div_radix_4_v1 20// Email of original author: [email protected] 21 22package xiangshan.backend.fu 23 24import org.chipsalliance.cde.config.Parameters 25import chisel3._ 26import chisel3.util._ 27import utils._ 28import utility._ 29import xiangshan._ 30import xiangshan.backend.fu.util.CSA3_2 31 32class SRT16DividerDataModule(len: Int) extends Module { 33 val io = IO(new Bundle() { 34 val src = Vec(2, Input(UInt(len.W))) 35 val valid, sign, kill_w, kill_r, isHi, isW = Input(Bool()) 36 val in_ready = Output(Bool()) 37 val out_valid = Output(Bool()) 38 val out_validNext = Output(Bool()) 39 val out_data = Output(UInt(len.W)) 40 val out_ready = Input(Bool()) 41 }) 42 43 // consts 44 val lzc_width = log2Up(len) 45 val itn_len = 1 + len + 2 + 1 46 47 val (a, d, sign, valid, kill_w, kill_r, isHi, isW) = 48 (io.src(0), io.src(1), io.sign, io.valid, io.kill_w, io.kill_r, io.isHi, io.isW) 49 val in_fire = valid && io.in_ready 50 val out_fire = io.out_ready && io.out_valid 51 val newReq = in_fire 52 val s_idle :: s_pre_0 :: s_pre_1 :: s_iter :: s_post_0 :: s_post_1 :: s_finish :: Nil = Enum(7) 53 val quot_neg_2 :: quot_neg_1 :: quot_0 :: quot_pos_1 :: quot_pos_2 :: Nil = Enum(5) 54 55 56 val state = RegInit((1 << s_idle.litValue.toInt).U(7.W)) 57 58 // reused wires 59// val aNormAbs = Wire(UInt((len + 1).W)) // Inputs of xNormAbs regs below 60// val dNormAbs = Wire(UInt((len + 1).W)) 61 val quotIter = Wire(UInt(len.W)) 62 val quotM1Iter = Wire(UInt(len.W)) 63 val aLZC = Wire(UInt((lzc_width + 1).W)) 64 val dLZC = Wire(UInt((lzc_width + 1).W)) 65 66 val rNext = Wire(UInt(itn_len.W)) 67 val rNextPd = Wire(UInt(itn_len.W)) 68 69 val aInverter = Wire(UInt(len.W)) // results of global inverter 70 val dInverter = Wire(UInt(len.W)) 71 72 val finalIter = Wire(Bool()) 73 val special = Wire(Bool()) 74 75 // reused regs 76// val aNormAbsReg = RegEnable(aNormAbs, newReq | state(s_pre_0) | state(s_post_0)) // reg for normalized a & d and rem & rem+d 77// val dNormAbsReg = RegEnable(dNormAbs, newReq | state(s_pre_0) | state(s_post_0)) 78 val quotIterReg = RegEnable(quotIter, state(s_pre_1) | state(s_iter) | state(s_post_0)) 79 val quotM1IterReg = RegEnable(quotM1Iter, state(s_pre_1) | state(s_iter) | state(s_post_0)) 80 val specialReg = RegEnable(special, state(s_pre_1)) 81 val aReg = RegEnable(a, in_fire) 82 83 when(kill_r) { 84 state := UIntToOH(s_idle, 7) 85 } .elsewhen(state(s_idle) && in_fire && !kill_w) { 86 state := UIntToOH(s_pre_0, 7) 87 } .elsewhen(state(s_pre_0)) { // leading zero detection 88 state := UIntToOH(s_pre_1, 7) 89 } .elsewhen(state(s_pre_1)) { // shift a/b 90 state := Mux(special, UIntToOH(s_post_1, 7), UIntToOH(s_iter, 7)) 91 } .elsewhen(state(s_iter)) { // (ws[j+1], wc[j+1]) = 4(ws[j],wc[j]) - q(j+1)*d 92 state := Mux(finalIter, UIntToOH(s_post_0, 7), UIntToOH(s_iter, 7)) 93 } .elsewhen(state(s_post_0)) { // if rem < 0, rem = rem + d 94 state := UIntToOH(s_post_1, 7) 95 } .elsewhen(state(s_post_1)) { 96 state := UIntToOH(s_finish, 7) 97 } .elsewhen(state(s_finish) && io.out_ready) { 98 state := UIntToOH(s_idle, 7) 99 } .otherwise { 100 state := state 101 } 102 103 io.in_ready := state(s_idle) 104 aInverter := -Mux(state(s_idle), a, quotIterReg) // 64, 0 105 dInverter := -Mux(state(s_idle), d, quotM1IterReg) // 64, 0 106 107 val aSign = io.sign && a(len - 1) // 1 108 val dSign = io.sign && d(len - 1) 109 val dSignReg = RegEnable(dSign, newReq) 110 111 val aAbs = Mux(aSign, aInverter, a) // 64, 0 112 val dAbs = Mux(dSign, dInverter, d) 113 val aAbsReg = RegEnable(aAbs, newReq) 114 val dAbsReg = RegEnable(dAbs, newReq) 115 116 val aNorm = (aAbsReg(len - 1, 0) << aLZC(lzc_width - 1, 0))(len - 1, 0) // 64, 65 117 val dNorm = (dAbsReg(len - 1, 0) << dLZC(lzc_width - 1, 0))(len - 1, 0) 118 119 val aNormReg = RegEnable(aNorm, state(s_pre_0)) 120 val dNormReg = RegEnable(dNorm, state(s_pre_0)) 121 122// aNormAbs := Mux1H(Seq( 123// state(s_idle) -> Cat(0.U(1.W), aAbs), // 65, 0 124// state(s_pre_0) -> Cat(0.U(1.W), aNorm), // 65, 0 125// state(s_post_0) -> rNext(len + 3, 3) // remainder 65, 64. highest is sign bit 126// )) 127// dNormAbs := Mux1H(Seq( 128// state(s_idle) -> Cat(0.U(1.W), dAbs), 129// state(s_pre_0) -> Cat(0.U(1.W), dNorm), 130// state(s_post_0) -> rNextPd(len + 3, 3) 131// )) 132 133 // Second cycle, state is pre_0 134 // calculate lzc and move div* and lzc diff check if no_iter_needed 135 136 aLZC := PriorityEncoder(aAbsReg(len - 1, 0).asBools.reverse) 137 dLZC := PriorityEncoder(dAbsReg(len - 1, 0).asBools.reverse) 138 val aLZCReg = RegEnable(aLZC, state(s_pre_0)) // 7, 0 139 val dLZCReg = RegEnable(dLZC, state(s_pre_0)) 140 141 val lzcWireDiff = Cat(0.U(1.W), dLZC(lzc_width - 1, 0)) - Cat(0.U(1.W), aLZC(lzc_width - 1, 0)) // 7, 0 142 val lzcRegDiff = Cat(0.U(1.W), dLZCReg(lzc_width - 1, 0)) - Cat(0.U(1.W), aLZCReg(lzc_width - 1, 0)) 143// val lzcDiff = Mux(state(s_pre_0), lzcWireDiff, lzcRegDiff) 144 145 // special case: 146 // divisor is 1 or -1; dividend has less bits than divisor; divisor is zero 147 // s_pre_0: 148 val dIsOne = dLZC(lzc_width - 1, 0).andR 149 val dIsZero = ~dNormReg.orR 150 val aIsZero = RegEnable(aLZC(lzc_width), state(s_pre_0)) 151 val aTooSmall = RegEnable(aLZC(lzc_width) | lzcWireDiff(lzc_width), state(s_pre_0)) 152 special := dIsOne | dIsZero | aTooSmall 153 154 val quotSpecial = Mux(dIsZero, VecInit(Seq.fill(len)(true.B)).asUInt, 155 Mux(aTooSmall, 0.U, 156 Mux(dSignReg, -aReg, aReg) // signed 2^(len-1) 157 )) 158 val remSpecial = Mux(dIsZero || aTooSmall, aReg, 0.U) 159 val quotSpecialReg = RegEnable(quotSpecial, state(s_pre_1)) 160 val remSpecialReg = RegEnable(remSpecial, state(s_pre_1)) 161 162 // s_pre_1 163 val quotSign = Mux(state(s_idle), aSign ^ dSign, true.B) // if not s_idle then must be s_pre_1 & dIsZero, and that we have 164 val rSign = aSign 165 val quotSignReg = RegEnable(quotSign, in_fire | (state(s_pre_1) & dIsZero)) 166 val rSignReg = RegEnable(rSign, in_fire) 167 168 val rShift = lzcRegDiff(0) 169 val oddIter = lzcRegDiff(1) ^ lzcRegDiff(0) 170 val iterNum = Wire(UInt((lzc_width - 2).W)) 171 val iterNumReg = RegEnable(iterNum, state(s_pre_1) | state(s_iter)) 172 iterNum := Mux(state(s_pre_1), (lzcRegDiff + 1.U) >> 2, iterNumReg -% 1.U) 173 finalIter := iterNumReg === 0.U 174 175 val rSumInit = Cat(0.U(3.W), Mux(rShift, Cat(0.U(1.W), aNormReg), Cat(aNormReg, 0.U(1.W)))) //(1, 67), 0.001xxx 176 val rCarryInit = 0.U(itn_len.W) 177 178 val rSumInitTrunc = Cat(0.U(1.W), rSumInit(itn_len - 4, itn_len - 4 - 4 + 1)) // 0.00___ 179 val mInitPos1 = MuxLookup(dNormReg(len-2, len-4), "b00100".U(5.W))( 180 Seq( 181 0.U -> "b00100".U(5.W), 182 1.U -> "b00100".U(5.W), 183 2.U -> "b00100".U(5.W), 184 3.U -> "b00110".U(5.W), 185 4.U -> "b00110".U(5.W), 186 5.U -> "b00110".U(5.W), 187 6.U -> "b00110".U(5.W), 188 7.U -> "b01000".U(5.W), 189 ) 190 ) 191 val mInitPos2 = MuxLookup(dNormReg(len-2, len-4), "b01100".U(5.W))( 192 Seq( 193 0.U -> "b01100".U(5.W), 194 1.U -> "b01110".U(5.W), 195 2.U -> "b01111".U(5.W), 196 3.U -> "b10000".U(5.W), 197 4.U -> "b10010".U(5.W), 198 5.U -> "b10100".U(5.W), 199 6.U -> "b10110".U(5.W), 200 7.U -> "b10110".U(5.W), 201 ) 202 ) 203 val initCmpPos1 = rSumInitTrunc >= mInitPos1 204 val initCmpPos2 = rSumInitTrunc >= mInitPos2 205 val qInit = Mux(initCmpPos2, UIntToOH(quot_pos_2, 5), Mux(initCmpPos1, UIntToOH(quot_pos_1, 5), UIntToOH(quot_0, 5))) 206 207 // in pre_1 we also obtain m_i + 16u * d for all u 208 // udNeg -> (rud, r2ud) -> (rudPmNeg, r2udPmNeg) 209 val dPos = Cat(0.U(1.W), dNormReg) // +d, 0.1xxx, (1, 64) 210 val dNeg = -Cat(0.U(1.W), dNormReg) // -d, 1.xxxx, (1, 64) 211 // val m = Wire(Vec(4, UInt(7.W))) // we have to sigext them to calculate rqd-m_k 212 213 // index 0 is for q=-2 and 4 is for q=2!!! 214 val mNeg = Wire(Vec(4, UInt(12.W))) // selected m, extended to (6, 6) bits 215 val rudNeg = Wire(Vec(5, UInt(10.W))) // (4, 6) 216 val r2udNeg = Wire(Vec(5, UInt(12.W))) // (6, 6) 217 218 // Selection Block with improved timing 219 val rudPmNeg = Wire(Vec(5, Vec(4, UInt(10.W)))) // -(r*u*d+m_k), (5, 5) bits 220 val r2ws = Wire(UInt(10.W)) // r^2*ws (5, 5) bits 221 val r2wc = Wire(UInt(10.W)) 222 // calculating exact values of w 223 val udNeg = Wire(Vec(5, UInt(itn_len.W))) // (3, 65), 1 signExt'ed Bit 224 // val r3udNeg = Wire(Vec(5, UInt(13.W))) 225 226 // Speculative Block 227 val r2udPmNeg = Wire(Vec(5, Vec(4, UInt(13.W)))) // -(r^2*d*d+m_k), (7, 6) bits. 1st index for q 2nd for m 228 val r3ws = Wire(UInt(13.W)) // r^3*ws, (7, 6) bits 229 val r3wc = Wire(UInt(13.W)) 230 val qSpec = Wire(Vec(5, UInt(5.W))) // 5 speculative results of qNext2 231 // output wires 232 val qNext = Wire(UInt(5.W)) 233 val qNext2 = Wire(UInt(5.W)) 234 val rCarryIter = Wire(UInt(itn_len.W)) // (1, 67) 235 val rSumIter = Wire(UInt(itn_len.W)) 236 // val r3wsIter = Wire(UInt(13.W)) 237 // val r3wcIter = Wire(UInt(13.W)) 238 // Input Regs of whole Spec + Sel + sum adder block 239 val qPrevReg = RegEnable(Mux(state(s_pre_1), qInit, qNext2), state(s_pre_1) | state(s_iter)) 240 val rSumReg = RegEnable(Mux(state(s_pre_1), rSumInit, rSumIter), state(s_pre_1) | state(s_iter)) // (1, 67) 241 val rCarryReg = RegEnable(Mux(state(s_pre_1), rCarryInit, rCarryIter), state(s_pre_1) | state(s_iter)) 242 243 // Give values to the regs and wires above... 244 val dForLookup = dPos(len-2, len-4) 245 mNeg := VecInit(Cat(SignExt(MuxLookup(dNormReg(len-2, len-4), "b00000000".U(7.W))(mLookUpTable2.minus_m(0)), 11), 0.U(1.W)), // (2, 5) -> (6, 6) 246 Cat(SignExt(MuxLookup(dNormReg(len-2, len-4), "b00000000".U(7.W))(mLookUpTable2.minus_m(1)), 10) ,0.U(2.W)), // (3, 4) -> (6, 6) 247 Cat(SignExt(MuxLookup(dNormReg(len-2, len-4), "b00000000".U(7.W))(mLookUpTable2.minus_m(2)), 10) ,0.U(2.W)), 248 Cat(SignExt(MuxLookup(dNormReg(len-2, len-4), "b00000000".U(7.W))(mLookUpTable2.minus_m(3)), 11) ,0.U(1.W)) 249 ) 250 udNeg := VecInit( Cat(SignExt(dPos, 66), 0.U(2.W)), 251 Cat(SignExt(dPos, 67), 0.U(1.W)), 252 0.U, 253 Cat(SignExt(dNeg, 67), 0.U(1.W)), 254 Cat(SignExt(dNeg, 66), 0.U(2.W)) 255 ) 256 257 rudNeg := VecInit(Seq.tabulate(5){i => udNeg(i)(itn_len-2, itn_len-11)}) 258 r2udNeg := VecInit(Seq.tabulate(5){i => udNeg(i)(itn_len-2, itn_len-13)}) 259 // r3udNeg := VecInit(Seq.tabulate(5){i => udNeg(i)(itn_len-2, itn_len-13)}) 260 rudPmNeg := VecInit(Seq.tabulate(5){i => VecInit(Seq.tabulate(4){ j => SignExt(rudNeg(i)(9, 1), 10) + mNeg(j)(10, 1)})}) 261 r2udPmNeg := VecInit(Seq.tabulate(5){i => VecInit(Seq.tabulate(4){ j => SignExt(r2udNeg(i), 13) + SignExt(mNeg(j), 13)})}) 262 r3ws := rSumReg(itn_len-1, itn_len-13) 263 r3wc := rCarryReg(itn_len-1, itn_len-13) 264 265 r2ws := rSumReg(itn_len-1, itn_len-10) 266 r2wc := rCarryReg(itn_len-1, itn_len-10) 267 268 val udNegReg = RegEnable(udNeg, state(s_pre_1)) 269// val rudNegReg = RegEnable(rudNeg, state(s_pre_1)) 270 val rudPmNegReg = RegEnable(rudPmNeg, state(s_pre_1)) 271 val r2udPmNegReg = RegEnable(r2udPmNeg, state(s_pre_1)) 272 273 def DetectSign(signs: UInt, name: String): UInt = { 274 val qVec = Wire(Vec(5, Bool())).suggestName(name) 275 qVec(quot_neg_2) := signs(0) && signs(1) && signs(2) 276 qVec(quot_neg_1) := ~signs(0) && signs(1) && signs(2) 277 qVec(quot_0) := signs(2) && ~signs(1) 278 qVec(quot_pos_1) := signs(3) && ~signs(2) && ~signs(1) 279 qVec(quot_pos_2) := ~signs(3) && ~signs(2) && ~signs(1) 280 qVec.asUInt 281 } 282 // Selection block 283 val signs = VecInit(Seq.tabulate(4){ i => { 284 val csa = Module(new CSA3_2(10)).suggestName(s"csa_sel_${i}") 285 csa.io.in(0) := r2ws 286 csa.io.in(1) := r2wc 287 csa.io.in(2) := Mux1H(qPrevReg, rudPmNegReg.toSeq)(i) // rudPmNeg(OHToUInt(qPrevReg))(i) 288 289 (csa.io.out(0) + (csa.io.out(1)(8, 0) << 1))(9) 290 }}) 291 qNext := DetectSign(signs.asUInt, s"sel_q") 292 val csaWide1 = Module(new CSA3_2(itn_len)).suggestName("csa_sel_wide_1") 293 val csaWide2 = Module(new CSA3_2(itn_len)).suggestName("csa_sel_wide_2") 294 csaWide1.io.in(0) := rSumReg << 2 295 csaWide1.io.in(1) := rCarryReg << 2 296 csaWide1.io.in(2) := Mux1H(qPrevReg, udNegReg.toSeq) << 2//udNeg(OHToUInt(qPrevReg)) << 2 297 csaWide2.io.in(0) := csaWide1.io.out(0) << 2 298 csaWide2.io.in(1) := (csaWide1.io.out(1) << 1)(itn_len-1, 0) << 2 299 csaWide2.io.in(2) := Mux1H(qNext, udNegReg.toSeq) << 2 // udNeg(OHToUInt(qNext)) << 2 300 rSumIter := Mux(~oddIter & finalIter, csaWide1.io.out(0), csaWide2.io.out(0)) 301 rCarryIter := Mux(~oddIter & finalIter, (csaWide1.io.out(1) << 1)(itn_len-1, 0), (csaWide2.io.out(1) << 1)(itn_len-1, 0)) 302 // r3wsIter := r3udNeg(OHToUInt(qNext)) 303 // r3wcIter := (csaWide1.io.out(0)(itn_len-3, itn_len-16) + (csaWide1.io.out(1) << 1)(itn_len-3, itn_len-16))(13,1) 304 // Speculative block 305 qSpec := VecInit(Seq.tabulate(5){ q_spec => { 306 val csa1 = Module(new CSA3_2(13)).suggestName(s"csa_spec_${q_spec}") 307 csa1.io.in(0) := r3ws 308 csa1.io.in(1) := r3wc 309 csa1.io.in(2) := SignExt(udNegReg(q_spec)(itn_len-2, itn_len-11), 13) // (4, 6) -> (7, 6) 310 val signs2 = VecInit(Seq.tabulate(4){ i => { 311 val csa2 = Module(new CSA3_2(13)).suggestName(s"csa_spec_${q_spec}_${i}") 312 csa2.io.in(0) := csa1.io.out(0) 313 csa2.io.in(1) := (csa1.io.out(1) << 1)(12, 0) 314 csa2.io.in(2) := Mux1H(qPrevReg, r2udPmNegReg.toSeq)(i) // r2udPmNeg(OHToUInt(qPrevReg))(i) 315 (csa2.io.out(0) + (csa2.io.out(1)(11, 0) << 1))(12) 316 }}) 317 val qVec2 = DetectSign(signs2.asUInt, s"spec_q_${q_spec}") 318 qVec2 319 }}) 320 // qNext2 := qSpec(OHToUInt(qNext)) // TODO: Use Mux1H!! 321 322 qNext2 := Mux1H(qNext, qSpec.toSeq) 323 324 // on the fly quotient conversion 325 val quotHalfIter = Wire(UInt(64.W)) 326 val quotM1HalfIter = Wire(UInt(64.W)) 327 val quotIterNext = Wire(UInt(64.W)) 328 val quotM1IterNext = Wire(UInt(64.W)) 329 def OTFC(q: UInt, quot: UInt, quotM1: UInt): (UInt, UInt) = { 330 val quotNext = Mux1H(Seq( 331 q(quot_pos_2) -> (quot << 2 | "b10".U), 332 q(quot_pos_1) -> (quot << 2 | "b01".U), 333 q(quot_0) -> (quot << 2 | "b00".U), 334 q(quot_neg_1) -> (quotM1 << 2 | "b11".U), 335 q(quot_neg_2) -> (quotM1 << 2 | "b10".U) 336 )) 337 val quotM1Next = Mux1H(Seq( 338 q(quot_pos_2) -> (quot << 2 | "b01".U), 339 q(quot_pos_1) -> (quot << 2 | "b00".U), 340 q(quot_0) -> (quotM1 << 2 | "b11".U), 341 q(quot_neg_1) -> (quotM1 << 2 | "b10".U), 342 q(quot_neg_2) -> (quotM1 << 2 | "b01".U) 343 )) 344 (quotNext(len-1, 0), quotM1Next(len-1, 0)) 345 } 346 quotHalfIter := OTFC(qPrevReg, quotIterReg, quotM1IterReg)._1 347 quotM1HalfIter := OTFC(qPrevReg, quotIterReg, quotM1IterReg)._2 348 quotIterNext := Mux(~oddIter && finalIter, quotHalfIter, OTFC(qNext, quotHalfIter, quotM1HalfIter)._1) 349 quotM1IterNext := Mux(~oddIter && finalIter, quotM1HalfIter, OTFC(qNext, quotHalfIter, quotM1HalfIter)._2) 350 // quotIter := Mux(state(s_pre_1), 0.U(len.W), 351 // Mux(state(s_iter), quotIterNext, 352 // Mux(quotSignReg, aInverter, quotIterReg))) 353 // quotM1Iter := Mux(state(s_pre_1), 354 // 0.U(len.W), Mux(state(s_iter), quotM1IterNext, 355 // Mux(quotSignReg, dInverter, quotM1IterReg))) 356 357 quotIter := Mux(state(s_iter), quotIterNext, 358 Mux(state(s_pre_1), 0.U(len.W), 359 Mux(quotSignReg, aInverter, quotIterReg))) 360 quotM1Iter := Mux(state(s_iter), quotM1IterNext, 361 Mux(state(s_pre_1), 0.U(len.W), 362 Mux(quotSignReg, dInverter, quotM1IterReg))) 363 // finally, to the recovery stages! 364 365 when(rSignReg) { 366 rNext := ~rSumReg + ~rCarryReg + 2.U 367 rNextPd := ~rSumReg + ~rCarryReg + ~Cat(0.U(1.W), dNormReg, 0.U(3.W)) + 3.U 368 } .otherwise { 369 rNext := rSumReg + rCarryReg 370 rNextPd := rSumReg + rCarryReg + Cat(0.U(1.W), dNormReg, 0.U(3.W)) 371 } 372 val rNextReg = RegEnable(rNext(len + 3, 3), state(s_post_0)) 373 val rNextPdReg = RegEnable(rNextPd(len + 3, 3), state(s_post_0)) 374 dontTouch(rNextReg) 375 // post_1 376 val r = rNextReg 377 val rPd = rNextPdReg 378 val rIsZero = ~(r.orR) 379 val needCorr = Mux(rSignReg, ~r(len) & r.orR, r(len)) // when we get pos rem for a<0 or neg rem for a>0 380 val rPreShifted = Mux(needCorr, rPd, r) 381 val rightShifter = Module(new RightShifter(len, lzc_width)) 382 rightShifter.io.in := rPreShifted 383 rightShifter.io.shiftNum := dLZCReg 384 rightShifter.io.msb := Mux(~(rPreShifted.orR), 0.U, rSignReg) 385 val rShifted = rightShifter.io.out 386 val rFinal = RegEnable(Mux(specialReg, remSpecialReg, rShifted), state(s_post_1))// right shifted remainder. shift by the number of bits divisor is shifted 387 val qFinal = RegEnable(Mux(specialReg, quotSpecialReg, Mux(needCorr, quotM1IterReg, quotIterReg)), state(s_post_1)) 388 val res = Mux(isHi, rFinal, qFinal) 389 io.out_data := Mux(isW, 390 SignExt(res(31, 0), len), 391 res 392 ) 393 io.in_ready := state(s_idle) 394 io.out_valid := state(s_finish) 395 io.out_validNext := state(s_post_1) 396} 397 398object mLookUpTable2 { 399 // Usage : 400 // result := decoder(QMCMinimizer, index, mLookupTable.xxx) 401 val minus_m = Seq( 402 Seq( // -m[-1] 403 0.U -> "b00_11010".U(7.W), 404 1.U -> "b00_11110".U(7.W), 405 2.U -> "b01_00000".U(7.W), 406 3.U -> "b01_00100".U(7.W), 407 4.U -> "b01_00110".U(7.W), 408 5.U -> "b01_01010".U(7.W), 409 6.U -> "b01_01100".U(7.W), 410 7.U -> "b01_10000".U(7.W) 411 ), 412 Seq( // -m[0] 413 0.U -> "b000_0100".U(7.W), 414 1.U -> "b000_0110".U(7.W), 415 2.U -> "b000_0110".U(7.W), 416 3.U -> "b000_0110".U(7.W), 417 4.U -> "b000_1000".U(7.W), 418 5.U -> "b000_1000".U(7.W), 419 6.U -> "b000_1000".U(7.W), 420 7.U -> "b000_1000".U(7.W) 421 ), 422 Seq( //-m[1] 423 0.U -> "b111_1101".U(7.W), 424 1.U -> "b111_1100".U(7.W), 425 2.U -> "b111_1100".U(7.W), 426 3.U -> "b111_1100".U(7.W), 427 4.U -> "b111_1011".U(7.W), 428 5.U -> "b111_1010".U(7.W), 429 6.U -> "b111_1010".U(7.W), 430 7.U -> "b111_1010".U(7.W) 431 ), 432 Seq( //-m[2] 433 0.U -> "b11_01000".U(7.W), 434 1.U -> "b11_00100".U(7.W), 435 2.U -> "b11_00010".U(7.W), 436 3.U -> "b10_11110".U(7.W), 437 4.U -> "b10_11100".U(7.W), 438 5.U -> "b10_11000".U(7.W), 439 6.U -> "b10_10110".U(7.W), 440 7.U -> "b10_10010".U(7.W) 441 )) 442} 443