第八章、一鼓作气,执行力是关键——交付
由于代码比较复杂,用编辑器查看读起来很吃力,所以可以直接把仿真跑起来。
我用的是VCS+verdi组合,蜂鸟e203的压缩包doc文件里有脚本使用说明,对脚本中的仿真工具进行修改,即可用VCS和verdi查看。
另外verdi查看需要在top文件中添加产生fsdb波形的系统函数,生成出来的波形在run/rv32ui-p-add文件夹中。
即使是这样,也大部分看不懂,先硬啃书吧。终于理解了tinyrisc-v项目博客主页开头
)
8.1 执行概述
译码信息
- 指令所需要读取的操作数寄存器索引
- 指令需要写回的寄存器索引
- 指令的其他信息,如指令类型、操作信息等
执行模块根据指令的具体操作类型发射给具体的运算单元进行执行,常见运算单元有算术逻辑运算单元、整数乘法单元、整数除法单元、浮点运算单元等
派遣:表示指令经过译码之后,被派发到不同的运算单元等待队列中进行执行的过程。一般发生在流水线执行阶段。
发射:表示指令从运算单元的等待队列中发射到运算单元开始执行的过程。
根据每个周期一次能够发射的指令数,可以分为单发射处理器、多发射处理器。
处理器微架构流派:
- 顺序发射,顺序执行,顺序写回:各运算单元按指令顺序执行
- 顺序发射,乱序执行,顺序写回:各运算单元可以同时执行,比如加法单元在运行时,算数运算单元也可以执行其他指令,但即使后边指令执行完,也要等前边指令先写回
- 顺序发射,乱序执行,乱序写回:后边指令执行完也可以先写回
- 顺序排铅,乱序发射、乱序执行、乱序写回:常见于高性能的超标量处理器
要尽量在流水前前端位置进行指令分支解析,能更好避免流水线冲刷带来的性能损失
8.2 RISC-V架构特点对于执行的简化
- 规整的指令编码格式
- 优雅的16位指令
- 精简的指令个数
- 整数指令都是两操作数
8.3 蜂鸟E200处理器的执行实现
- 将IR寄存器中的指令进行译码和派遣
- 按照译码得出的操作数寄存器读取Regfile
- 维护指令数据相关性(OITF)
- 将指令派遣给不同的运算单元
- 将指令交付
- 指令运算结果写回Regfile
通用寄存器组
CSR寄存器
用于配置和记录一些运行的状态
E203派遣机制
- 所有指令都必须派遣给ALU,通过ALU与交付模块的接口进行交付
- 实际的派遣功能发生在ALU内部
资源冲突
- 比如指令被派遣给除法单元进行运算,运算一次需要十个周期,那下一条派遣给除法单元的指令就需要等待
- 蜂鸟E203模块之间采用valid-ready握手信号
数据冲突
- 由数据相关性引起
- “正在派遣的指令”只可能与“尚未执行完毕的长指令”之间产生RAW和WAW相关性
浮点单元
- 独立的时钟域和电源域,在不使用时可以自动关闭各模块时钟,节省功耗
- 独立的电源域,在不使用浮点单元之时可以软件控制关闭浮点单元电源
- 单精度和双精度浮点指令复用数据通路
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】