@@ -8,34 +8,38 @@ object MDUOpType {
88 def mulh = " b0001" .U
99 def mulhsu = " b0010" .U
1010 def mulhu = " b0011" .U
11- def div = " b0100" .U
12- def divu = " b0101" .U
13- def rem = " b0110" .U
14- def remu = " b0111" .U
11+ def mulw = " b0100" .U
1512
16- def mulw = " b1000" .U
17- def divw = " b1100" .U
18- def divuw = " b1101" .U
19- def remw = " b1110" .U
20- def remuw = " b1111" .U
13+ def div = " b1000" .U
14+ def divu = " b1001" .U
15+ def divuw = " b1010" .U
16+ def divw = " b1011" .U
17+ def rem = " b1100" .U
18+ def remu = " b1101" .U
19+ def remuw = " b1110" .U
20+ def remw = " b1111" .U
2121
22+ def nop = " b1001" .U
23+
24+ def isMul (op : UInt ) = ! op(3 )
25+ def isDiv (op : UInt ) = op(3 ) && ! (! op(2 ) && ! op(1 ) && op(0 ))
2226 def isLhsSign (op : UInt ) = false .B
2327 def isRhsSign (op : UInt ) = false .B
24- def isDiv (op : UInt ) = op(2 )
25- def isDivSign (op : UInt ) = isDiv(op) && ! op(0 )
28+ def isDivSign (op : UInt ) = false .B
2629 def isHiRem (op : UInt ) = false .B
27- def isW (op : UInt ) = op( 3 )
30+ def isW (op : UInt ) = false . B
2831}
2932
3033class MDU extends Module {
3134 val io = IO (new Bundle {
32- val isa = Input (new ISAIO )
33- val src1 = Input (UInt (64 .W ))
34- val src2 = Input (UInt (64 .W ))
35- val res = Output (UInt (64 .W ))
35+ val isa = Input (new ISAIO )
36+ val src1 = Input (UInt (64 .W ))
37+ val src2 = Input (UInt (64 .W ))
38+ val res = Output (UInt (64 .W ))
39+ val valid = Output (Bool ())
3640 })
3741
38- protected val mduOp = RegInit (0 . U ( 4 . W ) )
42+ protected val mduOp = RegInit (MDUOpType .nop )
3943 when(io.isa.MUL ) {
4044 mduOp := MDUOpType .mul
4145 }.elsewhen(io.isa.MULH ) {
@@ -66,6 +70,7 @@ class MDU extends Module {
6670
6771 protected val isLhsSign = MDUOpType .isLhsSign(mduOp)
6872 protected val isRhsSign = MDUOpType .isRhsSign(mduOp)
73+ protected val isMul = MDUOpType .isMul(mduOp)
6974 protected val isDiv = MDUOpType .isDiv(mduOp)
7075 protected val isHiRem = MDUOpType .isHiRem(mduOp)
7176
@@ -76,10 +81,10 @@ class MDU extends Module {
7681 protected val isAnsNeg = isSrc1Neg ^ isSrc2Neg
7782 protected val src1 = Mux (isSrc1Neg, - io.src1, io.src1)
7883 protected val src2 = Mux (isSrc2Neg, - io.src2, io.src2)
84+ multiplier.io.en := isMul
85+ multiplier.io.flush := false .B
7986 multiplier.io.src1 := src1
8087 multiplier.io.src2 := src2
81- multiplier.io.en := false .B
82- multiplier.io.flush := false .B
8388
8489 protected val mulRes = Mux (isAnsNeg, - multiplier.io.res, multiplier.io.res)
8590
@@ -98,7 +103,6 @@ class MDU extends Module {
98103 divider.io.divident := src1
99104 divider.io.divisor := src2
100105
101- // io.valid := Mux(!isDiv, multiplier.io.done, Mux(isDiv, divider.io.done, true.B))
102- // io.res := Mux(!isDiv, mulRes, Mux(isDiv, divRes, 0.U))
103- io.res := 0 .U
106+ io.valid := Mux (isMul, multiplier.io.done, Mux (isDiv, divider.io.done, true .B ))
107+ io.res := Mux (isMul, mulRes, Mux (isDiv, divRes, 0 .U (64 .W )))
104108}
0 commit comments