Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
e6ade885
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,发现更多精彩内容 >>
未验证
提交
e6ade885
编写于
12月 22, 2020
作者:
Y
Yinan Xu
提交者:
GitHub
12月 22, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #343 from RISCVERS/debian-gogogo
difftest: support store commits (to dcache)
上级
7c8e855e
71e2905b
变更
8
显示空白变更内容
内联
并排
Showing
8 changed file
with
70 addition
and
6 deletion
+70
-6
src/main/scala/xiangshan/cache/dtlb.scala
src/main/scala/xiangshan/cache/dtlb.scala
+1
-1
src/main/scala/xiangshan/cache/ptw.scala
src/main/scala/xiangshan/cache/ptw.scala
+1
-1
src/main/scala/xiangshan/mem/lsqueue/StoreQueue.scala
src/main/scala/xiangshan/mem/lsqueue/StoreQueue.scala
+11
-0
src/test/csrc/difftest.cpp
src/test/csrc/difftest.cpp
+8
-0
src/test/csrc/difftest.h
src/test/csrc/difftest.h
+7
-0
src/test/csrc/emu.cpp
src/test/csrc/emu.cpp
+32
-4
src/test/csrc/emu.h
src/test/csrc/emu.h
+1
-0
src/test/scala/top/XSSim.scala
src/test/scala/top/XSSim.scala
+9
-0
未找到文件。
src/main/scala/xiangshan/cache/dtlb.scala
浏览文件 @
e6ade885
...
@@ -141,7 +141,7 @@ class TlbEntires(num: Int, tagLen: Int) extends TlbBundle {
...
@@ -141,7 +141,7 @@ class TlbEntires(num: Int, tagLen: Int) extends TlbBundle {
}
}
def
hit
(
vpn
:
UInt
)
=
{
def
hit
(
vpn
:
UInt
)
=
{
(
tag
===
tagClip
(
vpn
,
level
))
&&
vs
(
idxClip
(
vpn
,
level
))
(
tag
===
tagClip
(
vpn
,
level
))
&&
vs
(
idxClip
(
vpn
,
level
))
&&
(
level
===
2.
U
)
}
}
def
genEntries
(
data
:
UInt
,
level
:
UInt
,
vpn
:
UInt
)
:
TlbEntires
=
{
def
genEntries
(
data
:
UInt
,
level
:
UInt
,
vpn
:
UInt
)
:
TlbEntires
=
{
...
...
src/main/scala/xiangshan/cache/ptw.scala
浏览文件 @
e6ade885
...
@@ -455,7 +455,7 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
...
@@ -455,7 +455,7 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
l2g
:=
(
l2g
&
~
UIntToOH
(
refillIdx
))
|
Mux
(
Cat
(
memPtes
.
map
(
_
.
perm
.
g
)).
andR
,
UIntToOH
(
refillIdx
),
0.
U
)
l2g
:=
(
l2g
&
~
UIntToOH
(
refillIdx
))
|
Mux
(
Cat
(
memPtes
.
map
(
_
.
perm
.
g
)).
andR
,
UIntToOH
(
refillIdx
),
0.
U
)
XSDebug
(
p
"ptwl2 RefillIdx:${Hexadecimal(refillIdx)} ps:${ps}\n"
)
XSDebug
(
p
"ptwl2 RefillIdx:${Hexadecimal(refillIdx)} ps:${ps}\n"
)
}
}
when
(
memPte
.
isLeaf
())
{
when
(
memPte
.
isLeaf
()
&&
(
level
===
2.
U
)
)
{
val
refillIdx
=
genTlbL2Idx
(
req
.
vpn
)
//getVpnn(req.vpn, 0)(log2Up(TlbL2EntrySize)-1, 0)
val
refillIdx
=
genTlbL2Idx
(
req
.
vpn
)
//getVpnn(req.vpn, 0)(log2Up(TlbL2EntrySize)-1, 0)
//TODO: check why the old refillIdx is right
//TODO: check why the old refillIdx is right
...
...
src/main/scala/xiangshan/mem/lsqueue/StoreQueue.scala
浏览文件 @
e6ade885
...
@@ -292,6 +292,17 @@ class StoreQueue extends XSModule with HasDCacheParameters with HasCircularQueue
...
@@ -292,6 +292,17 @@ class StoreQueue extends XSModule with HasDCacheParameters with HasCircularQueue
assert
(
io
.
sbuffer
(
0
).
fire
())
assert
(
io
.
sbuffer
(
0
).
fire
())
}
}
}
}
if
(!
env
.
FPGAPlatform
)
{
val
storeCommit
=
PopCount
(
io
.
sbuffer
.
map
(
_
.
fire
()))
val
waddr
=
VecInit
(
io
.
sbuffer
.
map
(
req
=>
SignExt
(
req
.
bits
.
addr
,
64
)))
val
wdata
=
VecInit
(
io
.
sbuffer
.
map
(
req
=>
req
.
bits
.
data
&
MaskExpand
(
req
.
bits
.
mask
)))
val
wmask
=
VecInit
(
io
.
sbuffer
.
map
(
_
.
bits
.
mask
))
ExcitingUtils
.
addSource
(
RegNext
(
storeCommit
),
"difftestStoreCommit"
,
ExcitingUtils
.
Debug
)
ExcitingUtils
.
addSource
(
RegNext
(
waddr
),
"difftestStoreAddr"
,
ExcitingUtils
.
Debug
)
ExcitingUtils
.
addSource
(
RegNext
(
wdata
),
"difftestStoreData"
,
ExcitingUtils
.
Debug
)
ExcitingUtils
.
addSource
(
RegNext
(
wmask
),
"difftestStoreMask"
,
ExcitingUtils
.
Debug
)
}
// Read vaddr for mem exception
// Read vaddr for mem exception
io
.
exceptionAddr
.
vaddr
:=
dataModule
.
io
.
rdata
(
io
.
exceptionAddr
.
lsIdx
.
sqIdx
.
value
).
vaddr
io
.
exceptionAddr
.
vaddr
:=
dataModule
.
io
.
rdata
(
io
.
exceptionAddr
.
lsIdx
.
sqIdx
.
value
).
vaddr
...
...
src/test/csrc/difftest.cpp
浏览文件 @
e6ade885
...
@@ -21,6 +21,7 @@ void (*ref_difftest_set_mastatus)(const void *s) = NULL;
...
@@ -21,6 +21,7 @@ void (*ref_difftest_set_mastatus)(const void *s) = NULL;
void
(
*
ref_difftest_get_csr
)(
void
*
c
)
=
NULL
;
void
(
*
ref_difftest_get_csr
)(
void
*
c
)
=
NULL
;
void
(
*
ref_difftest_set_csr
)(
const
void
*
c
)
=
NULL
;
void
(
*
ref_difftest_set_csr
)(
const
void
*
c
)
=
NULL
;
vaddr_t
(
*
ref_disambiguate_exec
)(
void
*
disambiguate_para
)
=
NULL
;
vaddr_t
(
*
ref_disambiguate_exec
)(
void
*
disambiguate_para
)
=
NULL
;
int
(
*
ref_difftest_store_commit
)(
uint64_t
*
saddr
,
uint64_t
*
sdata
,
uint8_t
*
smask
)
=
NULL
;
static
void
(
*
ref_difftest_exec
)(
uint64_t
n
)
=
NULL
;
static
void
(
*
ref_difftest_exec
)(
uint64_t
n
)
=
NULL
;
static
void
(
*
ref_difftest_raise_intr
)(
uint64_t
NO
)
=
NULL
;
static
void
(
*
ref_difftest_raise_intr
)(
uint64_t
NO
)
=
NULL
;
static
void
(
*
ref_isa_reg_display
)(
void
)
=
NULL
;
static
void
(
*
ref_isa_reg_display
)(
void
)
=
NULL
;
...
@@ -77,6 +78,9 @@ void init_difftest() {
...
@@ -77,6 +78,9 @@ void init_difftest() {
ref_disambiguate_exec
=
(
vaddr_t
(
*
)(
void
*
))
dlsym
(
handle
,
"disambiguate_exec"
);
ref_disambiguate_exec
=
(
vaddr_t
(
*
)(
void
*
))
dlsym
(
handle
,
"disambiguate_exec"
);
assert
(
ref_disambiguate_exec
);
assert
(
ref_disambiguate_exec
);
ref_difftest_store_commit
=
(
int
(
*
)(
uint64_t
*
,
uint64_t
*
,
uint8_t
*
))
dlsym
(
handle
,
"difftest_store_commit"
);
assert
(
ref_difftest_store_commit
);
ref_difftest_exec
=
(
void
(
*
)(
uint64_t
))
dlsym
(
handle
,
"difftest_exec"
);
ref_difftest_exec
=
(
void
(
*
)(
uint64_t
))
dlsym
(
handle
,
"difftest_exec"
);
assert
(
ref_difftest_exec
);
assert
(
ref_difftest_exec
);
...
@@ -249,3 +253,7 @@ int difftest_step(DiffState *s) {
...
@@ -249,3 +253,7 @@ int difftest_step(DiffState *s) {
}
}
return
0
;
return
0
;
}
}
int
difftest_store_step
(
uint64_t
*
saddr
,
uint64_t
*
sdata
,
uint8_t
*
smask
)
{
return
ref_difftest_store_commit
(
saddr
,
sdata
,
smask
);
}
src/test/csrc/difftest.h
浏览文件 @
e6ade885
...
@@ -67,6 +67,11 @@ struct DiffState {
...
@@ -67,6 +67,11 @@ struct DiffState {
// lrscValid needs to be synced as nemu does not know
// lrscValid needs to be synced as nemu does not know
// how many cycles were used to finish a lr/sc pair,
// how many cycles were used to finish a lr/sc pair,
// this will lead to different sc results.
// this will lead to different sc results.
int
store_commit
;
uint64_t
store_addr
[
2
];
uint64_t
store_data
[
2
];
uint8_t
store_mask
[
2
];
};
};
struct
DisambiguationState
{
struct
DisambiguationState
{
...
@@ -84,9 +89,11 @@ extern void (*ref_difftest_set_mastatus)(const void *s);
...
@@ -84,9 +89,11 @@ extern void (*ref_difftest_set_mastatus)(const void *s);
extern
void
(
*
ref_difftest_get_csr
)(
void
*
c
);
extern
void
(
*
ref_difftest_get_csr
)(
void
*
c
);
extern
void
(
*
ref_difftest_set_csr
)(
const
void
*
c
);
extern
void
(
*
ref_difftest_set_csr
)(
const
void
*
c
);
extern
vaddr_t
(
*
ref_disambiguate_exec
)(
void
*
disambiguate_para
);
extern
vaddr_t
(
*
ref_disambiguate_exec
)(
void
*
disambiguate_para
);
extern
int
(
*
ref_difftest_store_commit
)(
uint64_t
*
saddr
,
uint64_t
*
sdata
,
uint8_t
*
smask
);
void
init_difftest
();
void
init_difftest
();
int
difftest_step
(
DiffState
*
s
);
int
difftest_step
(
DiffState
*
s
);
int
difftest_store_step
(
uint64_t
*
saddr
,
uint64_t
*
sdata
,
uint8_t
*
smask
);
void
difftest_display
(
uint8_t
mode
);
void
difftest_display
(
uint8_t
mode
);
#endif
#endif
src/test/csrc/emu.cpp
浏览文件 @
e6ade885
...
@@ -184,6 +184,15 @@ inline void Emulator::read_wb_info(uint64_t *wpc, uint64_t *wdata, uint32_t *wds
...
@@ -184,6 +184,15 @@ inline void Emulator::read_wb_info(uint64_t *wpc, uint64_t *wdata, uint32_t *wds
dut_ptr_wpc
(
5
);
dut_ptr_wdata
(
5
);
dut_ptr_wdst
(
5
);
dut_ptr_wpc
(
5
);
dut_ptr_wdata
(
5
);
dut_ptr_wdst
(
5
);
}
}
inline
void
Emulator
::
read_store_info
(
uint64_t
*
saddr
,
uint64_t
*
sdata
,
uint8_t
*
smask
)
{
#define dut_ptr_saddr(x) saddr[x] = dut_ptr->io_difftest_storeAddr_##x
#define dut_ptr_sdata(x) sdata[x] = dut_ptr->io_difftest_storeData_##x
#define dut_ptr_smask(x) smask[x] = dut_ptr->io_difftest_storeMask_##x
dut_ptr_saddr
(
0
);
dut_ptr_saddr
(
1
);
dut_ptr_sdata
(
0
);
dut_ptr_sdata
(
1
);
dut_ptr_smask
(
0
);
dut_ptr_smask
(
1
);
}
inline
void
Emulator
::
reset_ncycles
(
size_t
cycles
)
{
inline
void
Emulator
::
reset_ncycles
(
size_t
cycles
)
{
for
(
int
i
=
0
;
i
<
cycles
;
i
++
)
{
for
(
int
i
=
0
;
i
<
cycles
;
i
++
)
{
dut_ptr
->
reset
=
1
;
dut_ptr
->
reset
=
1
;
...
@@ -317,6 +326,25 @@ uint64_t Emulator::execute(uint64_t max_cycle, uint64_t max_instr) {
...
@@ -317,6 +326,25 @@ uint64_t Emulator::execute(uint64_t max_cycle, uint64_t max_instr) {
max_instr
-=
diff
.
commit
;
max_instr
-=
diff
.
commit
;
}
}
if
(
dut_ptr
->
io_difftest_storeCommit
)
{
read_store_info
(
diff
.
store_addr
,
diff
.
store_data
,
diff
.
store_mask
);
for
(
int
i
=
0
;
i
<
dut_ptr
->
io_difftest_storeCommit
;
i
++
)
{
auto
addr
=
diff
.
store_addr
[
i
];
auto
data
=
diff
.
store_data
[
i
];
auto
mask
=
diff
.
store_mask
[
i
];
if
(
difftest_store_step
(
&
addr
,
&
data
,
&
mask
))
{
difftest_display
(
dut_ptr
->
io_difftest_priviledgeMode
);
printf
(
"Mismatch for store commits:
\n
"
);
printf
(
"REF commits addr 0x%lx, data 0x%lx, mask 0x%x
\n
"
,
addr
,
data
,
mask
);
printf
(
"DUT commits addr 0x%lx, data 0x%lx, mask 0x%x
\n
"
,
diff
.
store_addr
[
i
],
diff
.
store_data
[
i
],
diff
.
store_mask
[
i
]);
trapCode
=
STATE_ABORT
;
break
;
}
}
}
uint32_t
t
=
uptime
();
uint32_t
t
=
uptime
();
if
(
t
-
lasttime_poll
>
100
)
{
if
(
t
-
lasttime_poll
>
100
)
{
poll_event
();
poll_event
();
...
@@ -447,10 +475,10 @@ void Emulator::snapshot_save(const char *filename) {
...
@@ -447,10 +475,10 @@ void Emulator::snapshot_save(const char *filename) {
uint64_t
nemu_this_pc
=
get_nemu_this_pc
();
uint64_t
nemu_this_pc
=
get_nemu_this_pc
();
stream
.
unbuf_write
(
&
nemu_this_pc
,
sizeof
(
nemu_this_pc
));
stream
.
unbuf_write
(
&
nemu_this_pc
,
sizeof
(
nemu_this_pc
));
char
*
buf
=
new
char
[
size
]
;
char
*
buf
=
(
char
*
)
mmap
(
NULL
,
size
,
PROT_READ
|
PROT_WRITE
,
MAP_ANON
|
MAP_PRIVATE
,
-
1
,
0
)
;
ref_difftest_memcpy_from_ref
(
buf
,
0x80000000
,
size
);
ref_difftest_memcpy_from_ref
(
buf
,
0x80000000
,
size
);
stream
.
unbuf_write
(
buf
,
size
);
stream
.
unbuf_write
(
buf
,
size
);
delete
[]
buf
;
munmap
(
buf
,
size
)
;
struct
SyncState
sync_mastate
;
struct
SyncState
sync_mastate
;
ref_difftest_get_mastatus
(
&
sync_mastate
);
ref_difftest_get_mastatus
(
&
sync_mastate
);
...
@@ -488,10 +516,10 @@ void Emulator::snapshot_load(const char *filename) {
...
@@ -488,10 +516,10 @@ void Emulator::snapshot_load(const char *filename) {
stream
.
read
(
&
nemu_this_pc
,
sizeof
(
nemu_this_pc
));
stream
.
read
(
&
nemu_this_pc
,
sizeof
(
nemu_this_pc
));
set_nemu_this_pc
(
nemu_this_pc
);
set_nemu_this_pc
(
nemu_this_pc
);
char
*
buf
=
new
char
[
size
]
;
char
*
buf
=
(
char
*
)
mmap
(
NULL
,
size
,
PROT_READ
|
PROT_WRITE
,
MAP_ANON
|
MAP_PRIVATE
,
-
1
,
0
)
;
stream
.
read
(
buf
,
size
);
stream
.
read
(
buf
,
size
);
ref_difftest_memcpy_from_dut
(
0x80000000
,
buf
,
size
);
ref_difftest_memcpy_from_dut
(
0x80000000
,
buf
,
size
);
delete
[]
buf
;
munmap
(
buf
,
size
)
;
struct
SyncState
sync_mastate
;
struct
SyncState
sync_mastate
;
stream
.
read
(
&
sync_mastate
,
sizeof
(
struct
SyncState
));
stream
.
read
(
&
sync_mastate
,
sizeof
(
struct
SyncState
));
...
...
src/test/csrc/emu.h
浏览文件 @
e6ade885
...
@@ -53,6 +53,7 @@ class Emulator {
...
@@ -53,6 +53,7 @@ class Emulator {
inline
void
read_emu_regs
(
uint64_t
*
r
);
inline
void
read_emu_regs
(
uint64_t
*
r
);
inline
void
read_wb_info
(
uint64_t
*
wpc
,
uint64_t
*
wdata
,
uint32_t
*
wdst
);
inline
void
read_wb_info
(
uint64_t
*
wpc
,
uint64_t
*
wdata
,
uint32_t
*
wdst
);
inline
void
read_store_info
(
uint64_t
*
saddr
,
uint64_t
*
sdata
,
uint8_t
*
smask
);
inline
void
reset_ncycles
(
size_t
cycles
);
inline
void
reset_ncycles
(
size_t
cycles
);
inline
void
single_cycle
();
inline
void
single_cycle
();
void
display_trapinfo
();
void
display_trapinfo
();
...
...
src/test/scala/top/XSSim.scala
浏览文件 @
e6ade885
...
@@ -48,6 +48,11 @@ class DiffTestIO extends XSBundle {
...
@@ -48,6 +48,11 @@ class DiffTestIO extends XSBundle {
val
medeleg
=
Output
(
UInt
(
64.
W
))
val
medeleg
=
Output
(
UInt
(
64.
W
))
val
scFailed
=
Output
(
Bool
())
val
scFailed
=
Output
(
Bool
())
val
storeCommit
=
Output
(
UInt
(
2.
W
))
val
storeAddr
=
Output
(
Vec
(
2
,
UInt
(
64.
W
)))
val
storeData
=
Output
(
Vec
(
2
,
UInt
(
64.
W
)))
val
storeMask
=
Output
(
Vec
(
2
,
UInt
(
8.
W
)))
}
}
class
LogCtrlIO
extends
Bundle
{
class
LogCtrlIO
extends
Bundle
{
...
@@ -154,6 +159,10 @@ class XSSimSoC(axiSim: Boolean)(implicit p: config.Parameters) extends LazyModul
...
@@ -154,6 +159,10 @@ class XSSimSoC(axiSim: Boolean)(implicit p: config.Parameters) extends LazyModul
ExcitingUtils
.
addSink
(
difftest
.
mideleg
,
"difftestMideleg"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
mideleg
,
"difftestMideleg"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
medeleg
,
"difftestMedeleg"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
medeleg
,
"difftestMedeleg"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
scFailed
,
"difftestScFailed"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
scFailed
,
"difftestScFailed"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
storeCommit
,
"difftestStoreCommit"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
storeAddr
,
"difftestStoreAddr"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
storeData
,
"difftestStoreData"
,
Debug
)
ExcitingUtils
.
addSink
(
difftest
.
storeMask
,
"difftestStoreMask"
,
Debug
)
}
}
// BoringUtils.addSink(difftest.lrscAddr, "difftestLrscAddr")
// BoringUtils.addSink(difftest.lrscAddr, "difftestLrscAddr")
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录