Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
b2284f68
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,发现更多精彩内容 >>
未验证
提交
b2284f68
编写于
1月 15, 2021
作者:
L
ljw
提交者:
GitHub
1月 15, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #431 from RISCVERS/fix-dispatch-order
Dispatch: palce ALUs after MDUs (Alu should be close to int regfile)
上级
a4ef1e8d
ffc2f15b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
32 addition
and
29 deletion
+32
-29
src/main/scala/xiangshan/backend/IntegerBlock.scala
src/main/scala/xiangshan/backend/IntegerBlock.scala
+2
-2
src/main/scala/xiangshan/backend/dispatch/Dispatch2Int.scala
src/main/scala/xiangshan/backend/dispatch/Dispatch2Int.scala
+27
-24
src/main/scala/xiangshan/backend/dispatch/IndexMapping.scala
src/main/scala/xiangshan/backend/dispatch/IndexMapping.scala
+3
-3
未找到文件。
src/main/scala/xiangshan/backend/IntegerBlock.scala
浏览文件 @
b2284f68
...
...
@@ -102,11 +102,11 @@ class IntegerBlock
len
=
XLEN
))
val
aluExeUnits
=
Array
.
tabulate
(
exuParameters
.
AluCnt
)(
_
=>
Module
(
new
AluExeUnit
))
val
jmpExeUnit
=
Module
(
new
JumpExeUnit
)
val
mduExeUnits
=
Array
.
tabulate
(
exuParameters
.
MduCnt
)(
_
=>
Module
(
new
MulDivExeUnit
))
val
aluExeUnits
=
Array
.
tabulate
(
exuParameters
.
AluCnt
)(
_
=>
Module
(
new
AluExeUnit
))
val
exeUnits
=
jmpExeUnit
+:
(
aluExeUnits
++
md
uExeUnits
)
val
exeUnits
=
jmpExeUnit
+:
(
mduExeUnits
++
al
uExeUnits
)
def
needWakeup
(
cfg
:
ExuConfig
)
:
Boolean
=
(
cfg
.
readIntRf
&&
cfg
.
writeIntRf
)
||
(
cfg
.
readFpRf
&&
cfg
.
writeFpRf
)
...
...
src/main/scala/xiangshan/backend/dispatch/Dispatch2Int.scala
浏览文件 @
b2284f68
...
...
@@ -17,37 +17,40 @@ class Dispatch2Int extends XSModule {
val
readPortIndex
=
Vec
(
exuParameters
.
IntExuCnt
,
Output
(
UInt
(
log2Ceil
(
8
/
2
).
W
)))
})
val
jmpCnt
=
exuParameters
.
JmpCnt
val
mduCnt
=
exuParameters
.
MduCnt
val
aluCnt
=
exuParameters
.
AluCnt
/**
* Part 1: generate indexes for reservation stations
*/
assert
(
jmpCnt
==
1
)
val
jmpCanAccept
=
VecInit
(
io
.
fromDq
.
map
(
deq
=>
deq
.
valid
&&
jumpExeUnitCfg
.
canAccept
(
deq
.
bits
.
ctrl
.
fuType
)))
val
aluCanAccept
=
VecInit
(
io
.
fromDq
.
map
(
deq
=>
deq
.
valid
&&
aluExeUnitCfg
.
canAccept
(
deq
.
bits
.
ctrl
.
fuType
)))
val
mduCanAccept
=
VecInit
(
io
.
fromDq
.
map
(
deq
=>
deq
.
valid
&&
mulDivExeUnitCfg
.
canAccept
(
deq
.
bits
.
ctrl
.
fuType
)))
assert
(
exuParameters
.
JmpCnt
==
1
)
val
jmpIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
IntDqDeqWidth
,
exuParameters
.
JmpCnt
,
false
))
val
aluIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
IntDqDeqWidth
,
exuParameters
.
AluCnt
,
true
))
val
mduIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
IntDqDeqWidth
,
exuParameters
.
MduCnt
,
true
))
val
aluPriority
=
PriorityGen
((
0
until
exuParameters
.
AluCnt
).
map
(
i
=>
io
.
numExist
(
i
+
exuParameters
.
JmpCnt
)))
val
mduPriority
=
PriorityGen
((
0
until
exuParameters
.
MduCnt
).
map
(
i
=>
io
.
numExist
(
i
+
exuParameters
.
JmpCnt
+
exuParameters
.
AluCnt
)))
val
aluCanAccept
=
VecInit
(
io
.
fromDq
.
map
(
deq
=>
deq
.
valid
&&
aluExeUnitCfg
.
canAccept
(
deq
.
bits
.
ctrl
.
fuType
)))
val
jmpIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
IntDqDeqWidth
,
jmpCnt
,
false
))
val
mduIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
IntDqDeqWidth
,
mduCnt
,
true
))
val
aluIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
IntDqDeqWidth
,
aluCnt
,
true
))
val
mduPriority
=
PriorityGen
(
io
.
numExist
.
slice
(
jmpCnt
,
jmpCnt
+
mduCnt
))
val
aluPriority
=
PriorityGen
(
io
.
numExist
.
drop
(
jmpCnt
+
mduCnt
))
jmpIndexGen
.
io
.
validBits
:=
jmpCanAccept
aluIndexGen
.
io
.
validBits
:=
aluCanAccept
mduIndexGen
.
io
.
validBits
:=
mduCanAccept
aluIndexGen
.
io
.
validBits
:=
aluCanAccept
jmpIndexGen
.
io
.
priority
:=
DontCare
aluIndexGen
.
io
.
priority
:=
aluPriority
mduIndexGen
.
io
.
priority
:=
mduPriority
aluIndexGen
.
io
.
priority
:=
aluPriority
val
allIndexGen
=
Seq
(
jmpIndexGen
,
aluIndexGen
,
mduIndexGen
)
val
validVec
=
allIndexGen
.
map
(
_
.
io
.
mapping
.
map
(
_
.
valid
)).
reduceLeft
(
_
++
_
)
val
indexVec
=
allIndexGen
.
map
(
_
.
io
.
mapping
.
map
(
_
.
bits
)).
reduceLeft
(
_
++
_
)
for
(
i
<-
validVec
.
indices
)
{
// XSDebug(p"mapping $i: valid ${validVec(i)} index ${indexVec(i)}\n")
}
val
allIndexGen
=
Seq
(
jmpIndexGen
,
mduIndexGen
,
aluIndexGen
)
val
validVec
=
allIndexGen
.
flatMap
(
_
.
io
.
mapping
.
map
(
_
.
valid
))
val
indexVec
=
allIndexGen
.
flatMap
(
_
.
io
.
mapping
.
map
(
_
.
bits
))
/**
* Part 2: assign regfile read ports
*/
val
intStaticIndex
=
Seq
(
1
,
2
,
3
,
4
)
val
intDynamicIndex
=
Seq
(
0
,
5
,
6
)
val
intStaticIndex
=
Seq
(
3
,
4
,
5
,
6
)
val
intDynamicIndex
=
Seq
(
0
,
1
,
2
)
val
intStaticMappedValid
=
intStaticIndex
.
map
(
i
=>
validVec
(
i
))
val
intDynamicMappedValid
=
intDynamicIndex
.
map
(
i
=>
validVec
(
i
))
val
(
intReadPortSrc
,
intDynamicExuSrc
)
=
RegfileReadPortGen
(
intStaticMappedValid
,
intDynamicMappedValid
)
...
...
@@ -66,18 +69,18 @@ class Dispatch2Int extends XSModule {
* Part 3: dispatch to reservation stations
*/
val
jmpReady
=
io
.
enqIQCtrl
(
0
).
ready
val
aluReady
=
Cat
(
io
.
enqIQCtrl
.
take
(
exuParameters
.
JmpCnt
+
exuParameters
.
AluCnt
).
drop
(
exuParameters
.
Jmp
Cnt
).
map
(
_
.
ready
)).
andR
val
mduReady
=
Cat
(
io
.
enqIQCtrl
.
drop
(
exuParameters
.
JmpCnt
+
exuParameters
.
Al
uCnt
).
map
(
_
.
ready
)).
andR
val
mduReady
=
Cat
(
io
.
enqIQCtrl
.
slice
(
jmpCnt
,
jmpCnt
+
mdu
Cnt
).
map
(
_
.
ready
)).
andR
val
aluReady
=
Cat
(
io
.
enqIQCtrl
.
drop
(
jmpCnt
+
md
uCnt
).
map
(
_
.
ready
)).
andR
for
(
i
<-
0
until
exuParameters
.
IntExuCnt
)
{
val
enq
=
io
.
enqIQCtrl
(
i
)
if
(
i
<
exuParameters
.
J
mpCnt
)
{
if
(
i
<
j
mpCnt
)
{
enq
.
valid
:=
jmpIndexGen
.
io
.
mapping
(
i
).
valid
// && jmpReady
}
else
if
(
i
<
exuParameters
.
JmpCnt
+
exuParameters
.
Al
uCnt
)
{
enq
.
valid
:=
aluIndexGen
.
io
.
mapping
(
i
-
exuParameters
.
JmpCnt
).
valid
&&
al
uReady
else
if
(
i
<
jmpCnt
+
md
uCnt
)
{
enq
.
valid
:=
mduIndexGen
.
io
.
mapping
(
i
-
jmpCnt
).
valid
&&
md
uReady
}
else
{
enq
.
valid
:=
mduIndexGen
.
io
.
mapping
(
i
-
(
exuParameters
.
JmpCnt
+
exuParameters
.
AluCnt
)).
valid
&&
md
uReady
else
{
// alu
enq
.
valid
:=
aluIndexGen
.
io
.
mapping
(
i
-
(
jmpCnt
+
mduCnt
)).
valid
&&
al
uReady
}
enq
.
bits
:=
io
.
fromDq
(
indexVec
(
i
)).
bits
...
...
src/main/scala/xiangshan/backend/dispatch/IndexMapping.scala
浏览文件 @
b2284f68
...
...
@@ -85,7 +85,7 @@ object RegfileReadPortGen {
val
choiceCount
=
dynamicMappedValid
.
length
+
1
val
readPortSrc
=
Wire
(
Vec
(
staticMappedValid
.
length
,
UInt
(
log2Ceil
(
choiceCount
).
W
)))
var
hasAssigned
=
(
0
until
choiceCount
).
map
(
_
=>
false
.
B
)
for
(
i
<-
0
until
staticMappedValid
.
length
)
{
for
(
i
<-
staticMappedValid
.
indices
)
{
val
valid
=
staticMappedValid
(
i
)
+:
dynamicMappedValid
val
wantReadPort
=
(
0
until
choiceCount
).
map
(
j
=>
valid
(
j
)
&&
((
j
==
0
).
asBool
()
||
!
hasAssigned
(
j
)))
readPortSrc
(
i
)
:=
PriorityEncoder
(
wantReadPort
)
...
...
@@ -93,8 +93,8 @@ object RegfileReadPortGen {
hasAssigned
=
(
0
until
choiceCount
).
map
(
i
=>
hasAssigned
(
i
)
||
onehot
(
i
))
}
val
dynamicExuSrc
=
Wire
(
Vec
(
dynamicMappedValid
.
length
,
UInt
(
log2Ceil
(
staticMappedValid
.
length
).
W
)))
for
(
i
<-
0
until
dynamicMappedValid
.
length
)
{
val
targetMatch
=
(
0
until
staticMappedValid
.
length
)
.
map
(
j
=>
readPortSrc
(
j
)
===
(
i
+
1
).
U
)
for
(
i
<-
dynamicMappedValid
.
indices
)
{
val
targetMatch
=
staticMappedValid
.
indices
.
map
(
j
=>
readPortSrc
(
j
)
===
(
i
+
1
).
U
)
dynamicExuSrc
(
i
)
:=
PriorityEncoder
(
targetMatch
)
}
(
readPortSrc
,
dynamicExuSrc
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录