Rocket Core CPU全局变量0值初始化失败问题求助
Rocket Core Coremark测试中全局变量0值初始化失败问题
问题描述
在对Rocket Core CPU进行Coremark基准测试时,测试失败,经调试定位到volatile全局变量0值初始化失败:部分本该初始化为0x0的volatile全局变量,实际被赋予了随机值。
复现环境
- 编译环境:Ubuntu 22.04,gcc 11.4.0
- 交叉编译器:riscv32-unknown-elf-gcc (g2ee5e430018) 12.2.0(来自rocket-tools仓库04a559f版本)
- 编译选项:项目内Makefile
- 测试程序:项目内test.c
- 链接脚本:项目内common目录下文件
- UART打印模块:项目内uart目录下文件
- Rocketchip仓库版本:0586532
- Rocketchip配置:RV32imac架构,1核,无调试模块,带2个GPIO、1个UART,仿真SRAM 256MB
- 仿真环境:CentOS 7.9,Synopsys VCS R-2020.12-SP1
仿真流程
- 编译生成.hex文件:
$ make clean $ make bmarks=test $ riscv32-unknown-elf-objcopy -O binary test.riscv test.bin $ hexdump -v -e/'4 "%08x\n" ' test.bin > test.hex $ chmod 755 test.hex
- 将生成的test.hex写入testbench.v中定义的SRAM
- 编译生成仿真可执行文件并运行
预期与实际行为
预期行为
设置PERFORMANCE_RUN=1后,全局seed变量和局部num变量应初始化如下:
seed1_volatile=0x0 seed2_volatile=0x0 seed3_volatile=0x66 seed4_volatile=0xa seed5_volatile=0 num1=0x0 num2=0x0 num3=0x0 num4=0x0 num5=0x0
实际行为
调试输出显示,本该初始化为0的全局seed变量被赋了随机值,其余变量值符合预期:
seed1_volatile=0xdd232eba seed2_volatile=0xedd684db seed3_volatile=0x66 seed4_volatile=0xa seed5_volatile=0xf870bef0 num1=0x0 num2=0x0 num3=0x0 num4=0x0 num5=0x0
已做调试尝试
- 验证UART打印功能正常,各类格式输出均符合预期
- 确认
PERFORMANCE_RUN标志值设置正确 - 通过Dhrystone测试验证Rocket Core运行状态正常
- 确认程序内存地址分配在预期范围(0x80000000 - 0x90000000)
已发现的现象
- 汇编代码显示:全局变量通过
lw a1,offset(a1)或lw a1,offset(gp)指令从内存加载;局部变量则通过li a1,0指令加载立即数0 - .hex文件中:非零的初始化值会被写入SRAM,但值为0的初始化项未被存储
求助方向
目前不清楚如何确保全局变量正确初始化为0,恳请各位指点可能的原因或后续调试方向。
内容的提问来源于stack exchange,提问作者Jasminy
相关产品推荐
相关产品推荐

