3.4 riscv-tests的使用

3.4.1 riscv-tests目录的作用。
riscv-tests目录放的是isa、debug、mt和benchmarks的测试文件、底层相关驱动、及其编译的文件,用于测试rocket-chip cpu的性能,可以适当地理解为系统验证,即通过编写C/汇编实现cpu性能的评估。riscv-tests目录的编译依赖于riscv-gnu-toolchain目录,因为C/汇编编译至bin/hex文件都需要用到工具链,同时反汇编的dump文件也需要用到工具链。一般比较常用的是:riscv$(XLEN)-unknown-elf-gcc、riscv$ (XLEN)-unknown-elf-objdump和riscv$ (XLEN)-unknown-elf-objcopy,$ (XLEN)是rocket-chip cpu的处理位数,有32和64两种。

3.4.2 riscv-tests目录的详细说明。

一级目录 二级目录 说明
benchmarks - benchmarks测试的源文件。
- common 通用的头文件、C函数、底层汇编文件和链接文件。
- Makefile make脚本。可以通过修改bmarks来减少编译文件。
- 其他 各测试程序的源代码。
build - riscv-tests目录编译后生成的elf & dump文件。
configure - configure脚本将Makefile.in文件转为Makfile。
configure.ac - 利用autoconf将configure.ac生成configure脚本。
debug - 利debug测试的源文件,通过Python脚本模拟openocd和gdb工作。
- program debug测试的头文件、汇编文件和C代码。
- targets 链接文件和openocd的cfg文件。
- 其他 各测试程序的源代码。
env - 定义了几种cpu使用的环境。
- encoding.h 编码头文件,定义了全部CSR寄存器和几种异常。
- LICENSE LICENSE。
- p virtual memory is disabled, only core 0 boots up.不使用虚拟内存,没有S模式,单核。
- pm dvirtual memory is disabled, all cores boot up.不使用虚拟内存,没有S模式,可以多核。
- pt virtual memory is disabled, timer interrupt fires every 100 cycles.不使用虚拟内存,没有S模式,同时使能了内部的timer。
- v virtual memory is enabled.使用虚拟内存,有S模式。
isa - RISC-V 32/64全部指令测试的源文件。
- macros 宏文件。
- Makefile make脚本。可以通过修改include $(src_dir)/xx/Makefrag来减少编译文件
- 其他 各测试程序的源代码。
LICENSE - LICENSE。
mt - 矩阵乘法测试的源文件。
- Makefile make脚本。可以通过修改bmarks_matmul来减少编译文件。
- 其他 各测试程序的源代码。
README.md - riscv-tests目录的相关说明。

3.4.3 riscv-tests目录使用例子。

(1) 新建C程序目录,在riscv-tests/benchmarks中新建test目录。

cd benchmarks && mkdir test

(2) 编写C语言程序,并保存为test.c。
test.c:

#define U32 *(volatile unsigned int *)//--------------------------------------------------------------------------
// Main
void main()
{int i;for ( i = 0; i < 10; i++ )U32(0x20400000+4*i) = i;
}

(3) 由于我生成的rocket-chip memory_port是从0x2000_0000开始的,所有我需要修改链接文件,告诉gcc工具链,我希望代码从0x2000_0000开始。所以需要修改riscv-tests/benchmarks/common目录下的test.ld。

/* . = 0x80000000; */
. = 0x20000000;
.text.init : { *(.text.init) }

(4) 再次编译riscv-tests目录,然后在riscv-tests/build/benchmarks目录中能找到编译出来的test.riscv(elf文件) & test.riscv.dump(反汇编文件)。

(5) 最后对riscv-tests/benchmarks/common目录下的crt.S(汇编代码文件)做分析,每个benchmarks目录下的程序都会用到这个文件,#中文的就是注释。
我只对这个文件做初步分析,很多关键字各位可以自行百度或可以关注公众号:硅农亚历山大,阅读其发表的文章《编译过程简介》。

