蜂鸟E203学习笔记

  • 前言
  • 1 部分译码
  • 2 分支预测与PC生成
  • 3 请求与响应
  • 4 流水线冲刷
  • 5 阻塞请求

前言

本文取指模块概述后半部分,前半部分跳转至:取指模块概述(1)


1 部分译码

Minidecode中例化decode模块,使用decode部分译码功能,只需要译出IFU所需的部分指令信息。包括此指令是属于普通指令还是分支跳转指令、分支跳转指令的类型和细节。从minidecode的端口可以看出其主要完成这些功能:

  1. 判断寄存器(rs1,rs2,rd)是否被使用,并输出其索引。
  2. 判断指令长度(32 or 16)及指令类型(bjp, jal, jalr, bxx)。
  3. 若指令为乘除法相关指令,判断其是否属于back2back fusing类型,这指的是对于乘法来说,两个32位数相乘最高能得64位数,而寄存器只为32位,因此每次只能将结果的高32位或低32位存入寄存器,如果希望得到两个32位整数相乘的完整64位结果,RISC-V架构推荐使用两条连续的乘法指令“MULH[[S]U] rdh, rsl, rs2; MUL rdl, rsl,rs2”, 而对于除法如果希望同时得到两个32位整数相除的商和余数,RISC-V架构推荐使用两条连续的除法和取余指令“DIV[U] rdq, rsl, rs2; REM[U] rdr, rsl, rs2”其要点如下:
  • 两条指令的源操作数索引号和顺序必须完全相同。
  • 第一条指令的结果寄存器rdh或rdq的索引号必须不能与其rsl和rs2的索引号相等。
  • 处理器实现的微架构可以将两条指令融合(Fused)成为一条指令执行,而不是分离的两条指令,从而提高性能。
  1. 解析jalr的rs1寄存器索引和分支跳转指令bjp使用到的立即数输出至分支预测模块。

2 分支预测与PC生成

对于分支预测,此处为了实现低功耗采用较简单的静态分支预测,对于Bxx指令来说,立即数表示的offset偏移若是负即向后跳转,则判定为跳,若是正的向前跳转则判定为不跳。而jal和jalr则始终跳转,其中对于jalr来说,因为其是间接跳转,跳转目标计算所需的基地址来自于其rs1索引的操作数,需要从通用寄存器组(Regfile)中读取,并且还可能和正在EXU执行的指令形成RAW数据相关性,如图1所示,为分支预测与解决jalr的rs1数据相关性的流程图。对于图中红色序号:

  1. 判定rs1的索引号是x1,则其可能与EXU中的指令存在潜在的RAW数据相关性,首先若OTIF不为空,意昧着可能有长指令正在执行,其结果可能会写回x1(OITF本质上是一个先入先出的FIFO, 在流水线的派遣点,每次派遣一个长指令,则会在OITF中分配一个表项,在这个表项中会存储该长指令的源操作数寄存器索引和结果寄存器索引,在流水线的写回点,每次按顺序写回一个长指令之后,就会将此指令在OITF中的表项去除),其次若处于IR寄存器中的指令的写回目标寄存器的索引号为x1,意昧着有RAW数据相关性。
  2. 特别加速指的是将x1从处于EXU的Regfile中直接拉线取出(不需要占用Regfile的读端口)。
  3. 若jalr的基址寄存器不是x0、x1就是xn,此时考虑数据相关性除了要判断OTIF是否为空,还要看IR中指令是否为空,因为若IR中指令不为空,其执行写回操作时虽然不一定写回到jalr所用的xn,但是保守判断,也可能产生数据相关性,因此需要考虑。
  4. 当jalr所用基址寄存器为xn时,不在对其进行特别加速,要从regfile端口读出,因此要考虑端口占用问题。

