简单BPU模块的主要功能是根据简单译码模块的结果来进行预测,预测下一个指令的PC,E203实现了一个简单的静态分支预测功能,即对于条件分支跳转指令,如果是向后跳转,则预测为跳,向前跳转预测为不跳。详细的预测逻辑如下:

对于无条件跳转指令jar,总是预测为跳,跳转的PC是当前的PC与偏置值offset之和。

对于无条件跳转连接指令jalr,需要判断源操作数1的寄存器索引,如果为x0,则总是判断为跳转;如果为x1,则需要检查x1与当前正在执行的指令是否有RAW数据依赖性;如果为xn(不是x1以及x0),除了要检查数据依赖性之外还需要检查寄存器的读端口是否被占用(因为E203对xn的读取需要使用一个寄存器读端口)。

判断是否有RAW数据依赖性是通过判断下面两个条件来进行的:

1.判断OITF是否为空,如果OTIF不为空,证明有长指令正在执行,这条长指令可能会写入当前指令的源操作数1寄存器,E203对于这种情况保守地预测为不跳。

2.判断IR寄存器中的指令的目的寄存器是否是本条跳转指令的源操作数1寄存器。如果是,则有RAW数据依赖性。

如果存在数据依赖性,IFU会挂起直到数据依赖性被消除。

 /*                                                                      Copyright 2018-2020 Nuclei System Technology, Inc.                Licensed under the Apache License, Version 2.0 (the "License");         you may not use this file except in compliance with the License.        You may obtain a copy of the License at                                 http://www.apache.org/licenses/LICENSE-2.0                          Unless required by applicable law or agreed to in writing, software    distributed under the License is distributed on an "AS IS" BASIS,       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and     limitations under the License.                                          */                                                                      //=====================================================================