#关键字段.section ".text.init".globl _start
#最开始的代码,将32个通用寄存器置0。
_start:         li  x1, 0li  x2, 0li  x3, 0li  x4, 0li  x5, 0li  x6, 0li  x7, 0li  x8, 0li  x9, 0li  x10,0li  x11,0li  x12,0li  x13,0li  x14,0li  x15,0li  x16,0li  x17,0li  x18,0li  x19,0li  x20,0li  x21,0li  x22,0li  x23,0li  x24,0li  x25,0li  x26,0li  x27,0li  x28,0li  x29,0li  x30,0li  x31,0#使用浮点或ROCC,必须置位。# enable FPU and accelerator if presentli t0, MSTATUS_FS | MSTATUS_XScsrs mstatus, t0# make sure XLEN agrees with compilation choiceli t0, 1slli t0, t0, 31
#if __riscv_xlen == 64bgez t0, 1f
#elsebltz t0, 1f
#endif
2:li a0, 1sw a0, tohost, t0j 2b
1:#如果生成的rocket-chip支持浮点操作,则需要将浮点的32个通用寄存器置0。
#ifdef __riscv_flen# initialize FPU if we have onela t0, 1fcsrw mtvec, t0fssr    x0fmv.s.x f0, x0fmv.s.x f1, x0fmv.s.x f2, x0fmv.s.x f3, x0fmv.s.x f4, x0fmv.s.x f5, x0fmv.s.x f6, x0fmv.s.x f7, x0fmv.s.x f8, x0fmv.s.x f9, x0fmv.s.x f10,x0fmv.s.x f11,x0fmv.s.x f12,x0fmv.s.x f13,x0fmv.s.x f14,x0fmv.s.x f15,x0fmv.s.x f16,x0fmv.s.x f17,x0fmv.s.x f18,x0fmv.s.x f19,x0fmv.s.x f20,x0fmv.s.x f21,x0fmv.s.x f22,x0fmv.s.x f23,x0fmv.s.x f24,x0fmv.s.x f25,x0fmv.s.x f26,x0fmv.s.x f27,x0fmv.s.x f28,x0fmv.s.x f29,x0fmv.s.x f30,x0fmv.s.x f31,x0
1:
#endif#将trap_entry函数的地址付给mtvec CSR寄存器,发生中断或异常时,PC将会跳至mtvec的地址。# initialize trap vectorla t0, trap_entrycsrw mtvec, t0#初始化全局点,设置堆栈的位置# initialize global pointer
.option push
.option norelaxla gp, __global_pointer$
.option popla  tp, _end + 63and tp, tp, -64# get core idcsrr a0, mhartid# for now, assume only 1 coreli a1, 1
1:bgeu a0, a1, 1b# give each core 128KB of stack + TLS
#define STKSHIFT 17sll a2, a0, STKSHIFTadd tp, tp, a2add sp, a0, 1sll sp, sp, STKSHIFTadd sp, sp, tp#跳至_init的函数中。j _init#对齐位置,接下来是trap_entry函数的汇编代码。.align 2
trap_entry:addi sp, sp, -272#异常/中断发生时,保护现场,将32个通用寄存器的值存到某个地方。SREG x1, 1*REGBYTES(sp)SREG x2, 2*REGBYTES(sp)SREG x3, 3*REGBYTES(sp)SREG x4, 4*REGBYTES(sp)SREG x5, 5*REGBYTES(sp)SREG x6, 6*REGBYTES(sp)SREG x7, 7*REGBYTES(sp)SREG x8, 8*REGBYTES(sp)SREG x9, 9*REGBYTES(sp)SREG x10, 10*REGBYTES(sp)SREG x11, 11*REGBYTES(sp)SREG x12, 12*REGBYTES(sp)SREG x13, 13*REGBYTES(sp)SREG x14, 14*REGBYTES(sp)SREG x15, 15*REGBYTES(sp)SREG x16, 16*REGBYTES(sp)SREG x17, 17*REGBYTES(sp)SREG x18, 18*REGBYTES(sp)SREG x19, 19*REGBYTES(sp)SREG x20, 20*REGBYTES(sp)SREG x21, 21*REGBYTES(sp)SREG x22, 22*REGBYTES(sp)SREG x23, 23*REGBYTES(sp)SREG x24, 24*REGBYTES(sp)SREG x25, 25*REGBYTES(sp)SREG x26, 26*REGBYTES(sp)SREG x27, 27*REGBYTES(sp)SREG x28, 28*REGBYTES(sp)SREG x29, 29*REGBYTES(sp)SREG x30, 30*REGBYTES(sp)SREG x31, 31*REGBYTES(sp)#存好一些特殊的CSR寄存器值,并跳至handle_trap函数中。csrr a0, mcausecsrr a1, mepcSREG a1, 32*REGBYTES(sp)mv a2, spjal handle_trapLREG a1, 32*REGBYTES(sp)csrw mepc, a1#返回之前的工作模式# Remain in M-mode after eretli t0, MSTATUS_MPPcsrs mstatus, t0#恢复现场,将之前保存的32个通用寄存器的值返回。LREG x1, 1*REGBYTES(sp)LREG x2, 2*REGBYTES(sp)LREG x3, 3*REGBYTES(sp)LREG x4, 4*REGBYTES(sp)LREG x5, 5*REGBYTES(sp)LREG x6, 6*REGBYTES(sp)LREG x7, 7*REGBYTES(sp)LREG x8, 8*REGBYTES(sp)LREG x9, 9*REGBYTES(sp)LREG x10, 10*REGBYTES(sp)LREG x11, 11*REGBYTES(sp)LREG x12, 12*REGBYTES(sp)LREG x13, 13*REGBYTES(sp)LREG x14, 14*REGBYTES(sp)LREG x15, 15*REGBYTES(sp)LREG x16, 16*REGBYTES(sp)LREG x17, 17*REGBYTES(sp)LREG x18, 18*REGBYTES(sp)LREG x19, 19*REGBYTES(sp)LREG x20, 20*REGBYTES(sp)LREG x21, 21*REGBYTES(sp)LREG x22, 22*REGBYTES(sp)LREG x23, 23*REGBYTES(sp)LREG x24, 24*REGBYTES(sp)LREG x25, 25*REGBYTES(sp)LREG x26, 26*REGBYTES(sp)LREG x27, 27*REGBYTES(sp)LREG x28, 28*REGBYTES(sp)LREG x29, 29*REGBYTES(sp)LREG x30, 30*REGBYTES(sp)LREG x31, 31*REGBYTES(sp)addi sp, sp, 272mret.section ".tdata.begin"
.globl _tdata_begin
_tdata_begin:.section ".tdata.end"
.globl _tdata_end
_tdata_end:.section ".tbss.end"
.globl _tbss_end
_tbss_end:.section ".tohost","aw",@progbits
.align 6
.globl tohost
tohost: .dword 0
.align 6
.globl fromhost
fromhost: .dword 0

