1、 IDU简介

IDU是玄铁C910中负责指令译码、寄存器重命名、派遣和发射逻辑的单元,主要划分为四级流水级,分别为ID、IR、IS、RF,玄铁C910中流水线分为控制通路和数据通路。本文将从流水级从前到后的顺序,介绍玄铁C910译码单元逻辑设计,以及在玄铁C910基础上进行扩展四发射所涉及逻辑。

2、 指令译码(id)

(1)指令类型

玄铁C910中支持的指令集分为RV基础指令集(IMAFDC)以及玄铁扩展指令集。根据指令类型,玄铁C910的译码单元将指令分为4种,分别为normal、split_short、split_long、fence。在译码单元中,标准的RISC-V指令会被分解成微操作(uop)。

类型 Uop数量
Normal 1
Split_short 2
Split_long 1~5
fence 特殊指令

其中,Split_long和fence类型指令由于其特殊性,只作为inst0译码,当周期只能译码一条指令。在玄铁C910中,split_long类型的指令只有原子指令一种,其译码由状态机控制,如果分解出了5条微操作,那么在当周期无法全部pipe到下一级,会寄存一拍。

译码单元对应的分为normal、split_short、split_long、fence四种,玄铁C910采用并行的数据通路的设计,以面积换取时序,共有三组译码单元,第一组可译码split_long和fence类型的指令,其他两组为normal和short。

(2)指令回填

在玄铁C910中,ID级负责将IB级pipe的指令进行译码,其遵循一次回填三条的原则。如IB级pipe了三条指令,而ID级只能译码两条,那么下周期IB级不再向ID级发送指令,ID级将剩余的指令进行移位处理,下一周期只译码剩余的指令。

指令回填的逻辑由ctrl_id_pipedown_x_inst信号控制,主要的回填逻辑如下表

ctrl_id_pipedown_1_inst 1. inst0是normal或short,inst1是fence或者long2. inst0是long或者fence且id级没有发生stall
ctrl_id_pipedown_2_inst inst0/1都是normal或者short 且1. inst0和inst1都是short,inst2是normal2. inst0,1,2都是short类型3. inst2是long或者fence类型
ctrl_id_pipedown_3_inst Inst0,1,2中不能有fence或者long类型指令且inst 0,1,2不能有两条及以上的short类型

(3)微操作数量判定

译码级译码出的微操作数量最大为4条,因此译码级pipedown的微操作取决于id级的指令类型。在玄铁C910中,pipedown的uop的vld为

ctrl_id_pipedown_instx_vld

其主要判断逻辑为if-else逻辑,对于每条微操作的vld,从inst0指令类型判断到inst2指令类型。

对于uop0:

Uop0只需考虑inst0指令类型,因为是并行的译码通路,vld信号经过一个选择器

对应关系为

其中long_ vld[x] long类型的指令译码出的第几条微操作是否有效。

fence_ctrl_instx_vld:取决于fence状态机,在此简单介绍:

fence指令需要等待之前所有的指令都退休了,才能进行后续的指令译码。

fence_ctrl_inst0_vld表示,fence状态机到了issue状态,表示后续指令可以继续译码和pipe了。

fence_ctrl_inst1_vld 和fence_ctrl_inst2_vld为高时,fence 指令类型为FENCE.I指令以及玄铁扩展的虚拟内存广播指令以及状态机为issue状态。

ctrl_id_pipedown_x_inst信号在判定中作用很大,在考虑这个信号的基础上判断是否有效

Uop1需要考虑inst0和inst1

Uop2考虑inst0,1,2

(4)stall逻辑

Stall逻辑主要包括

1、 ir stall:ir级发生stall会同时stall ID级

2、 split_long stall:在开源版本中只有一种,原子指令译码出5条微操作时会产生此种stall。

3、 id bypass stall:发生了ir stall 或者当周期不能pipe3条指令时发生此stall。

Fence、long以及ir stall 三种会产生ID级pipedown stall。

(5)四发射修改

对四发射主要逻辑修改与上述所列类似,主要包括指令回填以及指令pipe

1、指令回填主要逻辑表格如下:

