nexus-am/apps/hpmdriver
XiChen 1b3e400893 hpm: add parse_encoding 2022-07-07 21:44:11 +08:00
..
Makefile apps: add basic hpmdriver 2022-07-05 11:13:26 +08:00
Readme.md hpm: add parse_encoding 2022-07-07 21:44:11 +08:00
events.h hpm: add parse_encoding 2022-07-07 21:44:11 +08:00
hpmdriver.c hpm: slight modification 2022-07-07 10:38:00 +08:00
hpmdriver.h hpm: slight modification 2022-07-07 10:38:00 +08:00
parse_Evecoding.py hpm: add parse_encoding 2022-07-07 21:44:11 +08:00

Readme.md

HPM driver用法

环境

nexus-am仓库地址,采用southlake分支。用法见开发环境文档

nexus-am/apps/hpmdriver
├── Makefile
├── events.h		 :性能事件编码表
├── hpmdriver.h	:头文件,包含性能时间寄存器结构和各类功能函数
├── hpmdriver.c	:主函数

采用make ARCH=riscv64-xs-southlake编译,可以采用如下指令编译+运行

make ARCH=riscv64-xs-southlake && $NOOP_HOME/build/emu --no-diff -i ./build/*.bin 2>&1 | tee log | less

使用方法

向性能事件寄存器mhpmevent中写入希望统计的性能事件,以及多个性能事件之间的组合方式(可以采用头文件中的宏定义)。然后读取对应的mhpmcounter寄存器,即可获得计数值。

mode域指定统计该特权级下的性能事件。

性能计数事件的组合方式:

  • Event0 <Optype0> Event1 = T1
  • Event2 <Optype1> Event3 = T2
  • T1 <Optype2> T2 = Result

特别注意,性能事件必须用其对应的性能事件寄存器统计具体见下表。因为各个Block的Hardware Performance Monitor只与对应范围的csr mhpmevent寄存器相连,所以只能利用对应范围的mhpmevent寄存器去统计。而且各个Block性能事件的编码均从0开始如果没有利用正确的mhpmevent寄存器,会导致统计结果出错。

事件 对应的寄存器
Frontend mhpmevent3~10
CtrlBlock mhpmevent11~18
MemBlock mhpmevent19~26
缓存 mhpmevent27~31

提供了 set_event_quad/set_evet_double/set_event_single来设置4个性能事件的组合/2个性能事件的组合/单个性能事件。se_cc设置性能事件并清除计数器。print_coutner打印计数器的值。

具体示例,可以参考hpmdriver.c