Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
c2c50f25
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,发现更多精彩内容 >>
提交
c2c50f25
编写于
10月 03, 2019
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
noop,fu,MDU: clean up
上级
fcbda1b7
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
23 addition
and
57 deletion
+23
-57
src/main/scala/noop/fu/MDU.scala
src/main/scala/noop/fu/MDU.scala
+23
-57
未找到文件。
src/main/scala/noop/fu/MDU.scala
浏览文件 @
c2c50f25
...
...
@@ -52,11 +52,6 @@ class Multiplier(len: Int) extends NOOPModule {
class
Divider
(
len
:
Int
=
64
)
extends
NOOPModule
{
val
io
=
IO
(
new
MulDivIO
(
len
))
val
shiftReg
=
Reg
(
UInt
((
1
+
len
*
2
).
W
))
val
bReg
=
Reg
(
UInt
(
len
.
W
))
val
aSignReg
=
Reg
(
Bool
())
val
bSignReg
=
Reg
(
Bool
())
def
abs
(
a
:
UInt
,
sign
:
Bool
)
:
(
Bool
,
UInt
)
=
{
val
s
=
a
(
len
-
1
)
&&
sign
(
s
,
Mux
(
s
,
-
a
,
a
))
...
...
@@ -64,71 +59,45 @@ class Divider(len: Int = 64) extends NOOPModule {
val
stateCnt
=
Counter
(
len
+
2
)
val
busy
=
stateCnt
.
value
=/=
0.
U
val
newReq
=
!
busy
&&
io
.
in
.
fire
()
val
(
a
,
b
)
=
(
io
.
in
.
bits
(
0
),
io
.
in
.
bits
(
1
))
val
divBy0
=
b
===
0.
U
(
len
.
W
)
//Division by zero
val
divisionByZero
=
b
===
0.
U
(
len
.
W
)
//Overflow
val
bit1
=
1.
U
(
1.
W
)
val
overflow
=
(
a
===
Cat
(
1.
U
(
1.
W
),
0.
U
((
len
-
1
).
W
)))
&&
(
b
===
Fill
(
len
,
bit1
))
&&
io
.
sign
val
specialResult
=
divisionByZero
||
overflow
val
earlyFinish
=
RegInit
(
false
.
B
)
val
specialResultDIV
=
Mux
(
overflow
,
Cat
(
1.
U
(
1.
W
),
0.
U
((
len
-
1
).
W
)),
Fill
(
len
,
bit1
))
val
specialResultDIVU
=
Fill
(
len
,
bit1
)
val
specialResultREM
=
Mux
(
overflow
,
0.
U
(
len
.
W
),
a
)
val
specialResultREMU
=
a
val
specialResultLo
=
Reg
(
UInt
(
len
.
W
))
val
specialResultR
=
Reg
(
UInt
(
len
.
W
))
//early finish
io
.
in
.
ready
:=
!
busy
&&
!
earlyFinish
val
newReqIn
=
!
busy
&&
io
.
in
.
fire
()
when
(
newReqIn
){
earlyFinish
:=
specialResult
specialResultLo
:=
Mux
(
io
.
sign
,
specialResultDIV
,
specialResultDIVU
)
specialResultR
:=
Mux
(
io
.
sign
,
specialResultREM
,
specialResultREMU
)
}
when
(
io
.
out
.
fire
&&
!
newReqIn
){
earlyFinish
:=
false
.
B
}
val
shiftReg
=
Reg
(
UInt
((
1
+
len
*
2
).
W
))
val
hi
=
shiftReg
(
len
*
2
,
len
)
val
lo
=
shiftReg
(
len
-
1
,
0
)
val
(
aSign
,
aVal
)
=
abs
(
a
,
io
.
sign
)
val
(
bSign
,
bVal
)
=
abs
(
b
,
io
.
sign
)
val
aSignReg
=
RegEnable
(
aSign
,
newReq
)
val
bSignReg
=
RegEnable
(
bSign
,
newReq
)
val
bReg
=
RegEnable
(
bVal
,
newReq
)
when
(!
busy
&&
io
.
in
.
fire
()
&&
!
specialResult
)
{
val
(
aSign
,
aVal
)
=
abs
(
a
,
io
.
sign
)
val
(
bSign
,
bVal
)
=
abs
(
b
,
io
.
sign
)
aSignReg
:=
aSign
bSignReg
:=
bSign
bReg
:=
bVal
when
(
newReq
)
{
val
aLeadingZero
=
CountLeadingZero
(
aVal
,
XLEN
)
val
bEffectiveBit
=
CountEffectiveBit
(
bVal
,
XLEN
)
// this is at least 1, else divide by 0
val
canSkipShift
=
aLeadingZero
+&
bEffectiveBit
val
skipShift
=
Mux
(
canSkipShift
>=
(
len
+
1
).
U
,
(
len
+
1
).
U
,
canSkipShift
)
// When divide by 0, the quotient should be all 1's.
// Therefore we can not shift in 0s here.
// We do not skip any shift to avoid this.
val
skipShift
=
Mux
(
divBy0
,
1.
U
,
Mux
(
canSkipShift
>=
(
len
+
1
).
U
,
(
len
+
1
).
U
,
canSkipShift
))
shiftReg
:=
aVal
<<
skipShift
stateCnt
.
value
:=
skipShift
// printf(name + " Input %x %x %x\n", io.in.bits(0), io.in.bits(1), specialResult)
// printf(name + " ABS %x %x \n", aVal, bVal)
}
.
elsewhen
(
busy
)
{
stateCnt
.
inc
()
}
val
hi
=
shiftReg
(
len
*
2
,
len
)
val
lo
=
shiftReg
(
len
-
1
,
0
)
when
(
busy
)
{
val
enough
=
hi
.
asUInt
>=
bReg
.
asUInt
shiftReg
:=
Cat
(
Mux
(
enough
,
hi
-
bReg
,
hi
)(
len
-
1
,
0
),
lo
,
enough
)
//printf(" DIVing state %d hi %x lo %x earlyFinish %x\n", stateCnt.value, hi, lo, earlyFinish
)
stateCnt
.
inc
(
)
}
val
finish
=
(
stateCnt
.
value
===
(
stateCnt
.
n
-
1
).
U
)
&&
busy
val
r
=
hi
(
len
,
1
)
val
resQ
=
Mux
(
earlyFinish
,
specialResultLo
,
Mux
(
aSignReg
^
bSignReg
,
-
lo
,
lo
)
)
val
resR
=
Mux
(
earlyFinish
,
specialResultR
,
Mux
(
aSignReg
,
-
r
,
r
)
)
val
resQ
=
Mux
(
(
aSignReg
^
bSignReg
)
&&
!
divBy0
,
-
lo
,
lo
)
val
resR
=
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
val
finish
=
(
stateCnt
.
value
===
(
stateCnt
.
n
-
1
).
U
)
&&
busy
io
.
out
.
valid
:=
(
if
(
HasDiv
)
finish
else
io
.
in
.
valid
)
// FIXME: should deal with ready = 0
io
.
in
.
ready
:=
!
busy
}
class
MDUIO
extends
FunctionUnitIO
{
...
...
@@ -138,9 +107,6 @@ class MDU extends NOOPModule {
val
io
=
IO
(
new
MDUIO
)
val
(
valid
,
src1
,
src2
,
func
)
=
(
io
.
in
.
valid
,
io
.
in
.
bits
.
src1
,
io
.
in
.
bits
.
src2
,
io
.
in
.
bits
.
func
)
// when(io.in.fire()){
// printf(name + "%x %x\n", src1, src2)
// }
def
access
(
valid
:
Bool
,
src1
:
UInt
,
src2
:
UInt
,
func
:
UInt
)
:
UInt
=
{
this
.
valid
:=
valid
this
.
src1
:=
src1
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录