在Rocket-Chip SoC中运行多线程程序仅单核心执行,求指导
问题分析与解决方案
1. 运行命令的配置匹配问题
你生成的是TutorialConfig多核心SoC,但运行命令里指定的是CONFIG=TutorialStarterConfig——这两个配置并非同一套:TutorialStarterConfig是Chipyard教程默认的单核心基础配置,而你自定义的TutorialConfig才是包含Rocket+BOOM多核心的目标配置。这种不匹配会导致你实际运行的是单核心SoC,自然不会出现C1的trace输出。
解决:将运行命令的CONFIG参数改为你自定义的TutorialConfig:
make CONFIG=TutorialConfig run-binary BINARY=riscv-tests/benchmarks/mt-matmul.riscv
2. 程序端的多核心适配验证
修改crt.S核心数后,需确认以下关键细节:
- 是否正确实现了非0号核心的唤醒逻辑:mt-matmul这类多线程基准需要在启动时触发C1从指定地址执行,crt.S中必须包含通过PLIC(平台级中断控制器)或核心间中断唤醒其他核心的代码。
- 编译链配置是否正确:编译时需指定匹配目标架构的参数(如64位核心用
-march=rv64gc),同时确保链接脚本支持多核心地址空间映射,避免程序仅加载到C0的执行域。
3. SoC配置的多核心启用确认
检查你的TutorialConfig.scala配置文件:
- 是否同时实例化了RocketTile和BoomTile:需在
BuildTop逻辑中明确添加多个核心Tile的生成代码,确保SoC物理上包含两个核心。 - 是否启用多核心必备外设:必须包含PLIC(用于核心间中断唤醒)、共享内存/L2缓存(用于核心间数据通信)等组件。
- 是否为每个核心分配了唯一hartid:确保C0和C1的硬件线程ID不同,这是程序识别并调度多核心的基础。
4. Trace输出的配置检查
若以上配置都正确但仍看不到C1的trace,需验证仿真trace的开启逻辑:
- 检查配置文件中是否启用了全局trace:需添加
withTrace配置项,并确保对所有核心开启trace输出。 - 运行仿真时是否显式开启trace:部分Chipyard仿真需要通过
+trace参数或在Makefile中设置TRACE=1来启用多核心trace记录。
内容的提问来源于stack exchange,提问作者sammy17
相关产品推荐
相关产品推荐