ctrl_id_pipedown_1_inst 3. inst0是normal或short,inst1是fence或者long
4. inst0是long或者fence且id级没有发生stall
ctrl_id_pipedown_2_inst 4. inst0/1都是normal或者short 且inst2是long或者fence
5. inst0/1都是short,inst2是short/long/fence
ctrl_id_pipedown_3_inst 1. inst 0,1,2 两个short一个normal
2. inst 0,1,2 一个short两个normal且inst3 fence或long
3. inst 0,1,2 三个normal且inst3是fence或者long
ctrl_id_pipedown_4_inst 1. inst0,1,2,3中最多有一个short,其他都是normal且不能有fence也不能有long

2、微操作pipe主要逻辑如下:

3、 指令重命名和预派遣(IR)

(1) 指令队列

在IS级派遣指令前,需要根据指令信息决定要派遣到的队列,在指令译码后,根据指令类型将指令分别送往7条队列,每个队列有两个写入端口分别为c0和c1,c0从队列左侧写入,c1从队列右侧写入。对于可以派遣到两条队列的指令,如某些AIQ0和AIQ1都能派遣的指令,优先级为A0c0>A1c0>A0c1>A1c1。

指令队列 表项数 指令发射的执行级
AIQ0 8 ALU、DIV、SPECIAL
AIQ1 8 ALU和MUL
BIQ 12 BIU
LSIQ 12 LSU
SDIQ 12 LSU
VIQ0 8 FALU、FMUL和FDIV
VIQ1 8 FALU和FMUL指令

(2) Stall和反馈机制

由于每个队列只有两个写入端口和一个写出端口,因此当同周期出现三条及以上某队列类型的指令时,当周期无法将全部的指令写入到指令队列中,如果直接stall流水线会造成性能损失。因此玄铁C910中加入了反馈机制,在ir和is两级流水之间增加反馈判断逻辑。

1、 typestall处理

stall分为 ir_stage_stall 和type_stall

其中type_stall可以通过反馈机制优化

当ir和is 的指令数量<4条时,可以反馈来避免stall

反馈信号主要是

ctrl_xx_is_inst0_sel[0] 表示is级pipe了2条(说明is级有3条同类型指令)

ctrl_xx_is_inst0_sel[1] 表示is 级不是pipe了两条

当is级pipe了两条时,以下两种情况会发生stall

如果is inst3 vld(说明is级pipe了两条,剩了2条 (inst2 inst3)指令)且 ir级inst2 vld(说明ir有3条及以上(0,1,2)的指令),此时超过了最大微操作数量4条,因此需要stall流水线。

