【HDLbits--分支预测器简单实现】

news2025/3/15 15:00:27

HDLbits--分支预测器简单实现

  • 1 timer
  • 2.branche predicitors
  • 3.Branch history shift
  • 4.Branch direction predictor

以下是分支预测器的简单其实现;

1 timer

实现一个计时器,当load1’b1时,加载data进去,当load1’b0时进行倒计时;



module top_module(
	input clk, 
	input load, 
	input [9:0] data, 
	output tc
);
    //==timer logic
    reg[10 -1:0] timer;
    wire timer_clr;
    
    assign timer_clk = (load==0) && (timer==0);
    always @(posedge clk) begin
        if(load) begin
            timer <= data;
        end else begin
            if(timer_clk) begin
                timer <= 0;
            end else begin
                timer <= timer - 1; 
            end
        end
    end
    
    assign tc = (timer==0);
    

endmodule

2.branche predicitors

实现一个经典的分支预测器,通过其counter权重来实现;



module top_module(
    input clk,
    input areset,
    input train_valid,
    input train_taken,
    output [1:0] state
);
    localparam SNT = 2'b00;
    localparam WNT = 2'b01;
    localparam WT = 2'b10;
    localparam ST = 2'b11;
    
    reg[2 -1:0] cur_sta;
    reg[2 -1:0] nxt_sta;
    
    //==State transition
    always @(*) begin
        if(areset) begin
            nxt_sta = WNT;
        end else begin
            case(cur_sta)
                SNT: 
                    nxt_sta = (train_valid) ? (train_taken ? WNT: SNT): SNT;
                WNT:nxt_sta = (train_valid) ? (train_taken ? WT : SNT) : WNT;
                WT: nxt_sta = (train_valid) ? (train_taken ? ST : WT)  : WT;
                ST: nxt_sta = (train_valid) ? (train_taken ? ST : WT)  : WNT;
            default : nxt_sta = SNT;
        endcase
            
        end

    end
    
    //==State flop-flop
    always @(posedge clk or posedge areset) begin
        if(areset) begin
           cur_sta <= WNT; 
        end else begin
           cur_sta <= nxt_sta; 
        end
    end
	
    //==State output
    always @(*) begin
        state = cur_sta;
    end
endmodule

3.Branch history shift

在这里插入图片描述

题目理解
第一段:建立一个32bit移位寄存器
第二段:当predict_valid = 1时进行移位,将原寄存器数据向左移移位,predict_taken 填充最低位。
第三段:当train_mispredicted = 1时需要替换移位寄存器内数据并移位,使用train_history替换原本的数据并左移一位,,train_taken填充至最低位
第四段:优先级说明同时出现时train_mispredicted 优先级高
第五段:说明输出predict_history[31:0]是移位前的数据。
第六段:说明复位,异步复位


module top_module(
    input clk,
    input areset,

    input predict_valid,
    input predict_taken,
    output [31:0] predict_history,

    input train_mispredicted,
    input train_taken,
    input [31:0] train_history
);
    reg [32 -1:0] shift_reg;
    always @(posedge clk or posedge areset) begin
        if(areset) begin
           shift_reg <= 0; 
        end else begin
            if(train_mispredicted) begin
                shift_reg <= {train_history[30:0],train_taken};
            end else if(predict_valid) begin
                shift_reg <= {shift_reg[30:0],predict_taken};
            end else begin
               shift_reg <= shift_reg; 
            end
        end
    end

    assign predict_history = shift_reg;
    
endmodule

4.Branch direction predictor

构建一个具有 7 位和 7 位全局历史的 gshare 分支预测器,经过哈希处理(使用 xor)到 7 位索引。此索引访问一个包含 128 个条目的 2 位饱和计数器表(类似于pcCS450/counter_2bc).分支预测器应包含一个 7 位全局分支历史寄存器(类似于CS450/history_shift).

分支预测器有两组接口:一组用于执行预测,另一组用于执行训练。预测接口在处理器的 Fetch 阶段使用,用于请求分支预测器对正在获取的指令进行分支方向预测。一旦这些分支沿着管道进行并被执行,分支的真正结果就变得已知了。然后,使用实际的分支方向结果对分支预测器进行训练。

当请求对给定的分支预测 ( = 1) 时,分支预测器会生成预测的分支方向和用于进行预测的分支历史寄存器的状态。然后,更新预测分支的分支历史寄存器(在下一个正时钟边沿)。predict_validpc

当请求对分支进行训练 ( = 1) 时,将告知分支预测器正在训练的分支的分支历史记录寄存器值,以及实际分支结果以及分支是否为误预测(需要管道刷新)。更新模式历史记录表 (PHT) 以训练分支预测器,以便下次更准确地预测此分支。此外,如果被训练的分支被误判,也要在误预测的分支完成执行后立即将分支历史寄存器恢复到该状态。train_validpc

