进阶(A)阶段概述

首先恭喜大家,经过B线的努力,大家已经有了一个可以运行单个复杂程序的处理器。 而在进阶(Advance)阶段,目标是让处理器可以与外设部分整合为完整的片上系统,并开始优化处理器的性能:

  • 在自己设计的处理器上运行基本nanos-lite操作系统之上的用户程序
  • 通过总线与中断将处理器与外设整合为片上系统
  • 理解处理器硬件设计对处理器面积、最高频率与同频性能的影响
  • 使用缓存(Cache)、多周期乘除法器与流水线提高处理器整体性能

在A线部分讲义全部完成前,这里先给出从基础阶段向进阶阶段过渡时可以自行准备的方向:

1. 异常与中断

基础阶段的单周期处理器没有实现Zicsr,也没有处理中断和异常相关的跳转。可以通过ICS-PA3了解处理器中的中断与异常机制,理解软件中如何利用这些机制。在NEMU模型中实现CSR读写和异常处理的模型后,在单周期处理器基础上加入异常处理的相关指令,最终达成A线对处理器指令功能方面的要求。

2. 停下来的处理器

基础阶段的处理器默认所有指令都可以在一个周期内执行完成,没有考虑指令需要等待的情况。实际设计中访存数据未返回或者进行多周期计算(如多周期乘除法)时需要让处理器暂停执行,保持原有的状态等待满足继续运行的条件,但不进行会影响处理器内部状态(寄存器写入等)和外部状态(内存读写)的操作。因此,需要在硬件设计中添加让处理器暂停执行指令的等待信号,并添加实现等待的相关逻辑。对这一功能进行测试时,可以先使用一个在C testbench产生的随机数控制当前周期是否进行等待,通过随机等待进行测试。

3. 总线接口与片上系统

目前为止的单周期处理器中,我们使用了一个模拟给出地址就可以在同一周期立刻返回结果的内存模型(DPI-C模拟)。但在实际硬件中,一方面,内存的读写请求和数据传输都需要通过硬件信号完成;另一方面,即使是置于处理器旁的高速内存也至少需要一个周期进行读写,而访问外设和主内存时更是需要在操作完成信号和结果返回前等待不定长的时间。为将设计中的内存模型替换为硬件访存接口,可以在加入等待机制的单周期处理器基础上先使用带有等待信号的,需要一个周期返回结果的BRAM/SRAM接口替换原有的DPI-C操作,在testbench中再解析接口上的信号模拟内存读写的结果。

在前面的学习中,我们已经了解到指令集如何通过定义软件与处理器间的标准,使多样的软件可以运行在任何实现标准的处理器上了。而在硬件模块之间,也有不同模块如何连接为一个系统的连接规范,也就是总线接口。总线接口定义了模块间连接使用的信号与使用各个信号控制传输数据的过程,允许使用相同接口的模块间进行通信。在"一生一芯"的设计中,我们使用AXI作为处理器与外部连接的总线接口。在带等待的RAM接口替换完成后,可以参考AXI总线规范,将处理器的RAM接口转换为AXI-Lite主机接口,达成A线对处理器接口功能方面的要求。具体步骤上,可以先理解AXI总线的通道划分,如何完成单个通道的数据传输,如何用多个通道完成一次完整的读操作与写操作,再通过硬件控制完成传输过程。

4. 缓存与存储性能优化

从这里开始,除了实现处理器功能外,还需要考虑设计对处理器的性能的影响。

由于内存的物理限制,越大的内存、距离处理器越远的内存访问需要的时间越长。因此在处理器和外部存储间添加一块缓存,利用程序访存的局部性,将最近使用的数据保存在缓存中,使处理器在大部分场景下相比无缓存时可以减少等待内存返回结果的时间,保持较高的工作性能。实现缓存的两个主要考虑是确定当前访问位置对应缓存行的逻辑核缓存替换的逻辑。在理解缓存的逻辑后,在处理器访存位置添加自动记录外部内存一部分的缓存,并完成与之相关的逻辑,加快程序大部分情况下的运行速度。最后,将缓存对外部内存的读写通过设计的逻辑转换为AXI接口,完成A线中对存储系统的接口与性能要求。

在对处理器性能进行分析时,常常遇到定性分析无法得出明确结论的问题,此时需要实际仿真或测量处理器运行时的性能指标,如在一段程序中访问内存时使用缓存,以及访问的数据在缓存内的次数。此时,可以使用RISC-V架构在Zicsr中定义的性能计数器空间,根据性能评判需要设置相应的计数器,并添加计数逻辑,以实现对处理器性能影响因素的量化分析。

5. 流水线与执行性能优化

目前为止的实现过程中,对处理器的性能评价都限制在运行程序需要的周期数。而在硬件实现时,另一个直接影响性能的指标是处理器完成每个周期需要的最小时间。这一指标决定了处理器的最高工作频率。电路处理逻辑与运算会消耗一定的时间,在寄存器间越复杂的逻辑需要越长的时间达到数据传输稳定。如果将所有的操作都置入单个周期内,则处理器能达到的最小周期时间会被限制在所有电路传输时间的最大值上。

在解决这一问题时,进阶线涉及到两个方面的改动:一方面处理计算电路中耗时最长的乘除法指令,由单周期乘除法器替换为延时更短的多周期乘除法器,使处理器最大延时减少,加快乘除法以外的指令并减少总电路面积;另一方面,则是将单个指令的执行过程拆分在多个周期进行,而处理器中处理指令的电路也拆分为多个阶段,按顺序处理送入的指令,同一时间各级电路处理不同指令,各指令在时间层面并行处理,形成流水线式的工作方式,通过拆分时缩短最长电路传输时间以提高整体工作频率。

在处理流水线时,由于指令集定义上每条指令的效果等同于单独执行,但实际上各指令在时间上分阶段并行执行,因此需要由流水线控制逻辑判断是否会发生执行冲突,并进行处理。在实现时,在将原有的单周期处理器划分为多级流水线后,先确定分割后每一级正常工作并可被控制进行等待,再了解流水化处理器的控制逻辑需要解决的各种冲突,以及如何通过控制流水级等待等方法避免冲突。随后理解发生异常时如何处理处理器状态和流水线中正在执行的多条指令,构建一个可以正常工作的多级流水线,达成A线对处理器性能方面的要求。最后,由于大量的等待周期会降低处理器整体的运行效率,因此还可在流水线的基础上逐渐加入旁路,静态分支预测,预测执行加流水线冲刷提高流水线性能的环节,使用额外的逻辑代替等待处理一部分流水线冲突问题。

流片测试要求

在npc上将自己编译的仙剑成功运行

Last Updated:
Contributors: Miao Yuyang, myyerrol