第八章、一鼓作气,执行力是关键——交付

由于代码比较复杂,用编辑器查看读起来很吃力,所以可以直接把仿真跑起来。

我用的是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相关性

浮点单元

  • 独立的时钟域和电源域,在不使用时可以自动关闭各模块时钟,节省功耗
  • 独立的电源域,在不使用浮点单元之时可以软件控制关闭浮点单元电源
  • 单精度和双精度浮点指令复用数据通路
posted @   骑猪上树的少年  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
回到顶部
点击右上角即可分享
微信分享提示

目录导航