如果错误预测和预测(针对不同的、较年轻的指令)的训练发生在同一周期中,则这两个操作都将希望修改分支历史寄存器。发生这种情况时,训练优先,因为无论如何,被预测的分支都会被丢弃。如果同一 PHT 条目的训练和预测同时发生,则预测会在训练之前看到 PHT 状态,因为训练只会修改下一个正时钟边沿的 PHT。以下时序图显示了同时训练和预测 PHT 进入 0 时的时序。 第 4 周期的训练请求改变了第 5 周期的 PHT 入口状态,但第 4 周期的预测请求输出了第 4 周期的 PHT 状态,而没有考虑第 4 周期中训练请求的影响。

同时使用 PHT 条目 0 进行训练和预测123456789时钟train_validtrain_pc ^ train_history0train_takenPHT[0]123predict_validpredict_pc ^ predict_history0predict_taken火车预测一个bc




module top_module(
    input clk,
    input areset,

    input  predict_valid,
    input  [6:0] predict_pc,
    output predict_taken,
    output [6:0] predict_history,

    input train_valid,
    input train_taken,
    input train_mispredicted,
    input [6:0] train_history,
    input [6:0] train_pc
);
    //11 taken 10 weak-taken 01 weak-not-taken 00 not-taken
    reg pht1[127:0];//taken
    reg pht0[127:0];//w-taken
    wire [6:0]ad,ad2;

 	assign ad=train_history^train_pc;
 	assign ad2=predict_history^predict_pc;
    integer i;
    always@(posedge clk or posedge areset)
        if(areset)
            for (i=0; i<128; i=i+1) begin 
                pht1[i] <= 1'b0; 
                pht0[i] <= 1'b1; 
            end
    	else if(train_valid & train_taken)begin
        	if({pht1[ad],pht0[ad]}==2'b11)
            	{pht1[ad],pht0[ad]}<=2'b11;
        	else
        		{pht1[ad],pht0[ad]}<={pht1[ad],pht0[ad]}+2'b1;  //拿了很多次
   	 	end
    	else if(train_valid & ~train_taken)begin
        	if({pht1[ad],pht0[ad]}==0)
        		{pht1[ad],pht0[ad]}<=0;
        	else
            	{pht1[ad],pht0[ad]}<={pht1[ad],pht0[ad]}-2'b1;  //拿了次数减少
    	end
     	
    assign predict_taken=pht1[ad2];  //根据pht1[], hash概率taken
    always@(posedge clk or posedge areset)
        if(areset)
            predict_history<=7'b0;
    	else if(train_valid&train_mispredicted)
            predict_history<={train_history[5:0],train_taken};//用计算结果
        else if(predict_valid)
            predict_history<={predict_history[5:0],predict_taken};//用预测结果
    	
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux--操作系统/进程

ok&#xff0c;我们今天学习linux中的操作系统和进程 1. 冯诺依曼体系 我们常⻅的计算机&#xff0c;如笔记本。我们不常⻅的计算机&#xff0c;如服务器&#xff0c;⼤部分都遵守冯诺依曼体系。 内存是CPU和外设之间的一个巨大的缓存&#xff01; 截⾄⽬前&#xff0c;我们…

Java面试八股—Redis篇

一、Redis的使用场景 &#xff08;一&#xff09;缓存 1.Redis使用场景缓存 场景&#xff1a;缓存热点数据&#xff08;如用户信息、商品详情&#xff09;&#xff0c;减少数据库访问压力&#xff0c;提升响应速度。 2.缓存穿透 正常的访问是&#xff1a;根据ID查询文章&…

Web后端开发之Maven

Maven Mven是apache旗下的一个开源项目&#xff0c;用来管理和构建java项目的工具。 通过一小段描述信息来管理项目。 Maven的作用 1.依赖管理&#xff1a;方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09;&#xff0c;避免版本冲突问题 以前用某个jar包需要下载…

there are no enabled repos

我做了两个操作 第一个操作&#xff1a; 1.先在本地电脑&#xff0c;也就是在我们电脑的桌面上下载 https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo 2.在CentOS 创建etc文件夹 3在etc文件夹内创建yum.repos.d文件夹 4.将下载好的repo 黏贴到yum.repos.d…

OpenEuler-22.03-LTS上利用Ansible轻松部署MySQL 5.7

一、需求 使用ansible自动化部署mysql二进制部署mysql部署mysql并创建JDBC用户 二、环境信息 本文涉及的代码&#xff0c;配置文件地址&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1g6y 软件名称版本备注Ansible2.9.27All modules — Ansible Doc…

前端无限滚动内容自动回收技术详解:原理、实现与优化

文章目录 一、核心需求与技术挑战1.1 无限滚动的问题症结1.2 自动回收的三大目标 二、技术实现原理2.1 虚拟滚动核心机制2.2 关键技术指标 三、完整实现方案3.1 基础HTML结构3.2 CSS关键样式3.3 JavaScript核心逻辑3.3.1 滚动控制器3.3.2 动态尺寸处理 四、性能优化策略4.1 内存…

如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法

之前一直在 Mac 上使用 ISPC&#xff0c;奈何核心/线程太少了。最近想在 Ubuntu 上搞搞&#xff0c;但是 snap 安装的 ISPC不知道为什么只能单核&#xff0c;很奇怪&#xff0c;就想着编译一下&#xff0c;需要 Clang 和 LLVM。但是 Ubuntu 很搞&#xff0c;他的很多软件版本是…

【MySQL】表的约束(上)

文章目录 表的约束什么是表的约束空属性默认值列描述&#xff08;comment&#xff09;零填充&#xff08;zerofill&#xff09;主键 总结 表的约束 什么是表的约束 表的约束&#xff08;Constraints&#xff09;是数据库表中的规则&#xff0c;用于限制存储的数据&#xff0c…

静态分析技术:Jadx-GUI高级用法与模式识别

1. 深度反编译策略 1.1 多层级反混淆方案 代码恢复流程&#xff1a; graph TD A[混淆代码] --> B{符号恢复} B -->|字典匹配| C[变量重命名] B -->|类型推导| D[参数重构] C --> E[控制流优化] D --> E E --> F[语义化输出] 反混淆脚本示例&…

30天学习Java第六天——Object类

Object类 java.lang.Object时所有类的超类。Java中所有类都实现了这个类中的方法。 toString方法 将Java对象转换成字符串的表示形式。 public String toString() {return getClass().getName() "" Integer.toHexString(hashCode()); }默认实现是&#xff1a;完…

【C语言】编译和链接详解

hi&#xff0c;各位&#xff0c;让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理&#xff08;预编译&#xff09;1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…

DataWhale 速通AI编程开发:(基础篇)第1章 环境下载、安装与配置

课程地址&#xff1a;Datawhale-学用 AI,从此开始 vscode 更新为最新版 目前绝大多数deepseek非官方渠道均兼容openai的api格式&#xff0c;这里以硅基流动为例进行演示&#xff0c;其他非官方渠道同理。 点击链接注册账号之后&#xff0c;点击“实名认证“完成实名&#xff0…

本地知识库RAG总结

目录 RAG流程: 知识库的要求&#xff1a; 知识抽取&#xff1a; 知识存储: 向量化: 知识检索: 应用客户端: RAG智能问答应用几个痛点&#xff1a; 如何提升召回率改进思路&#xff1a; 如何提升回答专业性&#xff1a; RAG评测&#xff1a; 总结&#xff1a; 参考…

torch_geometric 安装

环境监测&#xff1a; import torch print(torch.__version__) # 查看pytorch安装的版本号 print(torch.cuda.is_available()) # 查看cuda是否可用。True为可用&#xff0c;即是gpu版本pytorch print(torch.cuda.get_device_name(0)) # 返回GPU型号 …

网页打印很简单!用web打印插件lodop轻松实现文件打印

最近&#xff0c;给客户发一个事件提醒软件&#xff0c;其中客户要求实现打印功能&#xff0c;因为是用asp.net mvc 开发首先考虑到用水晶报表来实现&#xff08;crystalReport&#xff09;&#xff0c;以前开发c# winform程序&#xff0c;感觉水晶报表还是蛮好的&#xff0c;但…

北京迅为iTOP-RK3568开发板OpenHarmony系统南向驱动开发实操-HDF驱动配置LED

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

驻场运维服务方案书(Word文件)

目 录 第一章 背景分析 1.1. 项目背景 1.2. 项目目标 1.3. 系统现状 1.3.1. 网络系统 1.3.2. 设备清单梳理 1.3.3. 应用系统 第二章 需求分析及理解 2.1. 在重要日期能保障信息系统安全 2.2. 信息系统可长期安全、持续、稳定的运行 2.3. 提升发现安全问题、解决安全…

【时时三省】(C语言基础)用printf函数输出数据2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 格式字符 在输出时&#xff0c;对不同类型的数据要指定不同的格式声明&#xff0c;而格式声明中最重要的内容是格式字符。常用的有以下几种格式字符。 ( 1 ) d格式符。用来输出一个有符号的…

django框架 [面试篇]

Django 是一个基于 Python 的web框架&#xff0c;遵循"快速开发&#xff0c;不重复造轮子(dont repeat yourself)"的原则&#xff0c;帮助用户构建web应用。 而 Django 它本身提供了一些全栈式的一些组件&#xff0c;包括了 ORM&#xff0c;模板引擎&#xff0c;表单…

信息学奥赛一本通 1449:【例题2】魔板

题目 1449&#xff1a;【例题2】魔板 分析 首先注意&#xff1a;输入是按顺时针给出的&#xff0c;但我们处理时需要按正常顺序排&#xff0c;可以用以下代码读入 string s(8, 0); // 初始化全零字符串 cin>>s[0]>>s[1]>>s[2]>>s[3]; cin>>…