
risc-v
文章平均质量分 78
risc-v学习内容
newyork major
芯片蜉蝣
展开
-
RISC-V知识点目录
分支指令的方向预测_基于两位饱和计数器的分支预测。分支预测失败的处理_分支预测错误。超标量处理器中的分支预测实现。原创 2024-10-08 18:04:55 · 2146 阅读 · 0 评论 -
CPU指令融合技术概述
为了实现宏融合,fetch阶段预取到指令后,对指令进行扫描,如果连续两条指令的全部有效指令域,经优化可以由单独一条指令容纳,则将这两条指令融合成一条“融合指令”。已有指令的空闲指令域不多甚至没有;相邻的两条指令之间有数据依赖关系;原创 2024-10-11 16:56:34 · 564 阅读 · 0 评论 -
BTB结构分析
1. L1I的miss与BTB miss相比,谁带来的penaty更大?2. FTQ/Decode Q的深度,对处理器性能的影响;原创 2024-10-11 10:56:48 · 1410 阅读 · 0 评论 -
分支预测器的几个关键节点
训练过程,即训练过程中,各个关键参数是如何变化的; 预测过程,即是如何根据现有的信息,进行预测的; BTB/PHT/GHR等关键信息的update时刻; BTB/PHT/GHR等关键信息的update方式; 预测成功时,关键信号的变化; 预测失败时,关键信号的变化; 预测失败时,如何进行恢复;原创 2024-10-11 10:23:04 · 217 阅读 · 0 评论 -
TAGE-SC分支预测器
在昆明湖 TAGE-SC 预测器中,会同时得到 TAGE 和 SC 的预测结果 P1 和 P2,然后对他们的结果进行累加 P = P1+P2如果 P 的绝对值大于8bit 的阈值sc_bank_thres,则采用预测器结果 P;否则则采用 P1 作为最终预测结果。为了进行动态自适应,阈值sc_thres是需要是动态变化的。为此在实现上TAGE-SC使用了一个5bit的sc_bank_ctr计数器对阈值sc_bank_thres进行调整。原创 2024-10-10 17:12:46 · 944 阅读 · 0 评论 -
ITTAGE 分支预测算法
专门用来处理间接跳转分支指令的地址预测,其基本原理和TAGE predictor相同;原创 2024-10-10 14:47:01 · 1020 阅读 · 0 评论 -
TAGE-SC-L predictor
上一篇文章中介绍了TAGE预测器的基本结构以及算法,本文将会介绍TAGE的两种主要的变体,或者说是辅助预测器件,即对应的TAGE预测器变体则可以是TAGE-L/TAGE-SC/TAGE-SC-L;原创 2024-10-09 17:46:51 · 1235 阅读 · 0 评论 -
香山南湖架构分析--FE
阶段发现它的最后 2 bytes 是一条 RVI 指令的前半部分时,我们把这条 RVI 指令算在这个块里,同时我们取两个 cache line 的机制保证后半部分是一定可以被取到的,因此我们只需要在发生这种情况的时候置一个标识位,当下一个块来的时候把第一个 2 bytes 排除在指令的有效范围之外即可。一种多个不同延迟的预测器的组织形式,延迟大的、相对更准确的预测器被放在后面的流水级,其产生的预测结果会与前面的预测器进行比较,如果不同则会冲刷流水线,整体预测结果以最准确的预测器为准。原创 2024-10-09 16:02:27 · 1691 阅读 · 0 评论 -
Machine Mode下的Excp处理
有时需要在处理异常的过程中转到处理更高优先级的中断。mepc, mcause,mtval 和mstatus 这些控制寄存器只有一个副本,那么在处理第二个中断的时候,怎么处理这些寄存器呢?可抢占的中断处理程序可以在启用中断之前把这些寄存器保存到内存中的栈,然后在退出 之前,禁用中断并从栈中恢复寄存器。RISC-V中实现精确例外:保证异常之前的所有指令都完整地执行了,而后续的指令都没有开始执行(或等同于没有执行)机器模式最重要的特性是拦截和处理异常(不寻常的运行时事件)的能力。RISC-V将 异常分为两类。原创 2024-10-08 17:31:41 · 926 阅读 · 0 评论 -
经典5级流水线概述
这两个从右向左的数据流不会影响当前指令;只有当前指令以后的指令才会受到这种数据反向活动的影响。需要注意的是,第一个例外会导致数据冒险,而第二个会导致控制冒险。图中,Memory这一步,只有load/store会有,所以其他的指令都是pass掉的;原创 2024-10-08 16:22:48 · 1166 阅读 · 0 评论 -
处理器中的几种hazard
什么是hazard?Instructions interact with each other in pipeline ;Structural Hazard原因:An instruction in the pipeline may need a resource being used by another instruction in the pipeline ; Structural hazard occurs when two instructions need same hardwar原创 2024-10-08 12:10:18 · 1356 阅读 · 0 评论 -
RISC-V vector(1) --- vector的引入与register说明
在有些处理器中,会采用寄存器重命名的技术,比如超标量流水线处理器,在undisturbed策略下,必须从旧的物理目标向量寄存器中读取元素值,才能复制到新的物理目标寄存器中;也可以说,在新的物理寄存器进行重命名时,需要根据重命名映射表,查到原有的映射关系,然后把其中的元素值读出来,写到重命名后的对应元素。vl的宽度由最小元素宽度(SEW)和最大向量长度决定,其中SEW规定了指令执行元素的宽度,最小为8,最大向量长度为组成的最长的向量寄存器组,由VLMUL决定,最大为8。vxsat位在vcsr中有镜像。原创 2024-08-23 17:33:36 · 1524 阅读 · 0 评论 -
RISC-V中的acquire和release
RISC-V中,有两类原子操作指令:⚫ 内存原子操作(AMO)⚫ 加载保留/条件存储(load reserved / store conditional)此处我们先看下LR和SC指令;原创 2024-08-22 19:48:39 · 1032 阅读 · 0 评论 -
TAGE predictor
TAGE是现今最经典的分支预测算法,TAGE及其后续的变体都是当今高性能微处理器的分支预测算法基础。因此,要聊分支预测算法的话题必定绕不开TAGE。原创 2024-07-09 14:51:30 · 1624 阅读 · 0 评论 -
分支预测的地址跳转
因此,到目前为止,对于分支指令的目标地址的预测,有下面的三种方法。这些方式都是在取指阶段,利用pc值来进行;(1)使用 BTB 对直接跳转(PC-relative)类型的分支指令和 CALL 指令进行预测;(2)使用RAS对Return指令进行预测;(3)使用 Target Cache 对其他类型的分支指令进行预测。尤其是对于BTB和RAS, 几乎是现代的超标量处理器必须要使用的。原创 2024-05-24 15:44:17 · 1378 阅读 · 0 评论 -
浮点数的乘法处理
相应地,更新乘积的指数位为:(这里怎么理解?可以理解为,超出多少bit(2的幂次方),则小数点移位后,需要在阶码上增加幂次方)因为乘法会使得位数扩大,比如,两bit数相乘,最终得到最多4bit数,会超出浮点数的表示范围;这里的乘法,其实已经不涉及有符号数无符号数了,只需要做二进制的乘法就可以了;如果超出了浮点数的表示范围,则需要进行规格化,左移小数点,这会导致阶码增加;首先,我们可以得到乘积的符号位为负,因为两个乘数的符号位不同。这个比较好理解,有一个负数,就是负数,否则,就是正数;原创 2024-05-13 17:03:12 · 1025 阅读 · 0 评论 -
超标量之指令解码
2. 方式二,同分支指令,限制每个cycle可以家吗的指令个数,一旦在decode阶段发现乘累加指令,则只有该指令拆分出来的第一条指令,及其之前的指令可以进行解码,拆分后的第二条指令,以及之后的指令放到下一个cycle处理;MIPS指令中,乘法/乘累加是一类特殊的指令,因为他们有两个目的寄存器(Hi/Lo),这两个寄存器并不属于通用寄存器;1. 方式一,decode之后,rename之前,增加一级缓存,拆分出来的指令和正常不拆分的指令,都放到这个buffer中进行暂存,不好之处就是,会带来额外的面积开销;原创 2024-05-06 11:13:46 · 833 阅读 · 0 评论 -
浮点数的加法运算
---首先,数据的阶码位和尾数位,都需要转换成补码,这个比较好理解,计算机看不到有无符号数,只是对补码进行计算;------具体可以看这个帖子:溢出以及判断溢出的两种方法(单符号位和双符号位)_一位符号位判断溢出-优快云博客。----此处,我们采用双符号位的表示方式,即在数据的高2bit, 都是符号位:00 001, 00 011;----假设上述的x,y,都是补码,则x的阶码为:001, y的阶码为:011;----为什么要用双符号位?---因为可以通过符号位的变化,判断是否有溢出;原创 2024-04-18 14:43:54 · 2487 阅读 · 0 评论 -
RISCV指令集体系简读之RV32M
当发生除零操作时,不会触发异常,硬件会返回一个默认的特殊值,该特殊值由硬件设计确定。可以通过查看FS/FD寄存器查看是否发生除零操作,FS寄存器用于表示浮点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位将被设置为1。FD寄存器用于表示定点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位也将被设置为1。RV32M向RV32I中添加了整数乘法和除法指令;附录:除以零的行为;原创 2024-04-15 20:27:02 · 480 阅读 · 0 评论 -
RISCV指令集体系简读之RV32I
⚫ 一个指令,用于将大立即数加载到寄存器的高位,这样加载32位常量到寄存器只需要两条指令。⚫ 仅提供一种数据寻址模式(寄存器+立即数)和PC相对分支。⚫ 加载/存储字加上有符号和无符号加载/存储字节和半字。⚫ 所有操作都在寄存器之间(没有寄存器到内存的操作)⚫ 31个寄存器,全部32位宽,寄存器0硬连线为零。⚫ 所有算术,逻辑和移位指令都有立即数版本的指令。x0~x31, 其中x0固定为0;⚫ 32位字节可寻址的地址空间。⚫ 所有指令均为32位长。⚫ 立即数总是符号扩展。⚫ 无乘法或除法指令。原创 2024-04-15 19:54:02 · 1216 阅读 · 0 评论 -
指令集体系简读
同时,寄存器是一种更昂贵的东西,当时的处理器中无法放入数量比较多的通用寄存器,而且,随着通用寄存器个数的增多,会使指令当中需要更多的位数来对其进行编码,这样也会导致指令占用更多的位数,也就占用了更多的内存(这些原因在现在看起来似乎是很滑稽的,但是在那个年代却是真实存在的),这些原因都是导致处理器设计师会让一条指令中完成尽可能多的任务的原因,例如一条CISC指令“ADD[EAX],EBX”,可以完成从存储器中取数据,然后和寄存器中的数据进行运算,并将运算的结果写回存储器这样一系列的操作。原创 2024-04-12 18:00:20 · 1109 阅读 · 0 评论 -
超标量处理器中的分支预测实现
超标量的分支预测与标量分支预测的不同点: 在取指令时给出一个地址,会从 I-Cache 中取出多条指令,这些取出的指令组成了一个指令组(fetch group); 处理器会自动根据指令组中的指令个数,调整取指令的地址,用来进行下个周期的取指令。 因此超标量处理器中的取指令地址并不是连续的,每次增加的值等于指令组的字长,送入到I-Cache中取指令的地址其实只是指令组中第一条指令的地址而已。 如果此时仍旧只是使用取指令时的地址(也就是PC值)进行分支预测,那么就相当于只是对指令组中的第一条指令进原创 2024-04-12 15:03:13 · 435 阅读 · 0 评论 -
分支预测概述
分支预测本身是比较复杂的,不同的处理器有不同的实现方法,它是影响一款处理器性能高低的关键因素之一,需要在处理器设计的时候仔细进行权衡和折中,以便在硬件消耗、预测准确度和延迟(latency)之间找到一个平衡点。要进行分支预测,首先需要知道从I-Cache取出来的指令中,哪条指令是分支指令,这对于每周期取出多条指令的超标量处理器来说,更为不容易,需要从指令组(fetch group)中找出分支指令;执行阶段之前的全部指令都从流水线中清除(flush)对于超标量处理器来说,准确度高的分支预测更为重要;原创 2024-03-26 16:13:56 · 1209 阅读 · 0 评论 -
Mtime&Mtimecmp
与mtime对应的,还有一个mtimecmp寄存器;原创 2024-01-15 10:46:20 · 587 阅读 · 0 评论 -
Machine Trap Delegation Registers
M-mode产生的traps, 不能delegate到S-mode;但是,S-mode的traps, 可以delegate到S-mode, 也就是说,可以平级的delegate;实现了S-Mode的系统,medeleg/mideleg是必须实现的,如果设置了对应的bit, 可以。将s-mode/u-mode下的trap, 委托给s-mode处理,而不是m-mode;对于更低等级的level, medeleg应该是read-only zero的;没有实现S-mode的系统,可以不实现这两个寄存器;原创 2024-01-15 09:52:59 · 457 阅读 · 0 评论 -
Machine Interrupt Registers
如果interrupt通过mideleg寄存器,委托到S-mode, SIP/SIE寄存器才是可见的,否则,对应bit都是read-only zero的;如果s-mode没有实现,那么SEIP/STIP/SSIP/SEIE/STIE/SSIE都是read-only zero的;在实际实现时,如果中断可pending的话,mie对应bit都要设置成writable的;在实际实现的时候,mip中的bit可以设置为writable,或者read-only;M-mode的中断优先级是最高的;原创 2024-01-12 10:31:12 · 1008 阅读 · 0 评论 -
Excp/Trap/Int的一些简单说明
大部分的异常都会产生trap, except for floating-point exceptions, which, in the standard floating-point extensions, do not cause traps。异常是由当前正在执行的进程产生。异常包括很多方面,有出错(fault),有陷入(trap),也有可编程异常(programmable exception)。原创 2024-01-05 17:06:30 · 1038 阅读 · 0 评论 -
分支指令的方向预测
基于两位饱和计数器的分支预测方法并不会马上使用分支指令上一次的结果,而是根据一条分支指令前两次执行的结果来预测本次的方向,这种方法可以用一个有着 4 个状态的状态机来表示。对于分支指令来说,它的方向只有两个:发生跳转(taken)和不发生跳转(nottaken),因此可以用1 和0 来表示。这种方式,是考虑到某条分支指令,其taken与否,是。实际情况中,无法使用,因为每个PC一个PHT,占用的空间太大了;不行,此时的预测结果可能是错误的,不能进行更新;不行,因为OOO, 可能处于在错误的分支上;原创 2023-12-28 11:42:56 · 1939 阅读 · 0 评论 -
vsetvli/vsetivli/vsetvl
e. 从 vl 读取的值用作 vset{i}vl{i} 的 AVL 参数时会在 vl 中产生相同的值,前提是结果 VLMAX 等于读取 vl 时的 VLMAX 值。vset{i}vl{i} 指令根据参数设置 vtype 和 vl CSR,并将 vl 的新值写入 rd。ceil(AVL / 2) ≤ vl ≤ VLMAX 如果 AVL < (2 * VLMAX)如果 AVL ≥ (2 * VLMAX),则 vl = VLMAX。如果 AVL ≤ VLMAX,则 vl = AVL。原创 2023-12-26 11:54:48 · 2494 阅读 · 0 评论 -
处理器类型简介
多核处理器也称片上多核处理器(Chip Multi-Processor,CMP)。多核出现前,商业化处理器都致力于单核处理器的发展,其性能已经发挥到极致,仅仅提高单核芯片的速度会产生过多热量且无法带来相应性能改善,但CPU性能需求大于CPU发展速度。尽管增加流水线提高频率,但缓存增加和漏电流控制不力造成功率大幅增加,性能反而不如之前低频率的CPU。功率增加,散热问题也严重了,风冷已经不能解决问题了。那么新技术必须出现-多核处理器。早在1996年就有第一款多核CPU原型Hydra。原创 2023-12-26 10:14:34 · 1421 阅读 · 0 评论 -
浮点数的转换--IEEE 754
小数部分:0.1247,不断乘以2,取整数部分,00011111111011001..., 因为位数不够,进行截断;3. 将得到的数,表示成IEEE 754的格式,0.00101=1.01*2-3。这个数可能在32bits范围内,不能准确的表示出来,因此需要进行截位;⭘0.15625x2=0.3125 取整0。⭘0.31250x2=0.6250 取整0。⭘0.25000x2=0.5000 取整0。按照上面的公式,整数部分,127: 0111_1111;其中,E为阶码位,M为尾数部分,S为符号位;原创 2023-12-25 19:08:23 · 9189 阅读 · 0 评论 -
riscv中的异常简介
处理器在执行的过程中,除了分支类型的指令之外,很多其他的情况也可以打断程序的执行,这些情况统称为异常(exception);,从处理器外部看起来,产生异常的指令之前的所有指令都已经完成了,而这条产生异常的指令及其之后的所有指令都不允许完成。不同的指令集体系中,异常包括的内容也不尽相同,可以概括地将异常分为下面几种。对于一个特定的处理器来说,所有类型异常的处理过程是一样的。总能够找到哪条指令发生了异常。原创 2023-12-21 10:44:19 · 1109 阅读 · 0 评论 -
唤醒阶段的推测唤醒(2)
在这种方法中,指令被仲裁电路选中之后,会马上离开发射队列,但是它并不会消失,而是进入另外一个部件 Replay Queue(RQ)。原创 2023-12-19 11:15:37 · 466 阅读 · 0 评论 -
唤醒阶段的推测唤醒(1)
前文讲述的唤醒方法都是建立在一个前提下,即指令在 FU 中执行的周期数是可以预知的,这样才可以为这条指令分配一个确定的DELAY值,但是在实际的处理器中,很多指令需要的执行周期数是没有办法提前知道的。解决方式:当该指令执行完成时,再进行唤醒;原创 2023-12-18 17:24:40 · 1391 阅读 · 0 评论 -
超标量处理器的唤醒
唤醒是指被仲裁电路选中的指令将其目的寄存器的编号(简称为dst_tag)和发射队列中所有的源寄存器的编号进行比较,并将那些比较结果相等的源寄存器进行标记的过程(标记为ready状态)。原创 2023-12-18 15:31:34 · 1041 阅读 · 0 评论 -
issue阶段的选择电路的实现
1-of-M的仲裁电路 为什么要实现oldest-first 功能的仲裁呢? 这是考虑到越是旧的指令,和它存在相关性的指令也就越多,因此优先执行最旧的指令,则可以唤醒更多的指令,能够有效地提高处理器执行指令的并行度, 而且最旧的指令还占据着处理器中其他的资源,例如重排序缓存(ROB)和Store Buffer等部件,越早地执行这些旧的指令,就可以越早地释放这些硬件资源,供后面的指令使用。 年龄信息的追踪; 年龄信息指的是进入流水线的先后顺序; in-order处理器,先执行的原创 2023-12-18 14:20:36 · 697 阅读 · 0 评论 -
发射过程中的流水线
非数据捕捉结构的流水线 此种数据结构中,issue queue中的指令,要被FU执行,需要等到一下几个条件都成立: 这条指令所有的源操作数都准备好了; 这条指令能够从发射队列中被选中,即需要经过仲裁电路的允许才能够进行发射; 需要能够从寄存器、payload RAM或者旁路网络(bypassing network)中获得源操作数的值。 这三个条件是顺序发生的; wakeup: 源寄存器从没有准备好的状态,变成准备好的状态; 实现方式:通过bypass网络,或者PRF原创 2023-12-18 11:34:58 · 497 阅读 · 0 评论 -
issue queue的实现方式
在超标量处理器中,为了并行执行指令,一般都有很多的FU,例如有些FU负责整数的加减,有些FU负责存储器访问,有些FU负责乘除法运算等。对于超标量处理器来说,还需要考虑一个重要的事情,就是在流水线的哪个阶段读取寄存器的值,它直接决定了处理器中其他一些部件的设计。现代处理器的折中方式:使某几个FU共用一个发射队列;上述三种结构都是正交的,可以相互组合;原创 2023-12-15 18:04:37 · 1372 阅读 · 0 评论 -
ISSUE的基本概念
指令到了发射队列中之后,就不会再按照程序中指定的顺序在处理器中流动,只要发射队列中的一条指令的操作数都准备好了,且满足了发射的条件(具体的条件将在本章进行介绍),就可以送到相应的FU中去执行。对于乱序执行(out-of-order)的超标量处理器来说,只有少数指令,例如store指令或分支指令,才会使用顺序执行的方法,而对于大多数的指令,都是按照乱序的方式进行发射。ISSUE:将符合一定条件的指令从发射队列(IssueQueue)中选出来,并送到FU中执行的过程;原创 2023-12-15 17:37:38 · 1009 阅读 · 0 评论 -
risc-v system instruction
ecall 指令以前叫做 scall,用于执行环境的变更,它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能;简单来说,ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序其实都是相同格式的文件,最关键的区别就是程序执行的特权级别不同。所以 Syscall 的本质其实就是提升特权权限到内核模式,并跳转到操作系统指定的用于处理 Syscall 的代码地址。原创 2023-12-14 21:06:11 · 3793 阅读 · 0 评论