risc-v
文章平均质量分 75
risc-v学习内容
newyork major
芯片蜉蝣
展开
-
浮点数的乘法处理
相应地,更新乘积的指数位为:(这里怎么理解?可以理解为,超出多少bit(2的幂次方),则小数点移位后,需要在阶码上增加幂次方)因为乘法会使得位数扩大,比如,两bit数相乘,最终得到最多4bit数,会超出浮点数的表示范围;这里的乘法,其实已经不涉及有符号数无符号数了,只需要做二进制的乘法就可以了;如果超出了浮点数的表示范围,则需要进行规格化,左移小数点,这会导致阶码增加;首先,我们可以得到乘积的符号位为负,因为两个乘数的符号位不同。这个比较好理解,有一个负数,就是负数,否则,就是正数;原创 2024-05-13 17:03:12 · 242 阅读 · 0 评论 -
超标量之指令解码
2. 方式二,同分支指令,限制每个cycle可以家吗的指令个数,一旦在decode阶段发现乘累加指令,则只有该指令拆分出来的第一条指令,及其之前的指令可以进行解码,拆分后的第二条指令,以及之后的指令放到下一个cycle处理;MIPS指令中,乘法/乘累加是一类特殊的指令,因为他们有两个目的寄存器(Hi/Lo),这两个寄存器并不属于通用寄存器;1. 方式一,decode之后,rename之前,增加一级缓存,拆分出来的指令和正常不拆分的指令,都放到这个buffer中进行暂存,不好之处就是,会带来额外的面积开销;原创 2024-05-06 11:13:46 · 613 阅读 · 0 评论 -
浮点数的加法运算
---首先,数据的阶码位和尾数位,都需要转换成补码,这个比较好理解,计算机看不到有无符号数,只是对补码进行计算;------具体可以看这个帖子:溢出以及判断溢出的两种方法(单符号位和双符号位)_一位符号位判断溢出-CSDN博客。----此处,我们采用双符号位的表示方式,即在数据的高2bit, 都是符号位:00 001, 00 011;----假设上述的x,y,都是补码,则x的阶码为:001, y的阶码为:011;----为什么要用双符号位?---因为可以通过符号位的变化,判断是否有溢出;原创 2024-04-18 14:43:54 · 448 阅读 · 0 评论 -
RISCV指令集体系简读之RV32M
当发生除零操作时,不会触发异常,硬件会返回一个默认的特殊值,该特殊值由硬件设计确定。可以通过查看FS/FD寄存器查看是否发生除零操作,FS寄存器用于表示浮点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位将被设置为1。FD寄存器用于表示定点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位也将被设置为1。RV32M向RV32I中添加了整数乘法和除法指令;附录:除以零的行为;原创 2024-04-15 20:27:02 · 140 阅读 · 0 评论 -
RISCV指令集体系简读之RV32I
⚫ 一个指令,用于将大立即数加载到寄存器的高位,这样加载32位常量到寄存器只需要两条指令。⚫ 仅提供一种数据寻址模式(寄存器+立即数)和PC相对分支。⚫ 加载/存储字加上有符号和无符号加载/存储字节和半字。⚫ 所有操作都在寄存器之间(没有寄存器到内存的操作)⚫ 31个寄存器,全部32位宽,寄存器0硬连线为零。⚫ 所有算术,逻辑和移位指令都有立即数版本的指令。x0~x31, 其中x0固定为0;⚫ 32位字节可寻址的地址空间。⚫ 所有指令均为32位长。⚫ 立即数总是符号扩展。⚫ 无乘法或除法指令。原创 2024-04-15 19:54:02 · 676 阅读 · 0 评论 -
指令集体系简读
同时,寄存器是一种更昂贵的东西,当时的处理器中无法放入数量比较多的通用寄存器,而且,随着通用寄存器个数的增多,会使指令当中需要更多的位数来对其进行编码,这样也会导致指令占用更多的位数,也就占用了更多的内存(这些原因在现在看起来似乎是很滑稽的,但是在那个年代却是真实存在的),这些原因都是导致处理器设计师会让一条指令中完成尽可能多的任务的原因,例如一条CISC指令“ADD[EAX],EBX”,可以完成从存储器中取数据,然后和寄存器中的数据进行运算,并将运算的结果写回存储器这样一系列的操作。原创 2024-04-12 18:00:20 · 760 阅读 · 0 评论 -
超标量处理器中的分支预测实现
超标量的分支预测与标量分支预测的不同点: 在取指令时给出一个地址,会从 I-Cache 中取出多条指令,这些取出的指令组成了一个指令组(fetch group); 处理器会自动根据指令组中的指令个数,调整取指令的地址,用来进行下个周期的取指令。 因此超标量处理器中的取指令地址并不是连续的,每次增加的值等于指令组的字长,送入到I-Cache中取指令的地址其实只是指令组中第一条指令的地址而已。 如果此时仍旧只是使用取指令时的地址(也就是PC值)进行分支预测,那么就相当于只是对指令组中的第一条指令进原创 2024-04-12 15:03:13 · 273 阅读 · 0 评论 -
分支预测概述
分支预测本身是比较复杂的,不同的处理器有不同的实现方法,它是影响一款处理器性能高低的关键因素之一,需要在处理器设计的时候仔细进行权衡和折中,以便在硬件消耗、预测准确度和延迟(latency)之间找到一个平衡点。要进行分支预测,首先需要知道从I-Cache取出来的指令中,哪条指令是分支指令,这对于每周期取出多条指令的超标量处理器来说,更为不容易,需要从指令组(fetch group)中找出分支指令;执行阶段之前的全部指令都从流水线中清除(flush)对于超标量处理器来说,准确度高的分支预测更为重要;原创 2024-03-26 16:13:56 · 757 阅读 · 0 评论 -
Mtime&Mtimecmp
与mtime对应的,还有一个mtimecmp寄存器;原创 2024-01-15 10:46:20 · 366 阅读 · 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 · 341 阅读 · 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 · 883 阅读 · 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 · 798 阅读 · 0 评论 -
分支指令的方向预测
基于两位饱和计数器的分支预测方法并不会马上使用分支指令上一次的结果,而是根据一条分支指令前两次执行的结果来预测本次的方向,这种方法可以用一个有着 4 个状态的状态机来表示。对于分支指令来说,它的方向只有两个:发生跳转(taken)和不发生跳转(nottaken),因此可以用1 和0 来表示。这种方式,是考虑到某条分支指令,其taken与否,是。实际情况中,无法使用,因为每个PC一个PHT,占用的空间太大了;不行,此时的预测结果可能是错误的,不能进行更新;不行,因为OOO, 可能处于在错误的分支上;原创 2023-12-28 11:42:56 · 1194 阅读 · 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 · 1156 阅读 · 0 评论 -
处理器类型简介
多核处理器也称片上多核处理器(Chip Multi-Processor,CMP)。多核出现前,商业化处理器都致力于单核处理器的发展,其性能已经发挥到极致,仅仅提高单核芯片的速度会产生过多热量且无法带来相应性能改善,但CPU性能需求大于CPU发展速度。尽管增加流水线提高频率,但缓存增加和漏电流控制不力造成功率大幅增加,性能反而不如之前低频率的CPU。功率增加,散热问题也严重了,风冷已经不能解决问题了。那么新技术必须出现-多核处理器。早在1996年就有第一款多核CPU原型Hydra。原创 2023-12-26 10:14:34 · 961 阅读 · 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 · 1625 阅读 · 0 评论 -
riscv中的异常简介
处理器在执行的过程中,除了分支类型的指令之外,很多其他的情况也可以打断程序的执行,这些情况统称为异常(exception);,从处理器外部看起来,产生异常的指令之前的所有指令都已经完成了,而这条产生异常的指令及其之后的所有指令都不允许完成。不同的指令集体系中,异常包括的内容也不尽相同,可以概括地将异常分为下面几种。对于一个特定的处理器来说,所有类型异常的处理过程是一样的。总能够找到哪条指令发生了异常。原创 2023-12-21 10:44:19 · 458 阅读 · 0 评论 -
唤醒阶段的推测唤醒(2)
在这种方法中,指令被仲裁电路选中之后,会马上离开发射队列,但是它并不会消失,而是进入另外一个部件 Replay Queue(RQ)。原创 2023-12-19 11:15:37 · 381 阅读 · 0 评论 -
唤醒阶段的推测唤醒(1)
前文讲述的唤醒方法都是建立在一个前提下,即指令在 FU 中执行的周期数是可以预知的,这样才可以为这条指令分配一个确定的DELAY值,但是在实际的处理器中,很多指令需要的执行周期数是没有办法提前知道的。解决方式:当该指令执行完成时,再进行唤醒;原创 2023-12-18 17:24:40 · 1134 阅读 · 0 评论 -
超标量处理器的唤醒
唤醒是指被仲裁电路选中的指令将其目的寄存器的编号(简称为dst_tag)和发射队列中所有的源寄存器的编号进行比较,并将那些比较结果相等的源寄存器进行标记的过程(标记为ready状态)。原创 2023-12-18 15:31:34 · 861 阅读 · 0 评论 -
issue阶段的选择电路的实现
1-of-M的仲裁电路 为什么要实现oldest-first 功能的仲裁呢? 这是考虑到越是旧的指令,和它存在相关性的指令也就越多,因此优先执行最旧的指令,则可以唤醒更多的指令,能够有效地提高处理器执行指令的并行度, 而且最旧的指令还占据着处理器中其他的资源,例如重排序缓存(ROB)和Store Buffer等部件,越早地执行这些旧的指令,就可以越早地释放这些硬件资源,供后面的指令使用。 年龄信息的追踪; 年龄信息指的是进入流水线的先后顺序; in-order处理器,先执行的原创 2023-12-18 14:20:36 · 586 阅读 · 0 评论 -
发射过程中的流水线
非数据捕捉结构的流水线 此种数据结构中,issue queue中的指令,要被FU执行,需要等到一下几个条件都成立: 这条指令所有的源操作数都准备好了; 这条指令能够从发射队列中被选中,即需要经过仲裁电路的允许才能够进行发射; 需要能够从寄存器、payload RAM或者旁路网络(bypassing network)中获得源操作数的值。 这三个条件是顺序发生的; wakeup: 源寄存器从没有准备好的状态,变成准备好的状态; 实现方式:通过bypass网络,或者PRF原创 2023-12-18 11:34:58 · 386 阅读 · 0 评论 -
issue queue的实现方式
在超标量处理器中,为了并行执行指令,一般都有很多的FU,例如有些FU负责整数的加减,有些FU负责存储器访问,有些FU负责乘除法运算等。对于超标量处理器来说,还需要考虑一个重要的事情,就是在流水线的哪个阶段读取寄存器的值,它直接决定了处理器中其他一些部件的设计。现代处理器的折中方式:使某几个FU共用一个发射队列;上述三种结构都是正交的,可以相互组合;原创 2023-12-15 18:04:37 · 986 阅读 · 0 评论 -
ISSUE的基本概念
指令到了发射队列中之后,就不会再按照程序中指定的顺序在处理器中流动,只要发射队列中的一条指令的操作数都准备好了,且满足了发射的条件(具体的条件将在本章进行介绍),就可以送到相应的FU中去执行。对于乱序执行(out-of-order)的超标量处理器来说,只有少数指令,例如store指令或分支指令,才会使用顺序执行的方法,而对于大多数的指令,都是按照乱序的方式进行发射。ISSUE:将符合一定条件的指令从发射队列(IssueQueue)中选出来,并送到FU中执行的过程;原创 2023-12-15 17:37:38 · 459 阅读 · 0 评论 -
risc-v system instruction
ecall 指令以前叫做 scall,用于执行环境的变更,它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能;简单来说,ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序其实都是相同格式的文件,最关键的区别就是程序执行的特权级别不同。所以 Syscall 的本质其实就是提升特权权限到内核模式,并跳转到操作系统指定的用于处理 Syscall 的代码地址。原创 2023-12-14 21:06:11 · 1354 阅读 · 0 评论 -
TRAP概念及流程简介
Trap通俗一点来讲,就是由用户程序触发的操作系统用户态与内核态的切换.而在这几种情况中,很明显的,1和2都属于trap的范畴,而3则是一个中断的典型例子。trap涉及了许多小心的设计和重要的细节,这些细节对于实现安全隔离和性能来说非常重要。因为很多应用程序,要么因为系统调用,要么因为page fault,都会频繁的切换到内核中。所以,trap机制要尽可能的简单,这一点非常重要。当需要转入内核态时,我们最关心的自然是系统当前的状态。原创 2023-12-14 17:52:16 · 1050 阅读 · 0 评论 -
RISCV中的寄存器操作
控制状态寄存器指令 (csrrc、csrrs、csrrw、csrrci、csrrsi、csrrwi), 使我们可以轻松地访问一些程序性能计数器。对于这些 64 位计数器, 我们一次可以读取 32 位。这些计数器包括了系统时间, 时钟周期以及执行的指令数目。原创 2023-12-14 15:59:19 · 504 阅读 · 0 评论 -
issue unit
(什么时候删除,需要看实现,有的实现会提前唤醒,虽然已经issue了,但是可能replay);issue slot的内容如图所示,dispatch过来的uop将会存在这样一个entry中,其中p代表presence bit, 代表rs ready的意思;在这种场景下,issue queue不能删除这些speculatively issued的uops, 直到这些uops的推测状态,被resolved了;每个cycle, 每条指令都会向上移动,因此,最旧的指令,将会有最高的issue priority;原创 2023-12-14 10:14:34 · 959 阅读 · 0 评论 -
RV32/64 特权架构
唉,mepc, mcause,mtval 和 mstatus 这些控制寄存器只有一个副本,处理第二个中断的时候 如果软件不进行一些帮助的话,这些寄存器中的旧值会被破坏,导致数据丢失。可抢 占的中断处理程序可以在启用中断之前把这些寄存器保存到内存中的栈,然后在退出 之前,禁用中断并从栈中恢复寄存器。这两种新模式都比user mode有着更高的权限,有更多权限的模式通常可以使用权限较低的模式的所用功能,并且它们还有一些低权限模式下不可用的额外功能,例如处理中断和执行 I/O 的功能。原创 2023-12-13 16:54:10 · 1183 阅读 · 0 评论 -
处理器中store指令的处理
如果不想造成 Store Buffer 实际可用容量的降低,可以将那些已经退休的 store 指令存储在一个不同于Store Buffer的地方,这个地方可以称为Write Back Buffer,硬件会自动将Write Back Buffer 中的 store 指令写到 D-Cache 中,如图 10. 18 所示。要解决上面的问题,需要在store buffer中,增加一个状态位,标记store指令是否已经具备退休的条件;原创 2023-12-13 15:43:18 · 982 阅读 · 0 评论 -
处理器中断的处理
在 MIPS 处理器的术语中,异常(exception)是由处理器内部执行指令产生的,因此异常总是和某条指令是同步的;而中断(interrupt)指的是处理器外部产生的,它和处理器内部执行的指令没有必然的对应关系,因此称中断是异步的。正因为如此,对于中断的处理并不能按照处理异常的方式进行,一般来讲,有两种方式对中断进行处理。原创 2023-12-13 11:15:13 · 366 阅读 · 0 评论 -
处理器中异常的处理
只有当一条指令变为流水线中最旧的指令,也就是马上要退休的时候,才可以保证这条指令不处于错误的路径上,此时它的异常才是真正有效的。指处理器能够知道哪条指令发生了异常,并且这条发生异常的指令之后的所有指令都不允许改变处理器的状态,就好像这些指令从来没有发生过一样,这样在对这个异常处理完后,可以精确地进行返回,返回的地方可能有两种情况,可以返回到发生异常的指令本身、重新执行这条指令,也可以不重新执行这条发生异常的指令,而是返回到它的下一条指令开始执行。现代的处理器,都支持精确的异常,能够极大地简化软件的工作;原创 2023-12-13 11:01:53 · 1193 阅读 · 0 评论 -
分支预测失败的处理
由于现代的超标量处理器采用了很多预测的方法来执行指令,并不是流水线中所有的指令都可以退休(retire),例如当流水线中的某条分支指令发生了预测错误,或者某条指令发生了异常,那么在这条指令之后进入流水线的所有指令就不允许退休了;前端的状态恢复很快就可以完成,处理器此时可以从正确的地址开始取指令,这些被取出来的指令可以一直执行到流水线的重命名阶段之前,在这段时间内,后端的状态恢复也在继续。在backend阶段,最重要的恢复是RAT的恢复,此处只描述基于统一的PRF的RAT恢复;取指令、重命名甚至是执行。原创 2023-12-13 10:20:05 · 1006 阅读 · 0 评论 -
ROB&dispatch stage
这里讲了一个ROB的实现层面的问题,为了方便超标量的dispatch和commit, ROB实现的时候,是按照W组的buffer来做的,如图所示,其中W为dispatch和commit的宽度;原创 2023-12-12 19:56:50 · 342 阅读 · 0 评论 -
处理器的状态管理
在超标量处理器内部有两个状态,原创 2023-12-12 10:36:39 · 844 阅读 · 0 评论 -
ROB端口需求
采用ROB进行寄存器重命名的方式。少需要支持四个读端口。原创 2023-12-12 10:15:18 · 364 阅读 · 0 评论 -
ROB的结构与作用
在流水线的提交(Commit)阶段,之所以能够将乱序执行的指令变回程序中指定的顺序状态,主要是通过重排序缓存(Reorder Buffer, ROB)来实现的。一般情况下,在流水线的分发(Dispatch)阶段,每周期最多可以进入ROB的指令个数会等于ROB每周期最多可以退休的指令个数,这样可以保持流水线的畅通;原创 2023-12-11 19:56:39 · 568 阅读 · 0 评论 -
LSU介绍
LSU(Load Store Unit)是一个专门的执行单元,负责执行所有的加载(load)和存储(store)指令等,生成load和store操作的虚拟地址,并从内存中加载数据或将数据从寄存器中存储回内存。LSU里一般包括L1 D-cache、D-TLB、AGU、load queue、store queue等模块。原创 2023-12-11 11:55:25 · 939 阅读 · 0 评论 -
execution unit的概念与实现----AGU
*******************reading from 《超标量处理器设计》--姚永斌***************************如果处理器支持虚拟存储器,那么经过 AGU 运算得到的地址就是虚拟地址,还需要经过 TLB 等部件转化为物理地址,只有物理地址才可以直接访问存储器。顾名思义,AGU(Address Generate Unit)用来计算地址;原创 2023-12-11 11:37:57 · 397 阅读 · 0 评论 -
execution unit的概念与实现----ALU
这是一种最普通的 FU,所有的处理器都会有这个部件,它负责对整数类型的数据进行计算,得到整数类型的结果,它一般被称做ALU(Arithmetic and Logic Unit)加减法是最普通的算术运算了,但是不同的指令集直接影响着加减法的硬件实现,原创 2023-12-11 11:27:33 · 374 阅读 · 0 评论