如果is inst3 不vld(说明is级剩(inst2 )的指令)且 ir级inst3 vld(说明ir有4条及 (0,1,2,3)指令,超过最大微操作数量4,因此stall流水线。

ctrl_xx_is_inst_sel[0] Is pipe两条 且is inst3 vld (说明剩了2,3两条uop)
ctrl_xx_is_inst_sel[1] Is pipe两条 且!is inst3 vld(说明剩了2一条uop)
ctrl_xx_is_inst_sel[2] 没有发生typestall的情况

(3) 动态平衡

对于AIQ0和AIQ1 以及VIQ0和VIQ1,因为存在aqi01和viq01类型的指令,而写入优先级总是A0>A1,因此aiq0和viq0中的指令数量会变多,增加stall的风险,因此玄铁c910中加入了动态平衡机制来解决这个问题

动态平衡机制通过对队列表项进行计数来实现。可以通过cp0配置信号来开启和关闭。

有两种情况会使能

1、 AIQ0(VIQ0)中表项数量为8且AIQ1(VIQ1)中表项数为0

2、 AIQ0(VIQ0)中表项数量和AIQ1(VIQ1)表项数量相差 2~7个之间。

这两种情况下会把AIQ01(VIQ01)变成AIQ1(VIQ1)类型的指令,然后再进行预派遣。

(4) 指令派遣

指令派遣逻辑主要分为两部分,队列端口的enable信号和队列端口要写入哪条指令的sel信号。其中AIQ和VIQ两条队列是特殊的,因为存在AIQ01和VIQ01类型的指令,因此在逻辑判断上要更复杂。

1、AIQ/VIQ队列端口的使能逻辑

a0c0 4条uop中有一条及以上的aiq0或者aiq01类型指令
a1c0 1、1条及以上的aiq1类型指令2、1条及以上的aiq0类型指令且一条及以上的aiq01类型指令3、2条及以上的aiq01类型指令
a0c1 1、2条及以上的aiq0类型指令2、1条及以上的aiq0,1条及以上的aiq1,1条及以上aiq013、三条及以上的aiq01类型
a1c1 1、2条及以上的aiq1类型指令2、2条及以上的aiq0,且1条及以上的aiq1且1条及以上aiq013、2条及以上的aiq01且3.1、2条及以上aiq03.2、1条及以上的aiq0,一条及以上aiq14、3条及以上aiq01且1条aiq0或者1条aiq15、4条aiq01类型指令

2、 AIQ/VIQ指令队列的派遣逻辑

Sel逻辑用于数据通路选择对应的指令

3、 其他队列端口的使能逻辑,以BIQ为例

按照inst0 – inst3的优先级分配端口即可。

(5) 指令折叠

指令折叠是玄铁C910中用来节约ROB表项的优化。AIQ0、AIQ1、AIQ01和VIQ0、VIQ1、VIQ01类型的指令可以进行fold,是否可以进行fold需要进行判定

assign ctrl_ir_pre_dis_inst0_fold = ctrl_ir_pre_dis_inst0_vld

&& ctrl_ir_inst0_fold

&& !ctrl_ir_inst0_split

&& !ctrl_ir_inst0_intmask

&& !rtu_idu_srt_en

&& !cp0_idu_rob_fold_disable;

Fold具有下面几种组合

ctrl_ir_pre_dis_inst01_fold

ctrl_ir_pre_dis_inst12_fold

ctrl_ir_pre_dis_inst23_fold

ctrl_ir_pre_dis_inst012_fold

ctrl_ir_pre_dis_inst123_fold

fold折叠必须要有连续2条以上可以fold的指令。

(6) ROB端口

在IR流水级中,会向ROB的表项中写入指令的相关信息,完成寄存器重命名过程。

在发生了指令折叠时,写入的是折叠的第一条指令的信息,同时记录折叠的指令数量。

所以虽然写入的都是折叠的第一条指令的信息,但是需要记录折叠情况,所有需要sel。

所以sel对应的数字其实没有特定意义,只是表示不同的情况,用于数据通路选择。

1、ROB 端口enable判断

2、ROB sel逻辑

3、 ROB IID逻辑

IID是表示指令先后顺序的标志位,也是ROB64个表项的索引。经过折叠的指令具有相同的iid。

4、 指令队列

1、 队列维护

队列的维护主要分为写入和弹出。写入在IS级写入,根据指令的类型送入不同的指令队列,写入端口为两个,pop端口为一个。队列会有表项数的计数,同时将信号传递个IR级进行DLB的控制。Create0的创建优先级为entry0-entry7,create1的创建优先级为entry7-entry1。

表项中主要维护以下内容:

① 年龄向量(agevec)

年龄向量是表示队列中表项的先后顺序的信号。队列的发射是顺序的,遵循先入先出原则,队列pop的指令是队列中最老的指令。

Create0和create1的年龄向量判断略有不同,因为在同一个周期中,create·0的指令一定比create1的指令要老。

2、 队列bypass

队列中表项的src0,src1,src2

都可以bypass


本文章仅供学习交流使用,如引用请标注出处。

IDU-指令译码单元相关推荐

  1. Intel Core Enhanced Core架构/微架构/流水线 (6) - 指令预译码/指令队列/指令译码

    Instruction PreDecode 指令预译码器从指令Cache或者指令预取缓存区中接收16字节的指令流,执行如下的预译码操作: 确定每条指令的长度(注:x86指令是变长指令) 译码每条指令的 ...

  2. 计算机组成原理指令译码,计算机组成原理实验报告指令译码器.docx

    河北大学计算机组成原理实验报告 实验项目指令译码器成绩 -X实验目的: 理解指令译码器的作用和重要性. 学习设计指令译码器. 实验原理: 指令译码器是计算机控制器屮最重要的部分.所谓组合逻辑控制器就是 ...

  3. 31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 指令译码器 我们需要根据一条32位的指令的结构确定是哪一条指令 可以根据操作码(op)以及功能码(fun ...

  4. 微型计算机期末考试复盘(知识点总结)

    第一章:微型计算机的概述 第二章:16位和32位微处理器 第三章 Pentium指令系统 第四章 存储器.存储管理和高速缓冲技术 第五章 微型计算机和外设的数据传输 第六章 串并通信和接口技术 第七章 ...

  5. 微机原理概念梳理(考研/保研面试)

    微型计算机原理,常见概念及知识点整理(保研面试用). 目录 第1章 微型计算机基础 第2章 Intel系类微处理器 第3章 80486微处理器的指令系统 第4章 汇编语言程序设计 第5章 存储系统 第 ...

  6. 南京工程学院 Dsp复习

    Dsp复习知识点 1. 最小系统包括?每个模块做什么的? 答:一个DSP系统要能够正常的运行程序完成简单的任务,并能够通过JTAG进行调试,它的 最小系统应该包括: DSP芯片: 电源 ----加电顺 ...

  7. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (5) - 流水线前端传统译码器

    Legacy Decode Pipeline 传统的译码流水线由下列部件/单元构成:指令地址转换旁查缓冲区ITLB,指令缓存,指令预译码器,指令译码单元(一个复杂译码器/三个简单译码器). Instr ...

  8. Pentium Pro架构/流水线及其优化 (3) - 指令流水线/乱序执行核/高速缓存/分支预测/指令预取

    Instruction Pipeline 关于Pentium Pro的指令流水线,我从4个来源看到3种不同的说法:11级,12级和14级(没有13级说,不大吉利吧).其实大同小异,不用纠结到底是多少级 ...

  9. 80386/386/Intel386 架构/流水线及其优化

    80386 Architecture Overview 80386是Intel的第一代32位x86架构处理器,内部32位的数据通路,外部32位的数据总线与地址总线,标志着32位程序设计时代的到来.硬件 ...

最新文章

  1. Spring AOP的一个简单实现
  2. 2020年终总结暨组会PPT20201229《复现chen密度径向分布结果》
  3. Java Long类的valueOf()方法及示例
  4. 谷歌Chrome 80稳定版更新:对浏览器进行两项重大的更改
  5. SQL Server中的尾日志备份和还原
  6. 1.UNIX 环境高级编程--UNIX基础知识
  7. Python 3.5 协程究竟是个啥
  8. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
  9. 华为手机所有图标变黑_华为手机字体白色变黑色 华为图标字体怎么变黑
  10. 【海康威视】WPF客户端二次开发:【1】监控视频画面预览(SDK初始化、设备登录、监控画面预览)
  11. podman配置加速器、harbor镜像仓库部署
  12. 顶级计算机专家一年赚多少,成为一个计算机专家需要多高的IQ?请实话实说
  13. Qt QNetwork 下载文件
  14. Python—遇到的问题,使用PyPDF2转化pdf时候遇到的各种问题。
  15. UDS-下载示例解读
  16. UltraISO PE 绿色版9.1.2.2463
  17. C++实现日志功能:log4c(Win10+VS2017+CMake)
  18. Android:在同一WiFi下通讯(局域网下服务端和客户端通讯)
  19. 入门UI设计一般要学习多久,学习哪些内容
  20. android 下载apk安装后自动启动,下载apk并启动安装

热门文章

  1. linux antivir,Linux下安装和使用杀毒软件AntiVir (1)
  2. 分享IT十八掌大数据
  3. jquery实现新闻消息滚动
  4. 外国语言学c刊集刊联系方式,CSSCI(2017-2018)收录集刊目录 (共189 种).PDF
  5. java:Cassandra入门与实战——上
  6. servu用户信息如何导出_用户如何增强信息安全防护意识
  7. android台湾 apk.tw,台湾SWAG app
  8. @用Python的turtle库画一个奥运五环!
  9. 如何获取淘宝/天猫店铺的所有商品 API数据
  10. 斯蒂夫乔布斯传札记:第六波