Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
c898bc97
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 搜索 >>
提交
c898bc97
编写于
6月 22, 2020
作者:
W
William Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Roq: add a "just enough" Roq
上级
307f6068
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
63 addition
and
24 deletion
+63
-24
src/main/scala/xiangshan/Bundle.scala
src/main/scala/xiangshan/Bundle.scala
+1
-1
src/main/scala/xiangshan/backend/roq/Roq.scala
src/main/scala/xiangshan/backend/roq/Roq.scala
+62
-23
未找到文件。
src/main/scala/xiangshan/Bundle.scala
浏览文件 @
c898bc97
...
...
@@ -56,7 +56,7 @@ class Redirect extends XSBundle {
val
target
=
UInt
(
VAddrBits
.
W
)
val
brTag
=
UInt
(
BrTagWidth
.
W
)
val
isException
=
Bool
()
val
roqIdx
=
UInt
(
RoqIdxWidth
.
W
)
val
roqIdx
=
UInt
(
Extended
RoqIdxWidth
.
W
)
val
freelistAllocPtr
=
UInt
(
PhyRegIdxWidth
.
W
)
}
...
...
src/main/scala/xiangshan/backend/roq/Roq.scala
浏览文件 @
c898bc97
...
...
@@ -4,7 +4,7 @@ import chisel3._
import
chisel3.util._
import
xiangshan._
// A "just-enough" Roq
class
Roq
extends
XSModule
with
NeedImpl
{
val
io
=
IO
(
new
Bundle
()
{
val
brqRedirect
=
Input
(
Valid
(
new
Redirect
))
...
...
@@ -17,7 +17,7 @@ class Roq extends XSModule with NeedImpl {
val
microOp
=
Reg
(
Vec
(
RoqSize
,
new
MicroOp
))
// val brMask = Reg(Vec(RoqSize, UInt(BrqSize.W)))
val
valid
=
RegInit
(
VecInit
(
List
.
fill
(
RoqSize
)
false
.
B
))
val
valid
=
RegInit
(
VecInit
(
List
.
fill
(
RoqSize
)
(
false
.
B
)
))
val
writebacked
=
Reg
(
Vec
(
RoqSize
,
Bool
()))
val
redirect
=
Reg
(
Vec
(
RoqSize
,
new
Redirect
))
val
isMMIO
=
Reg
(
Vec
(
RoqSize
,
Bool
()))
//for debug
...
...
@@ -25,40 +25,79 @@ class Roq extends XSModule with NeedImpl {
val
ringBufferHeadExtended
=
RegInit
(
0.
U
(
ExtendedRoqIdxWidth
.
W
))
val
ringBufferTailExtended
=
RegInit
(
0.
U
(
ExtendedRoqIdxWidth
.
W
))
val
ringBufferHead
=
ringBufferHead
(
RoqIdxWidth
-
1
,
0
)
val
ringBufferTail
=
ringBufferTail
(
RoqIdxWidth
-
1
,
0
)
val
ringBufferEmpty
=
ringBufferHead
===
ringBufferTail
&&
ringBufferHead
(
RoqIdxWidth
)===
ringBufferTail
(
RoqIdxWidth
)
val
ringBufferEmpty
=
ringBufferHead
===
ringBufferTail
&&
ringBufferHead
(
RoqIdxWidth
)=/=
ringBufferTail
(
RoqIdxWidth
)
val
ringBufferWalkExtended
=
Reg
(
UInt
(
ExtendedRoqIdxWidth
.
W
))
val
ringBufferWalkTarget
=
Reg
(
UInt
(
ExtendedRoqIdxWidth
.
W
))
val
ringBufferHead
=
ringBufferHeadExtended
(
RoqIdxWidth
-
1
,
0
)
val
ringBufferTail
=
ringBufferTailExtended
(
RoqIdxWidth
-
1
,
0
)
val
ringBufferWalk
=
ringBufferWalkExtended
(
RoqIdxWidth
-
1
,
0
)
val
ringBufferEmpty
=
ringBufferHead
===
ringBufferTail
&&
ringBufferHeadExtended
(
RoqIdxWidth
)===
ringBufferTailExtended
(
RoqIdxWidth
)
val
ringBufferFull
=
ringBufferHead
===
ringBufferTail
&&
ringBufferHeadExtended
(
RoqIdxWidth
)=/=
ringBufferTailExtended
(
RoqIdxWidth
)
val
ringBufferAllowin
=
!
ringBufferFull
val
s_idle
::
s_walk
::
Nil
=
Enum
(
2
)
val
state
=
RegInit
(
s_idle
)
// Dispatch
for
(
i
<-
0
until
RenameWidth
){
when
(
dp1Req
(
i
).
fire
()){
microOp
(
ringBufferHead
+
i
)
:=
io
.
dp1Req
(
i
).
bits
valid
(
ringBufferHead
+
i
)
:=
true
.
B
when
(
io
.
dp1Req
(
i
).
fire
()){
microOp
(
ringBufferHead
+
i
.
U
)
:=
io
.
dp1Req
(
i
).
bits
valid
(
ringBufferHead
+
i
.
U
)
:=
true
.
B
}
io
.
dp1Req
(
i
).
ready
:=
ringBufferAllowin
&&
!
vaild
(
ringBufferHead
+
i
)
io
.
roqIdxs
(
i
)
:=
ringBufferHeadExtended
+
i
io
.
dp1Req
(
i
).
ready
:=
ringBufferAllowin
&&
!
valid
(
ringBufferHead
+
i
.
U
)
&&
state
===
s_idle
io
.
roqIdxs
(
i
)
:=
ringBufferHeadExtended
+
i
.
U
}
val
validDispatch
=
VecInit
((
0
until
CommitWidth
).
map
(
i
=>
io
.
dp1Req
(
i
).
fire
())).
asUInt
when
(
validDispatch
.
orR
){
ringBufferHeadExtended
:=
ringBufferHeadExtended
+
PopCount
(
validDispatch
)
}
// Writeback
for
(
i
<-
0
until
exuConfig
.
ExuCnt
){
when
(
exeWbResults
(
i
).
fire
()){
when
(
io
.
exeWbResults
(
i
).
fire
()){
writebacked
(
io
.
exeWbResults
(
i
).
bits
.
uop
.
roqIdx
)
:=
true
.
B
}
}
// Commit
// TODO
// for(i <- 0 until CommitWidth){
// io.commits.valid := valid(ringBufferTail+i) && writebacked(ringBufferTail+i)
// io.commits.bits.uop := microOp(ringBufferTail+i)
// io.commits.bits.isWalk := DontCare //TODO
// }
// io.redirect := DontCare //TODO
// io.redirect.valid := false.B //TODO
// Commit uop to Rename
for
(
i
<-
0
until
CommitWidth
){
when
(
state
===
s_idle
){
io
.
commits
(
i
).
valid
:=
valid
(
ringBufferTail
+
i
.
U
)
&&
writebacked
(
ringBufferTail
+
i
.
U
)
io
.
commits
(
i
).
bits
.
uop
:=
microOp
(
ringBufferTail
+
i
.
U
)
when
(
valid
(
ringBufferTail
+
i
.
U
)){
valid
(
ringBufferTail
+
i
.
U
)
:=
false
.
B
}
//FIXIT
}.
otherwise
{
//state === s_walk
io
.
commits
(
i
).
valid
:=
valid
(
ringBufferWalk
+
i
.
U
)
&&
writebacked
(
ringBufferWalk
+
i
.
U
)
io
.
commits
(
i
).
bits
.
uop
:=
microOp
(
ringBufferWalk
+
i
.
U
)
valid
(
ringBufferWalk
+
i
.
U
)
:=
false
.
B
}
io
.
commits
(
i
).
bits
.
isWalk
:=
state
===
s_walk
}
val
validCommit
=
VecInit
((
0
until
CommitWidth
).
map
(
i
=>
io
.
commits
(
i
).
valid
)).
asUInt
when
(
state
===
s_idle
){
ringBufferTailExtended
:=
ringBufferTailExtended
+
PopCount
(
validCommit
)
}
val
walkFinished
=
(
0
until
CommitWidth
).
map
(
i
=>
(
ringBufferWalk
+
i
.
U
)
===
ringBufferWalkTarget
).
reduce
(
_
||
_
)
when
(
state
===
s_walk
){
//exit walk state when all roq entry is commited
when
(
walkFinished
){
state
:=
s_idle
}
ringBufferWalkExtended
:=
ringBufferWalkExtended
+
CommitWidth
.
U
// Debug(){
printf
(
"[ROQ] rolling back: head %d tail %d walk %d\n"
,
ringBufferHead
,
ringBufferTail
,
ringBufferWalk
)
// }
}
// Flush
// TODO
when
(
io
.
brqRedirect
.
valid
){
state
:=
s_walk
ringBufferWalkExtended
:=
io
.
brqRedirect
.
bits
.
roqIdx
ringBufferWalkTarget
:=
ringBufferHeadExtended
ringBufferHeadExtended
:=
io
.
brqRedirect
.
bits
.
roqIdx
}
// roq redirect only used for exception
io
.
redirect
:=
DontCare
//TODO
io
.
redirect
.
valid
:=
false
.
B
//TODO
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录