互连子系统设计的总原则是满足系统延迟和带宽的要求,同时减少主要互连模块的接口数量和顶层高速信号的走线数量。
总线是一组信号(连线)的集合,多个需要相互通信的主/从设备连接其上,如图1.11所示。共享总线通过分时复用机制实现不同设备之间的通信。当出现多个主设备同时访问一条总线的情况时,需要由仲裁机制来决定总线的所有权。总线的结构比较简单,硬件代价小,但其带宽有限且无法随设备的增多而扩展。
图1.11 总线
交叉矩阵保证了多路通信可以同时进行,如图1.12所示。其结构相对简单,互连部分延迟小,适用于数量不多的设备互连。但是随着设备数量的增加,交叉矩阵的规模呈几何级数增长,导致其内部走线非常多,不利于物理实现。
图1.12 交叉矩阵
在基于报文交换的片上网络(Network on Chip,NoC)中,每个IP(如处理单元等)与路由器相连,IP之间的通信转换为路由器之间的通信,如图1.13所示。NoC实现了更好的扩展性,在吞吐量和带宽方面尤为突出。但其设计相对复杂,需要考虑拓扑、路由、流量控制等方面的问题。
图1.13 NoC
缓存一致性总线用于维护不同处理器之间的缓存一致性,如图1.14所示。其中处理器簇内部的L2缓存维护两个L1缓存之间的缓存一致性,而外部的缓存一致性互连(CCI)维护两个处理器簇之间的缓存一致性。
图1.14 缓存一致性总线
SoC可以使用分层结构总线(Hierarchical Bus)来提高系统吞吐量,不同总线上可以有多个传输同时进行。在图1.15中,三条总线由两个(转换)桥连接。
一些重要、功能专一和面积较大的模块,如ARM处理器、内存控制器等,通常与互连模块直接相连,如图1.16所示。
图1.15 分层结构总线
图1.16 专用互连
为了减少总线接口的数量,可考虑使某些功能模块共享总线接口。
(1)物理布局位置接近的功能模块,可以共享总线接口。例如,图1.17中功能模块1和功能模块2是相邻功能模块,可以通过内部互连(桥/总线)共享与系统互连的接口。
图1.17 相邻功能模块共享总线接口
(2)接口协议相同的功能模块,可以共享总线接口。例如,图1.18中功能模块1和功能模块2都使用AHB(高级高性能总线),可以通过内部互连共享与系统互连的接口。
(3)多个功能模块的寄存器总线,可以共享总线接口。例如,图1.19中功能模块1~功能模块4共享AHB接口,功能模块5~功能模块8则共享APB接口。
图1.18 接口协议相同的功能模块共享总线接口
图1.19 多个功能模块的寄存器总线共享总线接口
低速功能模块的工作频率较低,而总线频率较高,二者之间需要进行协议转换和时钟跨越。相应(转换)桥应靠近互连模块一侧,这样顶层连线少且运行频率低,如图1.20所示。
图1.20 低速功能模块与总线的(转换)桥
虽然处理器可以工作在很高频率下,但互连模块的运行频率难以相应提高。由于各个功能模块布局在芯片各处,因此与总线的连线可能很长。如果采用展平式(Flatten)的物理实现,则互连模块将遍布全芯片,致使连线延迟占很大比例,时序收敛困难,如图1.21所示。
图1.21 展平式的互连模块布局布线
将互连模块限制在较小区域,可以提高其运行频率,但需要外插一级或多级寄存器片(Register Slice,RS)才能满足其时序要求,从而增大系统延迟,如图1.22所示。
图1.22 限定区域的互连模块布局布线
系统总线通常包括数据总线(Data Bus)和寄存器总线(Register Bus)。
对于规模较小的芯片,由于芯片尺寸小,主设备到从设备的距离短,且主设备及从设备的数量通常较少,互连模块一般都不大,因此尽量采用全局同步的策略,既简化设计,又能满足时序收敛的要求。但是对于大尺寸的芯片,互连模块的数量非常多,可能拥有多达数百万个单元和器件,采用全局同步的策略比较难以收敛时序,此时一般采用全局或局部异步的策略,在没有同步要求的接口之间采用异步隔离,这样后端实现时各时钟的时钟树(Clock Tree)相对较短,容易完成时序收敛。全局同步的数据总线如图1.23所示。
图1.23 全局同步的数据总线
寄存器总线用于模块的寄存器配置和状态读取。一些模块可以专享单一寄存器总线。但许多模块的寄存器总线工作频率较低,可以共享同一寄存器总线。例如,拥有AHB或APB协议的模块可以共享各自的AHB或APB寄存器总线,如图1.24所示。
图1.24 共享寄存器总线
从理论上来说,各个模块的寄存器总线可以是异步的,如图1.25所示。
图1.25 异步寄存器总线
对于面积较小的芯片,比较简单的方案是采用全局同步的寄存器总线和数据总线,如图1.26所示。
图1.26 全局同步的寄存器总线和数据总线
当芯片中的模块较多,面积较大时,保持数据总线和寄存器总线全局同步的方案,在时序收敛上可能存在困难。数据总线同步而寄存器总线异步的方案如图1.27所示。
大尺寸芯片的数据总线是否采用全局同步的策略,需要根据互连模块的数量,以及后端实现时的芯片布局规划(Floorplan)决定,由前、后端一起评估时序收敛的可行性后,选择合适的同步或异步策略。
图1.27 数据总线同步而寄存器总线异步的方案
一些系统中只有一个内存控制器,当短时间内同时出现大量的内存读写访问时,后面的访问需要排队等待。为了突破此性能瓶颈,有些互连模块提供内存交织访问功能,在系统中集成了多个内存控制器(一般是偶数个)。以图1.28所示的互连模块为例,将某个主设备的读写访问分成两组,分别送至内存控制器0、内存控制器1,这样原本排在后面的内存读写访问不用再排队,能够减小访问延迟和提升访问带宽。
图1.28 提供内存交织访问功能的互连模块
可靠性是指系统必须尽可能可靠,不会意外崩溃、重启甚至出现物理损坏。一个可靠性系统对于某些小错误必须能够做到自修复,而对于无法自修复的错误应尽可能进行隔离,以保障系统其余部分正常运转。可用性是指系统必须能够确保尽可能长时间工作而不下线,即使系统出现一些小问题也不会影响整个系统的正常运行。在某些情况下,甚至可以进行热插拔(Hot Plug)操作以替换有问题的组件,从而严格确保系统的宕机时间在一定范围内。可维护性是指系统能够提供便利的诊断功能,采用系统日志、动态检测等手段,以方便管理人员进行系统诊断和维护操作,及早发现并修复错误。作为一个整体,可靠性、可用性和可维护性(Reliability Availability Serviceability,RAS)的作用在于确保整个系统尽可能长期可靠运行而不下线,并具备足够强大的容错机制。
对SoC而言,RAS主要处理内存上的错误、处理器上的错误、PCIe(高速外围设备互连)上的错误、芯片组的错误及平台硬件的错误。下面介绍内存RAS、处理器RAS和PCIe RAS。
内存RAS的性能非常重要。服务器的程序都在内存中运行,一旦内存出错而没有被修复,就会导致程序崩溃,进而带来严重损失。随着内存频率越来越高,颗粒密度越来越大,容量越来越大,出问题的概率也越来越大,内存故障已成为数据中心最严重的问题之一。
在图1.29中,ECC(纠错码)功能位于SoC外,L2缓存、片上RAM、内存控制器都加大了信号宽度。数据缓存和指令缓存相对较小,不易发生软错误,而且需要高速运行,为了避免L1缓存读取时产生额外延迟,通常使用简单的奇偶校验方法。
图1.29 SoC的内存RAS
处理器RAS的性能非常关键。Intel移植了原本只为RISC架构制定的机器校验架构(Machine Check Architecture,MCA)等特性,通过所有处理器电路间的错误检测和恢复机制,避免处理器错误带来的系统故障,并可保证处理器内部数据传输和存储的随机错误通过ECC纠正处理和指令重试技术恢复。即使发生不可恢复的错误,处理器也不会停止工作,而只会继续记录所有的错误信息,因此任何错误原因都能被迅速检测出来。
PCI定义两个边带信号PERR#和SERR#来处理总线错误。其中,PERR#主要对应普通数据奇偶校验错误;SERR#主要对应系统错误。PCIe取消了PCI中的这两个边带信号,采用错误信息的方式实现错误报告。PCIe定义了两种错误报告,第一种是基本错误报告,所有的PCIe设备都支持;第二种是可选错误报告,又称高级错误报告(Advanced Error Report,AER),AER通过一组专门的寄存器来提供更多、更详细的错误信息,以便软件定位错误和分析原因。