riscv-tests的使用相关推荐

  1. CPU系统级验证——概览索引

    1. RISC-V CPU核指令集验证分析 1 wujian100 (1)SoC核分析 无剑100实际上是一款低功耗SoC,采用的CPU核是E902. core通过AHB总线与Icache相连 (2) ...

  2. 在“芯片庭院”培育一颗多核异构 RISC-V SOC种子

    1 文章导览 本文是简要性的导览chipyard官方手册内容,以及安装开发环境需要注意的的一些地方,最后运行几个简单的官方Demo,希望能对RISC-V有兴趣的小伙伴有所启发帮助,官方网址为https ...

  3. 一个小型RISC-V开源处理器核介绍!

    [编者推荐语]最近看到了一个开源的RISC-V处理器设计,仅仅5000行左右的verilog代码,功能却非常完善.代码全部为手动设计的verilog代码,可读性非常强.设计者完成了包括CPU内核设计, ...

  4. RISC-V扩展指令示例

    自定义RISC-V扩展指令 要实现协处理器的设计,必然会涉及到新的指令.比如蜂鸟书籍<手把手教你设计CPU--RISC-V处理器篇>[1]第十六章中实现3*3矩阵的行列和运算时就定义了三条 ...

  5. RISCV ISS Spike 介绍

    RISCV ISS Spike 介绍 Spike Spike的使用 Spike项目的目录结构 其他一些文件夹的用处 riscv文件夹 processor.cc processor.h insn文件夹. ...

  6. 如何跑通平头哥RISC-V E902的仿真验证

    文章目录 引言 一.源代码结构 二.下载源码 三.下载工具链 四.编译仿真 五.查看波形 总结 引言 身边很多朋友在跑平头哥的RISC-V开源项目中的case仿真时,或多或少都碰到了一些问题,现在我用 ...

  7. RISC-V Tools编译安装三部曲之一

    超详细新手教程 一.前言 本文包含RISC-VGCC/Newlib Toolchain.GNUtoolchain for RISC-V, ISA Simulator等编译安装. 笔者所用OS为:Ubu ...

  8. 移植glibc到riscv架构

    编译环境 OS: Ubuntu20.04LTS x86_64-gnu: gcc 10.3.0 riscv64-unknown-linux-gnu: gcc 9.2.0 Glibc: glibc 2.2 ...

  9. ubuntu 配置 riscv rocket-chip

    1. git clone  https://github.com/freechipsproject/rocket-chip.git $ git clone https://github.com/ucb ...

  10. SCR1(RISC-V)介绍

    https://riscv.org/risc-v-cores/ 百度了一下,Solderpad Hardware License v. 0.51许可证和Apache2.0软件许可证相关联,以它为基础但 ...

