手把手教你设计CPU-3

调试机制

对于处理器的调试功能而言,常用的两种:“交互式调试”、“追踪调试”。
交互式调试是指调试器软件(如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快速上手手册。

### 回答1: 很高兴听到您对RISC-V处理器的设计感兴趣。以下是一些基本步骤,可以帮助您开始设计自己的RISC-V处理器: 1. 确定处理器的需求和规格:在设计处理器之前,您需要确定处理器的需求和规格。这包括处理器的性能、功耗、指令集等方面。 2. 学习RISC-V指令集架构:RISC-V是一种开放的指令集架构,您需要学习它的指令集和编码方式。您可以在RISC-V官方网站上找到相关的文档和程。 3. 设计处理器的微架构:微架构是处理器的实现细节,包括指令流水线、寄存器文件、ALU等。您需要设计一个合适的微架构来实现RISC-V指令集。 4. 编写Verilog代码:Verilog是一种硬件描述语言,您需要使用Verilog编写处理器的代码。您可以使用Verilog模拟器来验证您的代码是否正确。 5. 进行综合和布局布线:综合是将Verilog代码转换为门级电路的过程,布局布线是将门级电路布置在芯片上的过程。您可以使用EDA工具来完成这些步骤。 6. 进行仿真和验证:最后,您需要对处理器进行仿真和验证,以确保它能够正确地执行RISC-V指令集。 希望这些步骤可以帮助您开始设计自己的RISC-V处理器。祝您好运! ### 回答2: 随着计算机技术的不断发展,处理器作为计算机的中央处理单元,一直处于不断更新和迭代的状态。在这个过程中,越来越多的人开始将目光投向自己动手设计处理器的领域,以提高对计算机结构的理解和掌握能力。而RISC-V处理器则成为了越来越受欢迎的处理器设计体系结构之一。下面,我们就来手把手设计RISC-V处理器。 首先,需要了解RISC-V处理器的体系结构和指令集,掌握其特点,以便更好地进行设计。RISC-V架构采用精简指令集(Reduced Instruction Set Computing,RISC)的思想,指令集清晰简单,易于扩展和实现,同时提供了不同的指令长度和地址宽度,满足多种应用场景的需求。 其次,需要明确设计RISC-V处理器的目的和需求。例如,设计一款高性能处理器,需要考虑运算速度、处理带宽、低功耗等方面的需求,而设计一款嵌入式处理器,则需要考虑尺寸、功耗、集成度等方面的需求。在确定需求后,可以选择适合的设计方法和实现方式。 接着,需要进行设计和仿真。采用硬件描述语言(如Verilog或VHDL)进行设计,利用仿真软件进行仿真调试,逐步完善处理器的各项功能。需要注意的是,设计时需要清晰明确每一阶段的功能和相应的接口,保证设计的可扩展性。 最后,进行硬件实现和验证。将设计好的RTL电路转换为FPGA或ASIC中的物理实现,进行性能测试和功能验证,发布仿真测试结果和设计文档,确保设计能够满足预期的性能和功能要求,并能够进一步优化和升级。 在以上步骤中,需要掌握的知识包括计算机体系结构、数字电路设计、硬件描述语言的使用等。需要长期的学习和实践,才能够熟练掌握处理器设计的各个环节,并能够设计出具备高性能、低功耗、灵活可扩展等特点的处理器。 ### 回答3: RISC-V是一个由加州大学伯克利分校推出的开源指令集架构,它的设计理念是简化指令集,更加注重可扩展性、可定制性和易于实现。设计RISC-V处理器需要了解计算机体系结构以及数字电路原理,下面将手把手设计CPU。 第一步,需要确定处理器的架构。RISC-V处理器一般采用五级流水线结构,包括取指、译码、执行、访存和写回。在这个流水线结构中,每个阶段都有对应的功能,可以保证指令的按序执行。 第二步,需要确定指令集架构。RISC-V有基础指令集和标准扩展指令集,需要根据使用需求选择相应的扩展指令集并实现相应的操作。 第三步,需要进行处理器的逻辑设计。包括指令寄存器(IR)、程序计数器(PC)、指令存储器(IM)、寄存器堆、ALU(算数逻辑单元)、数据存储器(DM)等,这些模块通过总线相互连接构成处理器的基本结构。 第四步,需要进行数字电路的设计。处理器逻辑的实现需要用到器件和电路,需要根据设计的结构和功能实现相应的数字电路。 第五步,进行验证和调试。在设计完成后,需要进行仿真验证和调试工作,以保证设计的正确性和稳定性。 总的来说,设计RISC-V处理器需要掌握计算机体系结构、数字电路原理和基础编程知识,需要进行详细、全面的规划和设计设计过程中需要不断地验证和调整,确保设计的正确性和稳定性,最终完成一个高质量且符合需求的处理器设计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值