【从嵌入式视角学习香山处理器】五、香山开发工作流实践1:主要子模块工程之间的关系

一、前言

这篇文章梳理了xs-env(https://github.com/OpenXiangShan/xs-env)代码工程下,几个和香山开发相关的四个子模块(submodule)工程之间的使用关系:nexus-am、NEMU、XiangShan、Nutshell。


二、子模块工程简介

香山的四个子模块
NEMU:NJU Emulator,来自南京大学的是一个简单但完整的全系统模拟器, 目前支持x86, mips32, riscv32, riscv64指令集。我们只用它来生成 riscv64 相关的两个文件:模拟器和运行库
Nutshell:果壳项目,是一个入门级别的CPU设计工程。
XiangShan:香山项目,是一个非常复杂的CPU设计工程。
nexus-am:Abstract Machine,抽象层函数库,用于从C应用层代码到指令集的抽象。即向上提供 printf() 这类标准C库函数,向下根据选择的微架构、平台来提供一些标准函数的实现,比如 _halt()、_putc()

我准备从Nutshell项目先入手,弄懂微架构设计和开发工作流以后再学习XiangShan项目。


三、子模块工程关系:

关系总览

步骤说明:

  1. 编译workload版本 :AM工程里默认至少有三个workload代码(CoreMark、MicroBench、Linux),编译时需要指定生成的目标指令集和平台。指令集我们总是选择 riscv64 ,平台根据需要一般限定为 nemu和noop
  2. 编译NEMU模拟器(riscv64指令集版) :用于验证workload版本的正确性——如果第一步生成的目标指令集为riscv64、目标平台为nemu的workload都不能在riscv64指令集版的NEMU正常跑完,则说明代码有问题,不能用来编译目标平台为Nutshell或XiangShan仿真核的workload版本。
  3. 编译NEMU动态库(riscv64指令集版) :用于差分测试流程中验证Nutshell或XiangShan仿真核执行workload版本的正确性——NEMU动态库相当于是 没有main()函数 的可执行文件,只能被动输入riscv64指令、输出执行结果(然后被difftest利用来与仿真核的结果做对比)。
  4. 编译XiangShan仿真核 :文件名为emu,可支持选择编译为标准版,或最小配置版。
  5. 编译Nutshell仿真核 :文件名为emu(上图中没有对Nutshell仿真核的差分测试进行讲解,但实际与XiangShan使用方法的一样)。
  6. NEMU运行workload :单独在NEMU模拟器(riscv64指令集版)上跑workload,以验证workload版本的正确性。(此时NEMU模拟器是确定正常的、而workload版本未知。)
  7. XiangShan运行workload :单独在XiangShan仿真核上跑workload,以验证XiangShan仿真核的正确性。(此时workload版本确定是正常的、而XiangShan核未知)。
  8. XiangShan核与NEMU同时运行workload :同时在XiangShan核与NEMU模拟器(riscv64指令集版)上跑workload,以验证XiangShan核的执行结果与顺序都是正常的(可能用于测试性能时需要?或调试阶段抓出第一个行为不一致的指令。)

四、疑问与解答:

  1. 第6步中认为NEMU模拟器是确定正常的,为什么能这么保证呢?
    因为NEMU也经过差分测试与调试才拿来用的,而对比的对象为更标准的QEMU模拟器。其实第8步中可以使用QEMU模拟器来与仿真核做差分测试,但在效率方面远比不上NEMU,所以会使用NEMU来代替作为实际使用的指令模拟器。
    Nutshell调试指南里有对此进行解释:https://oscpu.gitbook.io/nutshell/qi-ta/debug#cha-fen-ce-shi-kuang-jia差分测试框架
  2. 如果Nutshell或XiangShan核跑AM编译给对方的workload版本,会发生什么?比如Nutshell跑microbench-riscv64-noop.bin或XiangShan跑microbench-riscv64-nutshell.bin
    正常情况下不应该这样做;如果一定要尝试下,结果就是会挂死在某个位置。 跑错误的workload会挂死
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 嵌入式硬件工程学习ARM处理器可以从以下几个方面入手。 首先,了解ARM架构和处理器的基本知识,包括指令集、寄存器、内存管理等。可以通过学习ARM体系结构手册、技术文档以及相关的书籍和教程来获得这些基础知识。 其次,学习ARM处理器的编程语言和开发工具。常用的ARM处理器编程语言有C和汇编语言,可以选择一门适合自己的语言来学习。同时,熟悉ARM处理器开发工具链,如ARM编译器、调试器和仿真器等,可以帮助我们进行软件开发、调试和优化。 第三,进行实践和项目实践。选择一款ARM处理器开发板,并尝试在开发板上进行各种实际的项目开发,如LED控制、外设驱动、嵌入式系统开发等。通过实践可以加深对ARM处理器的理解,掌握实际开发技巧和经验。 此外,还可以参加相关的培训课程和工作坊,与其他从业者进行交流和分享经验。通过与其他人的讨论和交流,可以学到更多关于ARM处理器的实际应用和开发经验。 综上所述,学习ARM处理器需要深入了解ARM架构和处理器的基本知识,掌握ARM处理器的编程语言和开发工具,进行实际的项目实践,并积极参与与其他从业者的交流和分享。这样可以帮助嵌入式硬件工程师深入理解和学习ARM处理器。 ### 回答2: 想要学习ARM处理器作为嵌入式硬件工程师,以下是一些步骤和建议: 1. 获取基本知识:首先,了解嵌入式系统的基本概念和原理,包括处理器架构、外设接口和总线控制等。同时,理解ARM处理器的基本特性和指令集架构。 2. 学习文档和手册:ARM提供了详尽的文档和技术手册,包括ARM体系结构参考手册和特定系列处理器的数据手册。阅读这些文档可以深入了解ARM处理器的细节和工作原理。 3. 刷机器:获取一块ARM开发板,如Raspberry Pi、STM32开发板等,开始实践。通过刷入不同的固件和操作系统,尝试探索和理解ARM处理器的各种功能和特性。 4. 学习编程:掌握至少一种ARM汇编语言,如ARM汇编指令集。通过编写简单的汇编程序,了解ARM指令的使用方式和编程技巧。 5. 实践项目:找一些ARM相关的项目并动手实践。这可能包括编写设备驱动程序、移植操作系统、设计和优化嵌入式系统等。通过实际项目经验,能够更深入地理解ARM处理器的应用和工作原理。 6. 参加培训和课程:参加一些专门的培训或课程可以加快学习进程。这些课程通常涵盖ARM处理器的原理、编程、调试和性能优化等方面。同时,也可以结识其他学习者和行业专业人士,加强交流和合作。 总之,学习ARM处理器需要通过理论学习实践相结合,阅读文档和手册、编程实践、参与项目和培训等多种方式相结合,逐步深入理解和掌握ARM处理器的知识和技能。 ### 回答3: 嵌入式硬件工程学习ARM处理器可以按照以下步骤进行: 1. 学习计算机体系结构和数字电路基础知识:首先,需要掌握计算机的基本原理和体系结构,了解数据存储和处理以及数字电路的工作原理。 2. 了解ARM处理器的架构和体系结构:熟悉ARM处理器的具体架构和指令集,了解其寄存器、内存和外设控制等核心部件的工作原理。 3. 学习ARM指令集和编程:掌握ARM指令集的各种指令、寻址方式以及编程模型,了解常用的编程语言如C、汇编语言等在ARM处理器上的应用。 4. 搭建开发环境:安装并配置开发工具,如ARM开发板、调试器和集成开发环境(IDE),熟悉开发环境的使用方法。 5. 进行实践项目:通过各种实践项目,如LED灯控制、按键输入、串口通信等,逐渐深入理解ARM处理器的工作原理和应用。 6. 学习外设控制:了解不同的外设接口和控制原理,如GPIO、UART、I2C、SPI等,并掌握它们在ARM处理器上的配置和应用。 7. 学习操作系统和驱动程序:了解嵌入式操作系统如FreeRTOS、uC/OS等的基本概念和原理,并学习编写底层驱动程序以适配ARM处理器。 8. 参与开源社区和论坛:参与ARM相关的开源社区和论坛,与其他开发者交流经验和学习最新的技术动态。 9. 持续学习和更新知识:嵌入式领域的技术更新快,需不断学习新的技术和发展动态,关注ARM处理器的最新进展。 总之,学习ARM处理器需要系统地学习计算机体系架构、ARM指令集、外设控制、操作系统和驱动开发等知识,并通过项目实践和与他人交流不断提升技能和知识水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值