// Designer   : Bob Hu
//
// Description:
//  The Lite-BPU module to handle very simple branch predication at IFU
//
// ====================================================================
`include "e203_defines.v"module e203_ifu_litebpu(// Current PCinput  [`E203_PC_SIZE-1:0] pc,// The mini-decoded info input  dec_jal,  //是否属于jal指令input  dec_jalr, //是否属于jalr指令input  dec_bxx, //是否属于bxx指令input  [`E203_XLEN-1:0] dec_bjp_imm, //用立即数表示的偏移量input  [`E203_RFIDX_WIDTH-1:0] dec_jalr_rs1idx, // The IR index and OITF status to be used for checking dependencyinput  oitf_empty,  //指示OITF是否为空input  ir_empty,    //指示IR寄存器是否为空input  ir_rs1en,    //指示IR寄存器中的指令的源操作数1是否使能input  jalr_rs1idx_cam_irrdidx, //// The add op to next-pc adderoutput bpu_wait,  output prdt_taken,  //分支预测方向output [`E203_PC_SIZE-1:0] prdt_pc_add_op1,  //生成PC的加法运算的操作数1output [`E203_PC_SIZE-1:0] prdt_pc_add_op2,  //生成PC的加法运算的操作数2input  dec_i_valid, // The RS1 to read regfileoutput bpu2rf_rs1_ena, input  ir_valid_clr,input  [`E203_XLEN-1:0] rf2bpu_x1, input  [`E203_XLEN-1:0] rf2bpu_rs1, input  clk,input  rst_n);// BPU of E201 utilize very simple static branch prediction logics//   * JAL: The target address of JAL is calculated based on current PC value//          and offset, and JAL is unconditionally always jump//   * JALR with rs1 == x0: The target address of JALR is calculated based on//          x0+offset, and JALR is unconditionally always jump//   * JALR with rs1 = x1: The x1 register value is directly wired from regfile//          when the x1 have no dependency with ongoing instructions by checking//          two conditions://            ** (1) The OTIF in EXU must be empty OITF:查询是否有长指令正在执行//            ** (2) The instruction in IR have no x1 as destination register//          * If there is dependency, then hold up IFU until the dependency is cleared//   * JALR with rs1 != x0 or x1: The target address of JALR need to be resolved//          at EXU stage, hence have to be forced halted, wait the EXU to be//          empty and then read the regfile to grab the value of xN.//          This will exert 1 cycle performance lost for JALR instruction//   * Bxxx: Conditional branch is always predicted as taken if it is backward//          jump, and not-taken if it is forward jump. The target address of JAL//          is calculated based on current PC value and offset// The JAL and JALR is always jump, bxxx backward is predicted as taken  assign prdt_taken   = (dec_jal | dec_jalr | (dec_bxx & dec_bjp_imm[`E203_XLEN-1]));  // The JALR with rs1 == x1 have dependency or xN have dependency//判断jalr指令的源操作数是否是x0或者x1、xnwire dec_jalr_rs1x0 = (dec_jalr_rs1idx == `E203_RFIDX_WIDTH'd0);wire dec_jalr_rs1x1 = (dec_jalr_rs1idx == `E203_RFIDX_WIDTH'd1);wire dec_jalr_rs1xn = (~dec_jalr_rs1x0) & (~dec_jalr_rs1x1);//如果RS1是x1,则判断OITF是否为空以及IR中是否有指令使用X1作为目标寄存器wire jalr_rs1x1_dep = dec_i_valid & dec_jalr & dec_jalr_rs1x1 & ((~oitf_empty) | (jalr_rs1idx_cam_irrdidx));//如果RS1是xn,判断OITF是否为空,IR是否为空wire jalr_rs1xn_dep = dec_i_valid & dec_jalr & dec_jalr_rs1xn & ((~oitf_empty) | (~ir_empty));// If only depend to IR stage (OITF is empty), then if IR is under clearing, or// it does not use RS1 index, then we can also treat it as non-dependency//如果IR不为空的话,判断IR中的指令RS1是否在被使用wire jalr_rs1xn_dep_ir_clr = (jalr_rs1xn_dep & oitf_empty & (~ir_empty)) & (ir_valid_clr | (~ir_rs1en));wire rs1xn_rdrf_r;//判断第一个读端口是否空闲,对xn的读取是否有资源冲突wire rs1xn_rdrf_set = (~rs1xn_rdrf_r) & dec_i_valid & dec_jalr & dec_jalr_rs1xn & ((~jalr_rs1xn_dep) | jalr_rs1xn_dep_ir_clr);wire rs1xn_rdrf_clr = rs1xn_rdrf_r;wire rs1xn_rdrf_ena = rs1xn_rdrf_set |   rs1xn_rdrf_clr;wire rs1xn_rdrf_nxt = rs1xn_rdrf_set | (~rs1xn_rdrf_clr);//使用DFF模块例化生成寄存器//使用标准的DFF模块例化的好处包括以下内容://便于全局替换寄存器类型;//便于在寄存器中全局插入延迟;//明确的load-enable使能信号(如下例的flg_ena)方便综合工具自动插入寄存器级别的门控时钟以降低动态功耗;//便于规避Verilog语法if-else不能传播不定态的问题。sirv_gnrl_dfflr #(1) rs1xn_rdrf_dfflrs(rs1xn_rdrf_ena, rs1xn_rdrf_nxt, rs1xn_rdrf_r, clk, rst_n);assign bpu2rf_rs1_ena = rs1xn_rdrf_set;//不满足消除数据依赖性,则置位bpu_waitassign bpu_wait = jalr_rs1x1_dep | jalr_rs1xn_dep | rs1xn_rdrf_set;//下一条PC地址的操作数1assign prdt_pc_add_op1 = (dec_bxx | dec_jal) ? pc[`E203_PC_SIZE-1:0]: (dec_jalr & dec_jalr_rs1x0) ? `E203_PC_SIZE'b0: (dec_jalr & dec_jalr_rs1x1) ? rf2bpu_x1[`E203_PC_SIZE-1:0]: rf2bpu_rs1[`E203_PC_SIZE-1:0];  //下一条PC地址的操作数2assign prdt_pc_add_op2 = dec_bjp_imm[`E203_PC_SIZE-1:0];  endmodule

