Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
37ccfcd4
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
大约 1 年 前同步成功
通知
1183
Star
3914
Fork
526
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
X
XiangShan
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
37ccfcd4
编写于
9月 21, 2019
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
noop,MDU: use one multiplier with len XLEN+1 to handle all type of mul instructions
上级
c6d625a3
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
33 addition
and
30 deletion
+33
-30
src/main/scala/noop/fu/MDU.scala
src/main/scala/noop/fu/MDU.scala
+33
-30
未找到文件。
src/main/scala/noop/fu/MDU.scala
浏览文件 @
37ccfcd4
...
...
@@ -30,26 +30,18 @@ object MDUOpType {
class
MulDivIO
(
val
len
:
Int
)
extends
Bundle
{
val
in
=
Flipped
(
DecoupledIO
(
Vec
(
2
,
Output
(
UInt
(
len
.
W
)))))
val
sign
=
Input
(
Bool
())
val
out
=
DecoupledIO
(
Vec
(
4
,
Output
(
UInt
(
len
.
W
)
)))
val
out
=
DecoupledIO
(
Output
(
UInt
((
len
*
2
).
W
)))
}
class
Multiplier
(
len
:
Int
)
extends
NOOPModule
{
val
io
=
IO
(
new
MulDivIO
(
len
))
val
latency
=
if
(
HasMExtension
)
1
else
0
val
latency
=
1
def
DSPpipe
[
T
<:
Data
](
a
:
T
)
=
RegNext
(
a
)
//TODO: refactor needed
val
mulRes
=
(
DSPpipe
(
io
.
in
.
bits
(
0
)).
asSInt
*
DSPpipe
(
io
.
in
.
bits
(
1
)).
asSInt
).
asUInt
val
mulResU
=
(
DSPpipe
(
io
.
in
.
bits
(
0
)).
asUInt
*
DSPpipe
(
io
.
in
.
bits
(
1
)).
asUInt
).
asUInt
val
mulResSU
=
(
DSPpipe
(
io
.
in
.
bits
(
0
)).
asSInt
*
DSPpipe
(
Cat
(
0.
U
(
1.
W
),
io
.
in
.
bits
(
1
))).
asSInt
).
asUInt
val
mulPipeOut
=
Pipe
(
DSPpipe
(
io
.
in
.
fire
()),
mulRes
,
latency
)
val
mulPipeOutU
=
Pipe
(
DSPpipe
(
io
.
in
.
fire
()),
mulResU
,
latency
)
val
mulPipeOutSU
=
Pipe
(
DSPpipe
(
io
.
in
.
fire
()),
mulResSU
,
latency
)
io
.
out
.
bits
(
0
)
:=
(
if
(!
HasMExtension
)
0.
U
else
mulPipeOut
.
bits
(
len
-
1
,
0
))
io
.
out
.
bits
(
1
)
:=
(
if
(!
HasMExtension
)
0.
U
else
mulPipeOut
.
bits
(
2
*
len
-
1
,
len
))
io
.
out
.
bits
(
2
)
:=
(
if
(!
HasMExtension
)
0.
U
else
mulPipeOutU
.
bits
(
2
*
len
-
1
,
len
))
io
.
out
.
bits
(
3
)
:=
(
if
(!
HasMExtension
)
0.
U
else
mulPipeOutSU
.
bits
(
2
*
len
-
1
,
len
))
io
.
out
.
bits
:=
mulPipeOut
.
bits
val
busy
=
RegInit
(
false
.
B
)
when
(
io
.
in
.
valid
&&
!
busy
)
{
busy
:=
true
.
B
}
...
...
@@ -130,10 +122,9 @@ class Divider(len: Int = 64) extends NOOPModule {
next
:=
(
state
===
0.
U
&&
io
.
in
.
fire
()
&&
!
specialResult
)
||
(
state
=/=
0.
U
)
val
r
=
hi
(
len
,
1
)
io
.
out
.
bits
(
0
)
:=
(
if
(
HasDiv
)
Mux
(
earlyFinish
,
specialResultLo
,
Mux
(
aSignReg
^
bSignReg
,
-
lo
,
lo
))
else
0.
U
)
io
.
out
.
bits
(
1
)
:=
(
if
(
HasDiv
)
Mux
(
earlyFinish
,
specialResultR
,
Mux
(
aSignReg
,
-
r
,
r
))
else
0.
U
)
io
.
out
.
bits
(
2
)
:=
DontCare
io
.
out
.
bits
(
3
)
:=
DontCare
val
resQ
=
Mux
(
earlyFinish
,
specialResultLo
,
Mux
(
aSignReg
^
bSignReg
,
-
lo
,
lo
))
val
resR
=
Mux
(
earlyFinish
,
specialResultR
,
Mux
(
aSignReg
,
-
r
,
r
))
io
.
out
.
bits
:=
Cat
(
resR
,
resQ
)
io
.
out
.
valid
:=
(
if
(
HasDiv
)
(
finish
||
earlyFinish
)
else
io
.
in
.
valid
)
// FIXME: should deal with ready = 0
}
...
...
@@ -155,7 +146,7 @@ class MDU extends NOOPModule {
io
.
out
.
bits
}
val
mul
=
Module
(
new
Multiplier
(
64
))
val
mul
=
Module
(
new
Multiplier
(
XLEN
+
1
))
val
div
=
Module
(
new
Divider
(
64
))
val
mul32
=
Module
(
new
Multiplier
(
32
))
val
div32
=
Module
(
new
Divider
(
32
))
...
...
@@ -165,6 +156,18 @@ class MDU extends NOOPModule {
x
.
sign
:=
MDUOpType
.
isSign
(
func
)
x
.
out
.
ready
:=
io
.
out
.
ready
}
val
signext
=
SignExt
(
_:
UInt
,
XLEN
+
1
)
val
zeroext
=
ZeroExt
(
_:
UInt
,
XLEN
+
1
)
val
mulInputFuncTable
=
List
(
MDUOpType
.
mul
->
(
zeroext
,
zeroext
),
MDUOpType
.
mulh
->
(
signext
,
signext
),
MDUOpType
.
mulhsu
->
(
signext
,
zeroext
),
MDUOpType
.
mulhu
->
(
zeroext
,
zeroext
)
)
mul
.
io
.
in
.
bits
(
0
)
:=
LookupTree
(
func
(
1
,
0
),
mulInputFuncTable
.
map
(
p
=>
(
p
.
_1
(
1
,
0
),
p
.
_2
.
_1
(
src1
))))
mul
.
io
.
in
.
bits
(
1
)
:=
LookupTree
(
func
(
1
,
0
),
mulInputFuncTable
.
map
(
p
=>
(
p
.
_1
(
1
,
0
),
p
.
_2
.
_2
(
src2
))))
List
(
mul32
.
io
,
div32
.
io
).
map
{
case
x
=>
x
.
in
.
bits
(
0
)
:=
src1
(
31
,
0
)
x
.
in
.
bits
(
1
)
:=
src2
(
31
,
0
)
...
...
@@ -179,20 +182,20 @@ class MDU extends NOOPModule {
div32
.
io
.
in
.
valid
:=
io
.
in
.
valid
&&
isDiv
&&
isW
io
.
out
.
bits
:=
LookupTree
(
func
,
List
(
MDUOpType
.
mul
->
mul
.
io
.
out
.
bits
(
0
),
MDUOpType
.
mulh
->
mul
.
io
.
out
.
bits
(
1
),
MDUOpType
.
mulhu
->
mul
.
io
.
out
.
bits
(
2
),
MDUOpType
.
mulhsu
->
mul
.
io
.
out
.
bits
(
3
),
MDUOpType
.
div
->
div
.
io
.
out
.
bits
(
0
),
MDUOpType
.
divu
->
div
.
io
.
out
.
bits
(
0
),
MDUOpType
.
rem
->
div
.
io
.
out
.
bits
(
1
),
MDUOpType
.
remu
->
div
.
io
.
out
.
bits
(
1
),
MDUOpType
.
mulw
->
SignExt
(
mul32
.
io
.
out
.
bits
(
0
),
XLEN
),
MDUOpType
.
divw
->
SignExt
(
div32
.
io
.
out
.
bits
(
0
),
XLEN
),
MDUOpType
.
divuw
->
SignExt
(
div32
.
io
.
out
.
bits
(
0
),
XLEN
),
//not sure: spec used "signed ext to describe this inst"
MDUOpType
.
remw
->
SignExt
(
div32
.
io
.
out
.
bits
(
1
),
XLEN
),
MDUOpType
.
remuw
->
SignExt
(
div32
.
io
.
out
.
bits
(
1
),
XLEN
)
MDUOpType
.
mul
->
mul
.
io
.
out
.
bits
(
XLEN
-
1
,
0
),
MDUOpType
.
mulh
->
mul
.
io
.
out
.
bits
(
2
*
XLEN
-
1
,
XLEN
),
MDUOpType
.
mulhu
->
mul
.
io
.
out
.
bits
(
2
*
XLEN
-
1
,
XLEN
),
MDUOpType
.
mulhsu
->
mul
.
io
.
out
.
bits
(
2
*
XLEN
-
1
,
XLEN
),
MDUOpType
.
div
->
div
.
io
.
out
.
bits
(
XLEN
-
1
,
0
),
MDUOpType
.
divu
->
div
.
io
.
out
.
bits
(
XLEN
-
1
,
0
),
MDUOpType
.
rem
->
div
.
io
.
out
.
bits
(
2
*
XLEN
-
1
,
XLEN
),
MDUOpType
.
remu
->
div
.
io
.
out
.
bits
(
2
*
XLEN
-
1
,
XLEN
),
MDUOpType
.
mulw
->
SignExt
(
mul32
.
io
.
out
.
bits
(
31
,
0
),
XLEN
),
MDUOpType
.
divw
->
SignExt
(
div32
.
io
.
out
.
bits
(
31
,
0
),
XLEN
),
MDUOpType
.
divuw
->
SignExt
(
div32
.
io
.
out
.
bits
(
31
,
0
),
XLEN
),
MDUOpType
.
remw
->
SignExt
(
div32
.
io
.
out
.
bits
(
63
,
32
),
XLEN
),
MDUOpType
.
remuw
->
SignExt
(
div32
.
io
.
out
.
bits
(
63
,
32
),
XLEN
)
))
val
isDivReg
=
Mux
(
io
.
in
.
fire
(),
isDiv
,
RegNext
(
isDiv
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录