由于PC计算需要使用到加法器(pc = 基地址 + 偏移量),为了节省面积,所有的PC计算均共享同一个加法器。如以下代码。构建带优先级的多路选择器,来获取基址。PC生成逻辑用于产生下一个待取指令的PC, PC生成根据不同的情形需要不同处理,书中7.3.4节做了详细论述,包括reset后第一次取指、16位与32位自增取指、分支跳转和流水线冲刷四种情况的PC生成。

 wire [`E203_PC_SIZE-1:0] pc_add_op1 = `ifndef E203_TIMING_BOOST//}pipe_flush_req  ? pipe_flush_add_op1 :dly_pipe_flush_req  ? pc_r :`endif//}ifetch_replay_req  ? pc_r :bjp_req ? prdt_pc_add_op1    :ifu_reset_req   ? pc_rtvec :pc_r;wire [`E203_PC_SIZE-1:0] pc_add_op2 =  `ifndef E203_TIMING_BOOST//}pipe_flush_req  ? pipe_flush_add_op2 :dly_pipe_flush_req  ? `E203_PC_SIZE'b0 :`endif//}ifetch_replay_req  ? `E203_PC_SIZE'b0 :bjp_req ? prdt_pc_add_op2    :ifu_reset_req   ? `E203_PC_SIZE'b0 :pc_incr_ofst ;

3 请求与响应

Ifetch在以下情况下发出新的Ifetch请求:不需要等待、中断、重置、重播的情况。当存在新的ifetch请求,或冲刷请求挂起时,将触发取指请求有效信号。另外新的请求就绪产生的条件是:1.当前没有未完成的请求;2.有未完成的请求但已收到响应有效信号。而一旦产生新的请求或流水线冲刷,则更新当前PC值。指令输出到IR则由Ifetch请求响应通道根据当前状态作出控制。

4 流水线冲刷

在取指阶段的分支预测功能,对于带条件分支指令,由于其条件的解析需要进行操作数运算(譬如大小比较操作),流水线在取指阶段无法得知该指令的条件跳转结果是跳还是不跳,只能进行预测。 因此在执行阶段,通常需要使用 ALU 对该指令进行条件判断运算(譬如大小比较操作)。
ALU进行条件判断运算的结果将用于解析该分支指令是否真的需要跳转,并且和之前预测 的跳转结果进行比对。如果真实的结果和预测的结果不一致,则意味着之前的预测错误, 需要进行流水线冲刷(Pipeline Flush ),将预测取指( Speculative Fetch)所取的指令都舍弃 掉,重新按照真实的跳转方向进行取指。
流水线冲刷本应在Ifetch接口就绪或存在响应有效(valid)信号时被确认,但为了减少EXU和IFU之间的组合环路,采用一种始终接受流水线冲刷的策略,当冲刷未被确认时,使用延迟冲刷指示标记此次冲刷,而即使有冲刷被挂起,仍然可以接受新的冲刷请求。当收到流水线冲刷请求,但IFU未就绪接受新的取指请求时,设置冲刷延迟。

5 阻塞请求

如果收到阻塞请求,IFU会暂停获取新的指令,直到正在进行的事务完成之后,会收到ifu_halt_ack响应,只有在ifu_halt_req请求取消后,才会恢复取指。

蜂鸟E203学习笔记-取指模块概述(2)相关推荐

  1. 蜂鸟E203学习笔记(四)——取指

    1.1 取值概述 1.1.1 如何快速取指 首先要保证存储器的读延时足够小,通常使用指令紧耦合存储器(ITCM)和指令缓存器(ICache). ITCM通常使用离处理核很近的SRAM因此实现极短的延时 ...

  2. 蜂鸟E203学习笔记(五)——执行

    1.1 执行概述 1.1.1 指令译码 指令所包含的信息编码在有限长度的指令字中,信息如下: 指令所需要读取的操作数寄存器索引 指令需要写回的寄存器索引 指令的其他信息如指令类型.指令的操作信息等 顺 ...

  3. 蜂鸟E203学习笔记(二)--蜂鸟E203总体框架

    蜂鸟E203总体框架 蜂鸟E203处理器系统如下图所示 一.蜂鸟E203处理器核设计总览和顶层 1.1 蜂鸟E203处理器核的设计理念 模块化和可重用性:将处理器分成几个主体模块,每个单元之间的接口简 ...

  4. RN学习笔记01:概述、特点与环境搭建

    RN学习笔记01:概述.特点与环境搭建 一.RN概述 React Native(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 Reac ...

  5. 开源RISC-V处理器(蜂鸟E203)学习(五)A100T-FPGA 移植蜂鸟Hbirdv2,实现Centos下调试器USB识别以及程序编译烧写,并进行C语言仿真

    1.简述 最近购买了一块适合做原型验证FPGA板卡,板卡接口和外设比较丰富,十分适合跑一些小型的SOC工程,比如蜂鸟E203:板卡自带FPGA烧写器和软核CPU的JATG调试器,还有USB接口的UAR ...

  6. Python学习笔记:第三方模块2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. python中socket模块常用吗_python网络学习笔记——socket模块使用记录

    此文章记录了笔者学习python网络中socket模块的笔记. 建议初次学习socket的读者先读一遍socket模块主要函数的介绍. socket模块的介绍可以参考笔者的前一篇关于socket官方文 ...

  8. IOS学习笔记03---C语言概述

    IOS学习笔记03---C语言概述 0 3.C语言1-C语言概述         qq交流群:创梦技术交流群:251572072                        创梦网络赚钱群:2483 ...

  9. 知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别

    知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别 知识图谱的概念,与传统语义网络的区别 狭义概念 作为语义网络的内涵 与传统语义网络的区别 优点 缺点 与 ...

最新文章

  1. python画指数函数图像_python实现画出e指数函数的图像
  2. fragment生命周期
  3. Python 使用sys.exc_info自己捕获异常详细信息
  4. ORA-16038: log 3 sequence# 103 cannot be archived
  5. Spring Boot MyBatis配置多种数据库
  6. c#devexpres窗体划分 以及panelcontrol 相关操作
  7. 【转】Android中Dalvik(DVM)的详解
  8. windows下配置apache和php,Windows系统下Apache和PHP的安装和基本配置
  9. windows系统vbs脚本 恶搞将系统搞崩 死机 以及解决
  10. 任务方案思考:句子相似度和匹配
  11. Cannot forward ... response ... committed
  12. paip.Adblock屏蔽规则保存位置以及修理恢复
  13. Grunt usemin前端自动化打包流程
  14. SAP-MM MRP类型详解
  15. 识别速度3.6ms/帧,人像抠图、工业质检、遥感识别,用这一个分割模型就够了
  16. 计算机台式和电脑的区别吗,直观:工业计算机和家用台式计算机有什么区别
  17. UART总线协议——esp32学习笔记
  18. 雨林木风 linux操作系统,“雨林木风”操作系统门户正式上线
  19. 无存储式优惠券编码方案
  20. 红米note4x装linux,红米Note4X升至MIUI10 界面大改运行操作流畅

热门文章

  1. Lenovo ThinkPad window10 系统 显示屏检测不出来问题
  2. Kyligence at Microsoft Build,助力世界非凡洞见
  3. 开篇 - 麒麟子全方位解读 Cocos Cyberpunk 工程源码
  4. B端产品100问:一图掌握业务架构图绘制心法
  5. opencv的多图拼接
  6. pca图解读_如何通俗易懂地讲解什么是 PCA 主成分分析?
  7. 2022制冷与空调设备运行操作上岗证题库及答案
  8. 三坐标检测基础知识之测针选型技巧
  9. 数据挖掘04-不同数据类型的特征处理
  10. LuaPlus的编译和引用