中央处理器CPU是计算机系统的核心,由运算器和控制器组成,完成数据的计算和处理,控制整个计算机系统的运行。处理器的设计过程需要明确使用的指令集架构。
精简指令集RISC:
指令数少,指令长度固定,除了乘除法和访存指令等长指令,大部分指令可以在一个周期内执行,使得架构设计的处理器具有较高的运行频率,设计成本降低。
RISC-V指令集:
流水线架构
流水线的深度越深,寄存器使用的数量增加,从而加大处理器设计的面积,消耗更多的资源。
处理器流水线之间的每一级信号传递都会进行握手,握手就会导致流水线最后一级产生反压信号,反压信号可能会干扰流水线第一级,从而带来时序上的问题。
因为指令集包含一些特殊的跳转指令,流水线加深会导致处理器在取值IF阶段无法判断指令是否跳转,虽然可以通过预测的方式在取值阶段判断是否跳转,但因为流水线加深,等到最后流水线实际结果出来后,对比发现实际结果可能与预测的结果不符,则意味着预测失败。只能将预测的指令流全部抛弃,从而导致功耗和性能下降,流水线越深,意味着代价和损失更大。
正面: 流水线深度,带来吞吐率的增大,主频升高。
负面: 随之带来反压问题,功耗和面积增大
经典五级流水线: 取值,译码,执行,访存,写回。
通过指令为读写指令,则通过镀锡控制单元LSU访存数据寄存器完成第四级流水线访存,流水线第五级位写回,将最终结果写回目标寄存器中。
分支预测
分支预测是为了保证处理器在执行一些跳转指令时,提前预测跳转指令的方向和地址,避免处理器在执行完之后再进行下一步操作所造成流水线周期的浪费。
无条件跳转指令,jal和jalr。作用是子程序调用和返回,在进行子程序调用的时候,jal指令的目的寄存器存放子程序返回的地址。跳转的目标地址从指令编码的立即数中计算出来。jalr指令可以将jar指令的目标寄存器用于该指令的基地址寄存器,从而完成子程序的返回。
jal: 20位有符号数立即数作为偏移量,偏移量乘以2,然后与当前指令所在的地址相加,生成得到最终的跳转目标地址。同时将下一条指令的PC值写入结果寄存器。
处理器流水线中,因为在取值阶段无法判断出有条件跳转指令是否满足条件,而无法决定是否跳转,只能等执行完成后才能确定是否跳转,处理器也将长时间处于等待期,从而造成大量流水线的空档期,影响处理器的性能。
为了解决这一问题,提高处理器性能,一般都会在处理器取值单元采用分支预测技术,该技术对分支跳转指令进行方向和目标地址的预测。
分为静态预测和动态预测。静态预测,预测分支不发生跳转,取值单元按顺序去下一条指令,等待执行阶段完成后确定是否满足跳转条件,满足条件则会冲刷流水线重新取值,但为了降低冲刷流水造成的性能降低。
另一种静态预测的方法是BTFN,对向后的跳转则预测为跳,对向前的跳转则预测为不跳。
针对分支预测,分支预测采用静态预测。对于向后跳转的条件分支指令预测为真的跳转。对于向前跳转的条件分支指令预测则不需要跳转。向后的跳转是指跳转的目标地址PC值比当前分支指令的PC值要小。
流水线中的冒险
流水线处理器在同一时钟脉冲中处理多个指令,这些指令中的每一个都在处理器的不同阶段中分别进行处理。这些阶段就像独立的的单元,它们一起同步工作以产生总体结果。必须及时评估每条指令并产生正确的结果。 统一周期正在执行的指令之间存在一些冲突: 结构冲突、数据数据冲突。
1 硬件冲突,处理器的流水线硬件资源的不足而产生的冲突,例如在流水线的执行阶段,该指令正在占用时间周期很长的乘法器计算单元,下一条指令单元也需要乘法器计算单元,则存在硬件资源的上的冲突,一般的解决方法,将一个切分成更小的stage或对设计相同功能的硬件。总之是让硬件资源够用。
2 数据冲突,在流水线处理器中,在任何给定的时间实例中,都会在不同阶段处理多个指令,并且所有这些指令的结果都只会在回写阶段在通用寄存器集中进行更新。 因此如果通用寄存器集中读取了柳树西安中后续指令任何操作数的值,该通用寄存器集的值在先前指令中计算,则后续指令可能会得到不正确的值,到此时,前面的指令可能尚未用正确的值更新通用寄存器组。这将进一步导致错误的结果。 这种危害称为数据冲突,由于嵌入指令数据的依赖性造成的数据冲突。有三种。
RAW 先写后读 相关性。
WAW先写后写 相关性。
WAR 先读后读写 相关性。
RAW先写后读为真数据相关,即在同一时钟内,流水线中后续指令需要从通用寄存器集中读取前指令计算的结果,为了降低因等待流水线停顿而造成性能的损失,可以使用数据旁路传播技术来解决。 WAW WAR可以通过寄存器重命名技术来消除。
总线协议
为了保证整个SOC内部处理器核和各IP模块间能够快速且合理的进行数据交互,计算机的性能高度依赖于总线互联设计。合理的系统总线会影响内存与处理器之间或外围配件与内存之间的传输,高级微控制器总线体系结构AMBA,规范定义了高性能微控制器片上通信标准。
AXI用于高性能应用,AHB相对AXI用于低功耗的嵌入式领域,但因为其局限性,无法添加流水线级数以及相对负责的握手协议。
蜂鸟E203设计了ICB总线。结合AXI和AHB的优点。
AXI有5个独立的通道,读地址 读数据 写地址 写数据 写响应。
主从设备间的独立的通道都是单方向的。在读地址通道中,每一个数据传输都有地址和控制信息,用来描述传输数据的性质。
AHB,共用读写地址,传输速率要低,占用资源少。 AHB总线由主机,从机,设备3个部分组成。
ICB总线协议
主要用于访存ITCM(指令存储器) 数据位宽为64位,BIU(通用总线接口)数据位宽为32位。
ICB总线协议采用地址区间寻址与其他模块进行数据传输,在取指单元中会根据PC值对访问的存储地址进行判断,该处理器主要的存储地址为内部存储器ITCM和通用总线接口BIU相连的外部存储器。 可以支持任意的主从数目相连接。
同AXI,采用分离的地址和数据。
同AHB,读写操作都会在地址通道上产生地址,而非像AXI只产生起始地址,不支持乱序返回和乱序完成,必须顺序返回结果。
ICB,读和写共用地址通道和共用结果返回通道。地址和数据分离传输。
五级流水线
取指,为了能够快速且连续不断的取指,在取指单元微架构中,设计了指令预处理模块和分支预测模块。 译码,得到操作数和操作码,从通用寄存器中读取数据,以及获得控制信息,进入下一级流水线,第三级流水线为指令执行,包括ALU计算单元,乘除法单元,访存地址生成单元,控制和状态寄存器CSR读写控制单元,执行阶段根据操作码不同,选择不同的执行单元,最终对所选的执行单元的结果进行写回。 如果指令是读写指令,则通过读写控制单元LSU访存寄存器完成第四级流水线访存,流水线第五级为写回,将最终的结果写回目标寄存器。
五级流水线的冒险处理
流水线深度越深,处理器的时钟周期可以更短,带来主频和处理器吞吐量的提升,但也不可避免带来流水线冒险的问题,针对结构冒险,数据冒险和控制冒险。
五级流水线采用相应的处理机制来应对。
对于结构冒险,单周期处理器无法同时支持多条指令的执行,只能通过等待一个时钟周期,执行下一条结构冲突的指令。
对于数据冒险,五级流水线设计旁路电路的设计,对于普通顺序执行指令之间的冒险,第一条读指令的目标寄存器与第二条的加法指令以及第三条逻辑或用到的s0寄存器存在数据冲突。采用数据旁路设计,将访存的数据通过旁路电路将结果直接转给下一条指令。避免阻塞流水线的方式带来的性能下降。
对于条件分支跳转指令因为预测错误所带来的控制冒险问题,通过流水线冲刷电路解决
数据冒险,采用旁路电路。 RAW先写后读的数据相关性
对于跳转指令,分支预测,静态预测,满足条件则会冲刷流水线重新取值。
对于分支跳转,流水线冲刷后续指令,发送NOP指令
控制冒险,当前流水线中执行的指令为分支跳转指令,但执行的结果与分支预测模块预测的结果不同,执行的结果需要跳转到目标寄存器,意味着之前的预测错误。而后面的指令已经完成了取值和译码,产生了控制冒险,需要流水线冲刷将错误指令的信息舍弃。
流水线设计
取指单元架构主要包括PC生成模块,预处理模块,分支预测模块,以及指令寄存器ITCM和PC寄存器。
PC生成模块对当前指令的预处理以及简单的分支预测模块而计算出下一条指令的PC值,能够有效避免跳转指令引起的流水线冲刷带来的性能损失。对于分支跳转指令,取指单元设计了预译码单元,和分支预测单元。这种设计避免了跳转指令所造成的流水线冲刷带来的性能浪费。当遇到无条件跳转指令,分支预测模块可以计算出下一套指令的PC地址,下一条指令PC值,而真正的条件判断在执行阶段得知,如果预测正确,将不会流水线冲刷,有效避免冲刷带来的损失。
RISC-V指令集架构包含32位指令和16位压缩指令,以混合形式存在64位指令寄存器ITCM中,为了在取值阶段快速取值,处理器存储的设计使用单周期访问速度最快的SRAM作为ITCM。DTCM完数据存储。 几十KB大小即可。
64位的ITCM存放在RISC-V指令时不可避免的存在指令非对齐问题。采用剩余缓存技术解决。
对于对齐指令。对于32位指令,下一条指令位PC+4,16位,PC+2。
对于非对齐指令,需要一个寄存器将当前ITCM输出的高16位存入,等下次ITCM读数时,将低16位存入,组成完整的32位指令。
该模块还对PC地址区间进行判断,如果地址区间对应不是ITCM,则会通过BIU控制总线的ICB接口对外部存储器进行访问。
分支预测模块和 预译码模块
预译码模块,读取部分信息,用于区分指令类型。再通过模块分支预测进行PC目标地址计算,最终根据译码信息和分支预测的信息在PC生成模块进行下一级PC的生成。
译码
CRS 用于记录和配置处理器流水阶段的运行状态。
执行 EXU
执行单元包括 ALU逻辑运算单元,状态寄存器单元CSR,访存地址生成单元LSU,以及乘除法器。
ALU主要完成逻辑运算,加减法,以及移位。并对分支跳转指令的预测结果比较。ALU主要包括移位电路,加减电路以及比较电路。
对于条件分支跳转指令,虽然在取指阶段进行了简单的静态预测,进行跳转的判断,但实际跳转结果需要经过比较电路才能确定是否需要跳转。 如果满足预测结果,则不进行流水线冲刷,如果实际结果与预测结果不一致,则进行流水线冲刷,产生新的PC地址。
对于流水线的冲刷,除了跳转指令的预测结果错误外,中断和异常也会造成流水线的冲刷。
CSR单元包括CSR寄存器组和CSR读写控制模块。CSR读写控制模块完成CSR读写指令的操作。
旁路电路
旁路电路单元的设计让前序指令的计算结果 能够快速传递给后序相关指令的操作数,因为该处理器按照顺序单发射,顺序写回设计策略,在相关性检查中WAW和RAW。
针对访存load sotre指令,在执行单元设计访存指令地址生成器AGU,主要负责访存指令的目标寄存器地址生成。该单元电路实现通过调用ALU指令运算器,进行逻辑运算,加减法以及移位等操作生成访存地址,并且对生成的访存地址进行判断。判断地址是否对齐。
如果地址不对齐,则产生异常标志传送给异常检查模块。
写回 优先级仲裁
将指令的运算结果写回指定的目标通用寄存器。对于存储器读指令将访存阶段从存储器读出来的数据写回寄存器,对于写回模块的设计追求更小面积和较好的性能,采用指令的写回优先级设计理念。
顺序指令和顺序写回。对指令的单周期执行和多周期执行的指令(比如load/store 和乘除法指令). 在写回阶段优先级仲裁。
写回模块的数据源有ALU执行结果和长周期指令执行结果。
长指令的写回比单周期指令的写回具有更高的优先级。
在没有长指令时,单周期指令的结果可以任意写回寄存器组中。
长指令写回仲裁,需要解决数据相关性问题,设计了相关性检查模块,该模块包含FIFO。
访存以及存储系统
多级cache缓存,加快处理器和主存间的数据传输速度。
采用TCM,是一种高速缓存集成在CPU芯片中的存储设计。
TCM有ITCM和DTCM。
主要存储模块设计包括ITCM,DTCM,通用寄存器组,以及提供对外存储器接口。
异常处理机制
CSR指令,并将同步异常和异步异常。 异步异常是外部中断引起的,同步异常是指在执行程序指令流时而发生的异常。
异步异常时,处理器便会停止执行当前程序流,转而执行CSR寄存器中mtvec中的pc地址开始流水线工作。
两组ICB总线接口,分别来自取指单元以及LSU模块需要对外部存储器进行访问。在BIU中对这两组总线接口进行汇合,并采用优先级仲裁的机制进行优先选择。
私有外设接口 UART SPI IIC GPIO以及PWM,ROM
xilinx artix A7开发板。