提交 f99729f8 编写于 作者: X XiChen

hpm: slight modification

上级 4ab7a3b5
......@@ -2,7 +2,7 @@
## 环境
[nexus-am仓库地址](https://github.com/OpenXiangShan/nexus-am/tree/southlake),采用`southlake`分支。用法见[开发环境文档](https://xiangshan-doc.readthedocs.io/zh_CN/latest/tools/xsenv/)
    [nexus-am仓库地址](https://github.com/OpenXiangShan/nexus-am/tree/southlake),采用`southlake`分支。用法见[开发环境文档](https://xiangshan-doc.readthedocs.io/zh_CN/latest/tools/xsenv/)
nexus-am/apps/hpmdriver
......@@ -11,7 +11,7 @@ nexus-am/apps/hpmdriver
- hpmdriver.h :头文件,包含性能时间寄存器结构和各类功能函数
- hpmdriver.c :主函数
采用`make ARCH=riscv64-xs-southlake`编译,可以采用如下指令编译+运行
    采用`make ARCH=riscv64-xs-southlake`编译,可以采用如下指令编译+运行
```shell
make ARCH=riscv64-xs-southlake && $NOOP_HOME/build/emu --no-diff -i ./build/*.bin 2>&1 | tee log | less
......@@ -19,17 +19,17 @@ make ARCH=riscv64-xs-southlake && $NOOP_HOME/build/emu --no-diff -i ./build/*.bi
## 使用方法
向性能事件寄存器`mhpmevent`中写入`希望统计的性能事件`,以及`多个性能事件之间的组合方式`(可以采用头文件中的宏定义)。然后读取对应的`mhpmcounter`寄存器,即可获得计数值。
    向性能事件寄存器`mhpmevent`中写入`希望统计的性能事件`,以及`多个性能事件之间的组合方式`(可以采用头文件中的宏定义)。然后读取对应的`mhpmcounter`寄存器,即可获得计数值。
​ mode域指定了,统计该特权级下的性能事件。
    mode域指定,统计该特权级下的性能事件。
性能计数事件的组合方式:
    性能计数事件的组合方式:
- ​ Event0 \<Optype0\> Event1 = T1
- ​ Event2 \<Optype1\> Event3 = T2
- ​ T1 \<Optype2\> T2 = Result
**特别注意,性能事件必须用其对应的性能事件寄存器统计**,具体见下表。因为各个Block的`Hardware Performance Monitor`只与对应范围的`csr mhpmevent`寄存器相连,所以只能利用对应范围的`mhpmevent`寄存器去统计。而且各个Block性能事件的编码均从0开始,如果没有利用正确的性能事件,则会导致统计结果出错。
&emsp; &emsp; **特别注意,性能事件必须用其对应的性能事件寄存器统计**,具体见下表。因为各个Block的`Hardware Performance Monitor`只与对应范围的`csr mhpmevent`寄存器相连,所以只能利用对应范围的`mhpmevent`寄存器去统计。而且各个Block性能事件的编码均从0开始,如果没有利用正确的`mhpmevent`寄存器,会导致统计结果出错。
| 事件 | 对应的寄存器 |
| ------------- | ---- |
......@@ -38,5 +38,7 @@ make ARCH=riscv64-xs-southlake && $NOOP_HOME/build/emu --no-diff -i ./build/*.bi
| MemBlock | `mhpmevent19~26` |
| 缓存 | `mhpmevent27~31` |
​ 具体示例,可以参考`hpmdriver.c`
&emsp; &emsp; 提供了 `set_event_quad/set_evet_double/set_event_single`来设置4个性能事件的组合/2个性能事件的组合/单个性能事件。`se_cc`设置性能事件并清除计数器。`print_coutner`打印计数器的值。
&emsp; &emsp; 具体示例,可以参考`hpmdriver.c`
......@@ -2,13 +2,13 @@
int main() {
printf("Hello, XiangShan!\n");
printd_csr(marchid);
printu_csr(marchid);
printx_csr(mcountinhibit);
printx_csr(mcounteren);
printx_csr(scounteren);
printd_csr(mcycle);
printd_csr(minstret);
printu_csr(mcycle);
printu_csr(minstret);
se_cc_single(3, MODE_M, Frontend_frontendFlush);
se_cc_single(11, MODE_M, CtrlBlock_decoder_waitInstr);
......@@ -20,7 +20,6 @@ int main() {
a += a + i;
}
printf("%lu\n",a);
// *** tmp workload ***
print_event(3);
print_counter(3);
......
......@@ -44,6 +44,7 @@
#define clear_counter(id) csr_write(mhpmcounter##id, 0x0UL)
#define print_counter(id) printf("mhpmcounter%d: %lu\n", id, csr_read(mhpmcounter##id))
#define printd_csr(csr) printf(#csr": %ld\n", csr_read(csr))
#define printu_csr(csr) printf(#csr": %lu\n", csr_read(csr))
#define printx_csr(csr) printf(#csr": %lx\n", csr_read(csr))
#define set_event_quad(csr_id, mode, optype2, optype1, optype0, event3, event2, event1, event0) \
......@@ -75,6 +76,4 @@
{set_event_single(csr_id, mode, event);clear_counter(csr_id);}
#endif /* __HPMDRIVER_H_ */
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册