调试机制
对于处理器的调试功能而言,常用的两种:“交互式调试”、“追踪调试”。
交互式调试是指调试器软件(如GDB)能够直接对处理器取得控制权,进而对其以一种交互的方式进行调试,譬如
•下载或者启动程序
•通过设定各种特定条件来停止程序
•查看处理器的运行状态。包括通用寄存器的值、存储器地址的值等
•查看程序的状态。包括变量的值、函数的状态等
•改变处理器的运行状态。包括通用寄存器的值、存储器地址的值等
•改变程序的状态。包括变量的值、函数的状态等
交互性调试缺点:对处理器的运行具有打扰性。
跟踪调试,即调试器只跟踪记录处理器执行过的所有程序指令,而不会打断干扰处理器的执行过程。要记录所有指令(处理器速度快),对处理速度要求,数据压缩、传输和存储都是极大的挑战,通常只在高端的处理器中使用。
进入调试模式时
•将处理器PC跳转到0x800地址
•将处理器正在执行的指令PC保存到CSR寄存器dpc中
•将引发进入调试模式的触发原因保存到CSR寄存器dcsr中
•Debug Host为主机PC端的调试平台
调试中断处理
调试中断作为一根输入信号输送给处理器的交付(Commit)模块
•交付模块接收来自调试模块的一根中断信号的请求,由于中断是一种异步异常,这种中断异常的“发生指令PC”将会由当前正在交付的指令承担,dpc寄存器中更新的PC值即为当前正在交付指令(来自ALU接口)
•调试一旦被接受,变化冲刷流水线,将后续的指令取消掉,并向IFU模块发送冲刷请求和重新取指的PC,值为0x800,用以重新从新的PC地址开始取指令
低功耗的诀窍
软件层面低功耗
软件层面的灵活性很高,其发掘低功耗的效果比硬件低功耗本身的效果更佳显著。
一套好的软件程序应该尽可能合理地调用处理器的硬件资源,譬如
•尽在关键的场景调用功耗高的硬件,在一般场景尽可能使用耗能低的硬件
•在处理器空闲的时刻,尽可能进入低功耗休眠模式
系统层面低功耗
设计硬件系统和芯片的SoC系统,常见低功耗技术
•SoC中划分不同的电源域,能够支持将SoC中的大部分硬件关闭电源
•SoC系统中划分不同的时钟域,能够支持小部分电路以低速低功耗的方式运行
•使用PMU控制进入或者退出不同的低功耗模式
•软件使用PMU功能
处理器层面低功耗
(1)指令集定义休眠指令
(2)深度休眠和浅度休眠
•浅度休眠将处理器时钟关闭,但不关闭电源
•深度休眠关闭时钟、电源
(3)处理器深度休眠断电后,其内部上下文状态可以有两种策略进行保存恢复
一:在处理器内部有低功耗维持能力的寄存器或者SRAM
二:使用软件的保存恢复机制
(4)处理器架构使用异构的方式
寄存器层面低功耗
(1)时钟门控
(2)减小翻转
(3)数据通路不复位
SRAM层面低功耗
(1)选择合适的SRAM(形状,单双口)
(2)尽量减少SRAM读写
(3)空闲时关闭SRAM
•空闲时关闭SRAM的时钟,以节省功耗
•省电模式下,关闭SRAM电源
组合逻辑层面低功耗
(1)减小面积
(2)减小翻转率
蜂鸟E200划分为3个时钟域
蜂鸟E200划分为3个电源域
蜂鸟 E200 处理器核从各个层面使用严谨的方法进行低功耗设计,不逊色于任何其他商用的处理器核 IP 。
RISC-V可扩展协处理器
异构计算:是指不同指令集架构的集中处理器组合在一起进行运算。
典型的例子:CPU+GPU,CPU侧重于通用的控制和计算,GPU侧重于专用的图像处理。
RISC-V架构定义的标准指令集仅使用了少部分的指令编码空间,更多的指令编码空间被预留给用户作为扩展指令使用。
由于RISC-V 架构支持多种不同 的指令长度,不同的指令长度均预留有不同的编码空间 。
•每个指令的编码空间,除了用于寄存器操作数的索引之外,还剩余众多位的编码空间,对于这些没有使用的编码空间,用户均可以加以利用。
•另外对于某些特定的处理器实现,由于其往往不会实现所有的指令类型,对于没有实现的指令类型的编码空间,用户也可以加以利用。
•有一些没有定义的指令类型组,用户也可以加以利用。
EAI(Extension Accelerator Interface)
EAI指令编码格式如下
(1)0位到6位为opcode编码端,根据RISC-V中的编码规则使用custom-0,custom-1,custom-2,custom-3指令组
(2)xs1、xs2和cd比特跟别用于控制是否需要读源寄存器 rs1、rs2和写目标寄存器rd。
•如果xs1位的值为1,则表示该指令需要读取由rs1比特位索引的通用寄存器作为源操作数1;如果xs1位的值为0,则表示该指令不需要源操作数。xs2同理。
•如果xd为1,则表示该指令需要写回结果至由比特rd比特位指示的目标寄存器;如果xd位的值为0,则表示该指令无需写回结果。
(3)指令的25-31bit为funct7空间,可作为额外的编码空间,用于编码更多的指令,因此一种Custom指令组可以使用funct7区间编码出128条指令。则 4 组 Custom 指令组共可 以编码出 512 条两读一写(读取两个源寄存器 , 写回一个目标寄存器) 的协处理器指令。如果有的协处理器指令仅读取一个源寄存器,或者无须写回目标寄存器, 则可以使用这些无用的比特位(譬如 rd 比特位)来编码出更多的协处理器指令。
EAI分为四个通道:
•请求通道:主要用于主处理器在EXU级将指令信息和源操作数派发给协处理器
•反馈通道:主要用于协处理器反馈主处理器告知其已经完成了该指令,并将给过写回主处理器
•存储区请求通道:主要用于协处理器向主处理器发起存储器读写操作
•存储器反馈通道:主要用于主处理器向协处理器返回存储器读写结果
EAI流水线接口
EAI执行过程如下
•主处理器的译码在EXU级对指令的opcode进行译码,判断其是否属于任意一种Custom指令组
•如果主处理器译码判断该指令属于Custom指令,则继续依据指令编码的xs1和xs2位判断是否需要读取源寄存器,如果需要读取,则在EXU级读取通用寄存器组读出源操作数
•主处理器会维护数据依赖的正确性,譬如改指令需要读取的元寄存器与之前正在执行的某条指令存在着RAW的依赖性,则处理器流水线会暂停直至改RAW解除。写回同理
•经过上述步骤后,主处理器在EXU级通过EAI接口的请求通道派发给外部的协处理器,派发的信息包括指令的编码信息、两个源操作数的值和该指令的派发标号(Dispatch ITag)。蜂鸟E200是“乱序执行,顺序写回”,因此该派发标号主要用于追踪指令的派发顺序,协助处理器收到ITag后需要携带改ITag,直至写回结果并连同ITag返还给主处理器。
•协处理器通过请求通道收到指令之后,需对指令做进一步的译码,并进行实际的执行操作。
•协处理器在完成执行后,通过EAI接口的反馈通道将结果反馈给主处理器。
•主处理器在收到反馈通道的反馈结果之后,则将此次指令从流水线中退役并将结果写回Regfile(如果有写回需求)。蜂鸟E200最多支持不超过4条以上的滞外指令
EAI存储器接口
在处理器的LSU(Load Store Unit)为EAI协处理器预留了专用的访问接口。因此基于EAI接口的协处理器可以访问主处理器能够寻址的数据存储器资源,包括ITCM、DTCM、系统存储总线、系统设备总线以及快速IO接口等。
EAI指令访问存储器资源的实现如下。
•主处理器的LSU为EAI协处理器预留的专用访问通道基于ICB总线标准
•为了防止后续指令访问存储器和WAI协处理器访问存储器行程竞争死锁。协处理器在接收到EAI的请求通道发送过来的指令后进行译码,如果发现是需要访问存储器资源的协处理器指令,则需立即将存储区独占信号拉高,主处理器将会阻止后续的指令继续访问存储器资源。
•协处理器需要访问存储器是通过ICB的存储器请求通道向主处理器的LSU发起请求。
•主处理器的LSU在完成存储器读写操作后,通过ICB的存储器反馈通道向协处理器反馈。
•由于协处理器和主处理器LSU接口的ICB采用valid-ready方式同步握手,所以可以连续多次发送多个存储器读写请求
•协处理器在完成对存储器的访问之后,需将存储器独占信号拉低,主处理器将会释放LSU允许后续的指定继续访问存储器资源。
使用Veilog进行仿真和在FPGA Soc原型上运行软件
riscv-test是有RISC-V架构开发者维护的开源项目,包含一些测试处理器是否符合指令集架构定义的测试程序。
如测试add指令,通过让add指令执行两个数据的相加(譬如0x00000003和0x0000007),设定它齐唐的结果(譬如0x0000000a)。然后使用比较指令加以判断,假设add指令的执行结果的确与期望值相等,则程序继续执行,加个与期望值不相等,则程序直接使用jump指令跳到TEST_FAIL地址,假设所有的测试点都通过,则程序一直执行到TEST_PASS地址。
在 TEST_PASS 的地址, 程序将设置 x3 寄存器的值为1 ,而在 TEST_FAIL的地址, 程序将 x3 寄存器的值设置为非 1 值 。 因此,最终可以通过判断己的值来界定程序的运行结果到底是成功还是失败。
详细见蜂鸟E200快速上手手册。