Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
785f0e96
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
9 个月 前同步成功
通知
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
785f0e96
编写于
3月 03, 2021
作者:
L
ljw
提交者:
GitHub
3月 03, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Backend: fixed the bug when jump unit wakes up store rs (#626)
上级
1aad9eeb
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
36 addition
and
28 deletion
+36
-28
src/main/scala/xiangshan/XSCore.scala
src/main/scala/xiangshan/XSCore.scala
+4
-2
src/main/scala/xiangshan/backend/FloatBlock.scala
src/main/scala/xiangshan/backend/FloatBlock.scala
+20
-15
src/main/scala/xiangshan/backend/IntegerBlock.scala
src/main/scala/xiangshan/backend/IntegerBlock.scala
+5
-2
src/main/scala/xiangshan/backend/MemBlock.scala
src/main/scala/xiangshan/backend/MemBlock.scala
+7
-9
未找到文件。
src/main/scala/xiangshan/XSCore.scala
浏览文件 @
785f0e96
...
...
@@ -346,7 +346,8 @@ class XSCore()(implicit p: config.Parameters) extends LazyModule
fastWakeUpIn
=
intExuConfigs
.
filter
(
_
.
hasCertainLatency
),
slowWakeUpIn
=
intExuConfigs
.
filter
(
_
.
hasUncertainlatency
)
++
fpExuConfigs
,
fastWakeUpOut
=
Seq
(),
slowWakeUpOut
=
loadExuConfigs
slowWakeUpOut
=
loadExuConfigs
,
numIntWakeUpFp
=
intExuConfigs
.
count
(
_
.
writeFpRf
)
))
lazy
val
module
=
new
XSCoreImp
(
this
)
...
...
@@ -427,7 +428,7 @@ class XSCoreImp(outer: XSCore) extends LazyModuleImp(outer)
val
intBlockWakeUpFp
=
intExuConfigs
.
filter
(
_
.
hasUncertainlatency
)
.
zip
(
integerBlock
.
io
.
wakeUpOut
.
slow
)
.
filter
(
_
.
_1
.
writeFpRf
)
.
map
(
_
.
_2
)
.
map
(
x
=>
fpOutValid
(
x
,
connectReady
=
true
))
.
map
(
_
.
_2
)
integerBlock
.
io
.
wakeUpIn
.
slow
<>
fpBlockWakeUpInt
++
memBlockWakeUpInt
integerBlock
.
io
.
toMemBlock
<>
memBlock
.
io
.
fromIntBlock
...
...
@@ -445,6 +446,7 @@ class XSCoreImp(outer: XSCore) extends LazyModuleImp(outer)
// Note: 'WireInit' is used to block 'ready's from memBlock,
// we don't need 'ready's from memBlock
memBlock
.
io
.
wakeUpIn
.
slow
<>
wakeUpMem
.
flatMap
(
_
.
slow
.
map
(
x
=>
WireInit
(
x
)))
memBlock
.
io
.
intWakeUpFp
<>
floatBlock
.
io
.
intWakeUpOut
integerBlock
.
io
.
csrio
.
hartId
<>
io
.
hartId
integerBlock
.
io
.
csrio
.
perf
<>
DontCare
...
...
src/main/scala/xiangshan/backend/FloatBlock.scala
浏览文件 @
785f0e96
...
...
@@ -30,6 +30,7 @@ class FloatBlock
val
intWakeUpFp
=
Vec
(
intSlowWakeUpIn
.
size
,
Flipped
(
DecoupledIO
(
new
ExuOutput
)))
val
memWakeUpFp
=
Vec
(
memSlowWakeUpIn
.
size
,
Flipped
(
DecoupledIO
(
new
ExuOutput
)))
val
wakeUpOut
=
Flipped
(
new
WakeUpBundle
(
fastWakeUpOut
.
size
,
slowWakeUpOut
.
size
))
val
intWakeUpOut
=
Vec
(
intSlowWakeUpIn
.
size
,
DecoupledIO
(
new
ExuOutput
))
// from csr
val
frm
=
Input
(
UInt
(
3.
W
))
...
...
@@ -39,24 +40,28 @@ class FloatBlock
val
flush
=
io
.
fromCtrlBlock
.
flush
val
intWakeUpFpReg
=
Wire
(
Vec
(
intSlowWakeUpIn
.
size
,
Flipped
(
DecoupledIO
(
new
ExuOutput
))))
intWakeUpFpReg
.
zip
(
io
.
intWakeUpFp
).
foreach
{
case
(
inReg
,
wakeUpIn
)
=>
val
in
=
WireInit
(
wakeUpIn
)
wakeUpIn
.
ready
:=
in
.
ready
in
.
valid
:=
wakeUpIn
.
valid
&&
!
wakeUpIn
.
bits
.
uop
.
roqIdx
.
needFlush
(
redirect
,
flush
)
PipelineConnect
(
in
,
inReg
,
inReg
.
fire
()
||
inReg
.
bits
.
uop
.
roqIdx
.
needFlush
(
redirect
,
flush
),
false
.
B
)
for
((
w
,
r
)
<-
io
.
intWakeUpFp
.
zip
(
intWakeUpFpReg
)){
val
in
=
WireInit
(
w
)
w
.
ready
:=
in
.
ready
in
.
valid
:=
w
.
valid
&&
!
w
.
bits
.
uop
.
roqIdx
.
needFlush
(
redirect
,
flush
)
PipelineConnect
(
in
,
r
,
r
.
fire
()
||
r
.
bits
.
uop
.
roqIdx
.
needFlush
(
redirect
,
flush
),
false
.
B
)
}
val
intRecoded
=
WireInit
(
intWakeUpFpReg
)
for
(((
rec
,
reg
),
cfg
)
<-
intRecoded
.
zip
(
intWakeUpFpReg
).
zip
(
intSlowWakeUpIn
)){
rec
.
bits
.
data
:=
Mux
(
reg
.
bits
.
uop
.
ctrl
.
fpu
.
typeTagOut
===
S
,
recode
(
reg
.
bits
.
data
(
31
,
0
),
S
),
recode
(
reg
.
bits
.
data
(
63
,
0
),
D
)
// to memBlock's store rs
io
.
intWakeUpOut
<>
intWakeUpFpReg
.
map
(
x
=>
WireInit
(
x
))
val
intRecoded
=
intWakeUpFpReg
.
map
(
x
=>
{
val
rec
=
Wire
(
DecoupledIO
(
new
ExuOutput
))
rec
.
valid
:=
x
.
valid
&&
x
.
bits
.
uop
.
ctrl
.
fpWen
rec
.
bits
:=
x
.
bits
rec
.
bits
.
data
:=
Mux
(
x
.
bits
.
uop
.
ctrl
.
fpu
.
typeTagOut
===
S
,
recode
(
x
.
bits
.
data
(
31
,
0
),
S
),
recode
(
x
.
bits
.
data
(
63
,
0
),
D
)
)
rec
.
bits
.
redirectValid
:=
false
.
B
reg
.
ready
:=
rec
.
ready
||
!
rec
.
valid
}
x
.
ready
:=
rec
.
ready
||
!
rec
.
valid
rec
})
val
memRecoded
=
WireInit
(
io
.
memWakeUpFp
)
for
((
rec
,
reg
)
<-
memRecoded
.
zip
(
io
.
memWakeUpFp
)){
rec
.
bits
.
data
:=
fpRdataHelper
(
reg
.
bits
.
uop
,
reg
.
bits
.
data
)
...
...
src/main/scala/xiangshan/backend/IntegerBlock.scala
浏览文件 @
785f0e96
...
...
@@ -254,8 +254,11 @@ class IntegerBlock
))
intWbArbiter
.
io
.
in
<>
exeUnits
.
map
(
e
=>
{
val
w
=
WireInit
(
e
.
io
.
out
)
val
fpWen
=
if
(
e
.
config
.
writeFpRf
)
e
.
io
.
out
.
bits
.
uop
.
ctrl
.
fpWen
else
false
.
B
w
.
valid
:=
e
.
io
.
out
.
valid
&&
!
fpWen
if
(
e
.
config
.
writeFpRf
){
w
.
valid
:=
e
.
io
.
out
.
valid
&&
!
e
.
io
.
out
.
bits
.
uop
.
ctrl
.
fpWen
&&
io
.
wakeUpOut
.
slow
(
0
).
ready
}
else
{
w
.
valid
:=
e
.
io
.
out
.
valid
}
w
})
++
io
.
wakeUpIn
.
slow
...
...
src/main/scala/xiangshan/backend/MemBlock.scala
浏览文件 @
785f0e96
...
...
@@ -33,7 +33,8 @@ class MemBlock(
val
fastWakeUpIn
:
Seq
[
ExuConfig
],
val
slowWakeUpIn
:
Seq
[
ExuConfig
],
val
fastWakeUpOut
:
Seq
[
ExuConfig
],
val
slowWakeUpOut
:
Seq
[
ExuConfig
]
val
slowWakeUpOut
:
Seq
[
ExuConfig
],
val
numIntWakeUpFp
:
Int
)(
implicit
p
:
Parameters
)
extends
LazyModule
{
val
dcache
=
LazyModule
(
new
DCache
())
...
...
@@ -55,6 +56,7 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer)
val
slowWakeUpIn
=
outer
.
slowWakeUpIn
val
fastWakeUpOut
=
outer
.
fastWakeUpOut
val
slowWakeUpOut
=
outer
.
slowWakeUpOut
val
numIntWakeUpFp
=
outer
.
numIntWakeUpFp
val
io
=
IO
(
new
Bundle
{
val
fromCtrlBlock
=
Flipped
(
new
CtrlToLsBlockIO
)
...
...
@@ -63,6 +65,7 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer)
val
toCtrlBlock
=
new
LsBlockToCtrlIO
val
wakeUpIn
=
new
WakeUpBundle
(
fastWakeUpIn
.
size
,
slowWakeUpIn
.
size
)
val
intWakeUpFp
=
Vec
(
numIntWakeUpFp
,
Flipped
(
DecoupledIO
(
new
ExuOutput
)))
val
wakeUpOutInt
=
Flipped
(
new
WakeUpBundle
(
fastWakeUpOut
.
size
,
slowWakeUpOut
.
size
))
val
wakeUpOutFp
=
Flipped
(
new
WakeUpBundle
(
fastWakeUpOut
.
size
,
slowWakeUpOut
.
size
))
...
...
@@ -144,14 +147,8 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer)
slowWakeUpIn
.
zip
(
io
.
wakeUpIn
.
slow
)
.
filter
(
x
=>
(
x
.
_1
.
writeIntRf
&&
readIntRf
)
||
(
x
.
_1
.
writeFpRf
&&
readFpRf
))
.
map
{
case
(
Exu
.
jumpExeUnitCfg
,
value
)
if
cfg
==
Exu
.
stExeUnitCfg
=>
val
jumpOut
=
Wire
(
Flipped
(
DecoupledIO
(
new
ExuOutput
)))
jumpOut
.
bits
:=
RegNext
(
value
.
bits
)
jumpOut
.
valid
:=
RegNext
(
value
.
valid
&&
!
value
.
bits
.
uop
.
roqIdx
.
needFlush
(
redirect
,
io
.
fromCtrlBlock
.
flush
)
)
jumpOut
.
ready
:=
true
.
B
(
Exu
.
jumpExeUnitCfg
,
jumpOut
)
case
(
Exu
.
jumpExeUnitCfg
,
_
)
if
cfg
==
Exu
.
stExeUnitCfg
=>
(
Exu
.
jumpExeUnitCfg
,
io
.
intWakeUpFp
.
head
)
case
(
config
,
value
)
=>
(
config
,
value
)
}
).
map
(
a
=>
(
a
.
_1
,
decoupledIOToValidIO
(
a
.
_2
)))
...
...
@@ -212,6 +209,7 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer)
io
.
wakeUpOutInt
.
slow
<>
exeWbReqs
io
.
wakeUpOutFp
.
slow
<>
wakeUpFp
io
.
wakeUpIn
.
slow
.
foreach
(
_
.
ready
:=
true
.
B
)
io
.
intWakeUpFp
.
foreach
(
_
.
ready
:=
true
.
B
)
val
dtlb
=
Module
(
new
TLB
(
Width
=
DTLBWidth
,
isDtlb
=
true
))
val
lsq
=
Module
(
new
LsqWrappper
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录