最新文章

  1. Android7.0新特性、新功能
  2. 易创课堂深圳干货,趁热下载
  3. pos加盟申请php_ThinkPHP万能表单程序源码 报名预约加盟申请调查表单程序源码
  4. 相对路径和绝对路径概念
  5. 纯新手DSP编程--5.16--目标和主机设置
  6. TensorFlow函数使用总结
  7. 自制固件iOS4.1刷机、解锁教程
  8. 如何添加虚拟PDF打印机
  9. 接口自动化:淘宝的登录、搜索商品、确认订单、付款流程
  10. 强化学习笔记 Ornstein-Uhlenbeck 噪声和DDPG
  11. OneNote网页版链接用桌面应用打开报错的解决
  12. apollo决策规划学习--慢速障碍物超车
  13. 计算机基础--练习题
  14. 转载一些关于QQ空间的文章
  15. u盘出现该项目不在计算机中怎么办,怎么解决U盘使用过程中出现的各种问题
  16. Dell R740 光盘安装系统
  17. 基于TerraExplorer Pro的校园三维浏览系统开发
  18. 3D图形学(5):BRDF经验模型和基于物理的BRDF模型
  19. 关于医学和计算机的论文,计算机医学管理论文
  20. Classic Application Wizard config EPMA

热门文章

  1. W5500 dns域名解析
  2. 2019计算机小高考成绩,2019江苏小高考成绩揭晓生物化学4A不易
  3. 手把手带你入门 API 开发
  4. less css基础教程
  5. Long-distance navigation and magnetoreception in migratory animals(迁徙动物中的长距离导航和磁感应)...
  6. iOS开发IPhone以及iPad尺寸汇总
  7. java股票行情接口展示
  8. linux 命令行字体发虚,解决Linux字体发虚的终极方法
  9. 码云提交不显示贡献度问题
  10. selenium.webdriver网页无法正常打开的问题