Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
6c553003
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
6c553003
编写于
11月 29, 2020
作者:
Z
zoujr
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'frontend-refactor' of
https://github.com/RISCVERS/XiangShan
into frontend-refactor
上级
0125fa38
cc6108c7
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
9 addition
and
10 deletion
+9
-10
src/main/scala/xiangshan/frontend/PreDecode.scala
src/main/scala/xiangshan/frontend/PreDecode.scala
+9
-10
未找到文件。
src/main/scala/xiangshan/frontend/PreDecode.scala
浏览文件 @
6c553003
...
...
@@ -69,7 +69,9 @@ class PreDecode extends XSModule with HasPdconst with HasIFUConst {
val
firstValidIdx
=
bankOffset
// io.prev.valid should only occur with firstValidIdx = 0
XSError
(
firstValidIdx
=/=
0.
U
&&
io
.
prev
.
valid
,
p
"pc:${io.in.pc}, mask:${io.in.mask}, prevhalfInst valid occurs on unaligned fetch packet\n"
)
val
lastHalfInstrIdx
=
Mux
(
isInLastBank
(
pc
),
(
bankWidth
-
1
).
U
,
(
bankWidth
*
2
-
1
).
U
)
// val lastHalfInstrIdx = Mux(isInLastBank(pc), (bankWidth-1).U, (bankWidth*2-1).U)
// in case loop buffer gives a packet ending at an unaligned position
val
lastHalfInstrIdx
=
PriorityMux
(
Reverse
(
mask
),
(
PredictWidth
-
1
to
0
by
-
1
).
map
(
i
=>
i
.
U
))
val
insts
=
Wire
(
Vec
(
PredictWidth
,
UInt
(
32.
W
)))
val
instsMask
=
Wire
(
Vec
(
PredictWidth
,
Bool
()))
...
...
@@ -90,22 +92,19 @@ class PreDecode extends XSModule with HasPdconst with HasIFUConst {
val
isFirstInPacket
=
i
.
U
===
firstValidIdx
val
isLastInPacket
=
i
.
U
===
lastHalfInstrIdx
val
currentRVC
=
isRVC
(
insts
(
i
))
val
lastIsValidEnd
=
if
(
i
==
0
)
{
!
io
.
prev
.
valid
}
else
{
instsEndMask
(
i
-
1
)
}
inst
:=
Mux
(
io
.
prev
.
valid
&&
i
.
U
===
0.
U
,
Cat
(
rawInsts
(
i
)(
15
,
0
),
io
.
prev
.
bits
),
rawInsts
(
i
))
if
(
i
==
0
)
{
validFirst
:=
isFirstInPacket
validLast
:=
isFirstInPacket
&&
(
io
.
prev
.
valid
||
isRVC
(
insts
(
0
)))
}
else
{
validFirst
:=
instsEndMask
(
i
-
1
)
&&
Mux
(
isLastInPacket
,
isRVC
(
insts
(
i
)),
true
.
B
)
// if the last position is the end of a valid inst
validLast
:=
validFirst
&&
isRVC
(
insts
(
i
))
}
validStart
:=
lastIsValidEnd
&&
!(
isLastInPacket
&&
!
currentRVC
)
validEnd
:=
validStart
&&
currentRVC
||
!
validStart
insts
(
i
)
:=
inst
instsRVC
(
i
)
:=
isRVC
(
inst
)
instsMask
(
i
)
:=
mask
(
i
)
&&
validFirst
instsEndMask
(
i
)
:=
mask
(
i
)
&&
valid
Last
instsMask
(
i
)
:=
mask
(
i
)
&&
(
if
(
i
==
0
)
Mux
(
io
.
prev
.
valid
,
validEnd
,
validStart
)
else
validStart
)
instsEndMask
(
i
)
:=
mask
(
i
)
&&
valid
End
instsPC
(
i
)
:=
pc
val
brType
::
isCall
::
isRet
::
Nil
=
brInfo
(
inst
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录