Skip to content

Commit 2d2d7af

Browse files
committed
feat: modify the mdu oper type and algorithm impl
1 parent b053601 commit 2d2d7af

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

rtl/tc_l2/src/main/scala/core/exec/MDU.scala

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3033
class 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

Comments
 (0)