E203取指模块——简单BPU模块的源码学习相关推荐

  1. Api demo源码学习(4)--App/Activity/Dialog --Activity以Dialog形式呈现

    这一节实际上比 Api demo源码学习(2)--App/Activity/Custom Dialog 自定义Activity样式  还要简单一些,在源码学习(2)里,也是让Activity以Dial ...

  2. python处理回显_Python中getpass模块无回显输入源码解析

    本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...

  3. vuex commit 模块_长篇连载:Vuex源码学习(二)脉络梳理

    前车之鉴 有了vue-router源码学习的经验,每次看认真钻研源代码的时候都会抽出一小段时间来大体浏览一遍源代码.大体了解这个源代码的脉络,每个阶段做了什么,文件目录的划分.下面我来带大家梳理一下V ...

  4. Opencascade源码学习之模型数据——TKGeomBase模块文件介绍

    Opencascade源码学习之模型数据--TKGeomBase模块文件介绍 1.AdvApp2Var 2.AppCont 3.AppDef 4.AppParCurves 5.Approx 6.Bnd ...

  5. 艾默生充电15kw+台达三相PFC源程序 艾默生充电桩15kw模块+台达三相PFC源码,软件源码加原理 图BOM

    艾默生充电15kw+台达三相PFC源程序 艾默生充电桩15kw模块+台达三相PFC源码,软件源码加原理 图BOM 艾默生充电桩15kw模块原版软件源码含核心算法,PFC+DCDC双DSP数字控制,原理 ...

  6. Opencascade源码学习之模型算法_TKO模块文件介绍

    Opencascade源码学习之模型数据_TKO模块文件介绍 1.TKO 1.BOPAlgo 2.BOPDS 3.BOPTools 4.BRepAlgoAPI 5.IntTools 1.TKO 1.B ...

  7. Java开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载) 说明:订单抽成指的是向卖家收取相应的信息服务费.(目前市场上有两种抽成方式,一种是按照总额的抽成比率,另外一种是按照订单明细的抽成比率 ...

  8. Java开源生鲜电商平台-支付模块的设计与架构(源码可下载

    Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android ...

  9. 菜鸟学源码之Nacos v1.1.3源码学习-Client模块(1):NacosNamingService初始化

    摘要: 本文是Nacos源码学习的第一篇,基于Nacos v1.1.3版本对Nacos源码进行学习,本片主要从exmaple的App示例入手,切入Nacos客户端NacosNamingService的 ...

  10. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

最新文章

  1. 科大奥锐干涉法测微小量实验的数据_光学干涉观测精确丈量宇宙 | 赛先生天文...
  2. linux 查看主板sn_如何使用您的工业边缘计算单元:第三章:使用你的JayBox 主板...
  3. Tableau必知必会之巧用 Index 函数查看数据类别详情
  4. 开发人员的新分布式基元
  5. leetcode994. 腐烂的橘子(bfs)
  6. 【数据结构与算法】二叉树
  7. list.size为1但是内容为null
  8. Lilypad Pondg(POJ-3171)
  9. POJ 3045 Cow Acrobats (最大化最小值)
  10. android文本框自动补全,[Android]AutoCompleteTextView自动补全文本框
  11. JQuery 常用积累(五)Datetimepicker和Lodop
  12. 机器学习基础算法24-SVM理论部分
  13. python图像颜色反转_OpenCV图像颜色反转算法详解
  14. 计算机网络(第七版)谢希仁
  15. 前端基础之HTML5音视频标签(video/audio)讲解
  16. 今日头条阅读量怎么刷_今日头条提升头条号阅读量的几大方法
  17. 【计算机组成原理】=【考研复试面试题】- 整合全家桶
  18. vue生命周期(超详解!)
  19. 金蝶云星空套打模板选横向打印输出仍是竖向解决方法
  20. linux python pexpect,Linux pexpect非root用户安装

热门文章

  1. 华为OD机试 - 对称美学(Java JS Python)
  2. 装黑苹果系统 VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测
  3. idea_提示大小写不敏感
  4. 02Hololens环境配置
  5. java 学习路线(dake....你恶心死我算了)
  6. 机器学习——numpy逻辑回归(手写数字识别)
  7. 中移链(基于EOS)实战:如何调用RPC接口组装交易、签名、上链以及查询上链结果
  8. jquery取消超链接
  9. 本科化学硕士计算机,2017年PayScale美国本科、硕士化学、计算机、商科专业薪水...
  10. 澳洲留学生考试挂科本科没有毕业如何化解尴尬