在每个设计阶段,如产品规划、架构制定、代码编写、综合、DFT和物理实现等阶段,设计者都面临若干优化选择,如果能尽早(而非等到设计流程末尾)以定量方式获知选择结果,那么就可以有效缩短开发时间。
在设计早期,可以利用电子表格汇总数据,进行芯片的面积、功耗和静态性能估算。虽然估算不够精确,但可以帮助设计者做出初步设计决策。
根据目标工艺库信息、设计要求、以往设计信息,以及部分IP的综合报告等,统计估算芯片面积。
由于芯片的时序、逻辑单元之间存在间隔及数据连线排布等原因,用于摆放标准单元的区域不能全部被填满。利用率(Utilization)是芯片中已利用面积占芯片面积的百分比。在规划设计的初始阶段,如果芯片尺寸未知,则利用率可作为设计的出发点。
芯片级利用率(Chip Level Utilization)是标准单元、宏模块(Macro)和I/O单元的总面积占芯片面积的百分比,可表示为
布局利用率(Floorplan Utilization)是标准单元、宏模块和I/O单元的总面积占芯片面积(减去子模块面积)的百分比,可表示为
标准单元行利用率(Cell Row Utilization)是标准单元面积占芯片面积(减去宏模块面积和堵塞面积)的百分比,可表示为
内核利用率(Core Utilization)是标准单元和宏模块的总面积占内核面积的百分比。
对于硬化IP(RAM、Analog IP等),为了避免可能的拥塞(Congestion),防止外围环境的电气干扰等,会要求保留一定的空区域或电源环绕区域。在布局布线阶段,这部分所禁止的特定区域称为堵塞(Blockage),如图1.60所示。
图1.60 堵塞
收缩(Shrink)是一种工艺优化,其原理是光罩(Mask)等比例缩放后,晶体管尺寸会缩小一点,但芯片仍然能够正常工作,从而减小芯片面积,降低成本。在40nm和28nm工艺下,收缩一般可以将晶体管的尺寸缩小到原来的90%,不过在7nm等先进工艺下,收缩比例则变为1∶1。
芯片收缩由芯片制造厂完成,与芯片设计公司无关。工程师利用EDA工具设计完成的收缩前(Pre-shrink)版图由芯片制造厂生产时直接进行收缩,实际芯片面积按版图等比例缩小。因此,最后的芯片面积是收缩之后的面积,而非EDA工具所标注的版图面积。例如,设计版图尺寸为10mm×10mm,而芯片制造完成后的尺寸是9mm×9mm。
在一个晶圆上通常有几百至数千个芯片,它们之间留有一定的间隔以便于划片。这些间隔称为划片槽(Scribe Line)或者切割通道(Dicing Channel)、锯道(Saw Channel)、通道(Street)。
在划片槽上切割时,可能有应力作用于芯片内部,加封装条(Seal Ring)可以阻止切割时产生的裂痕损坏到芯片,同时可以屏蔽芯片外的干扰并防潮。
从晶圆角度来看,封装条是介于芯片和划片槽之间的(保护)环。划片槽和封装条如图1.61所示。
图1.61 划片槽和封装条
芯片面积主要由I/O单元、标准单元和宏模块的面积构成,如图1.62所示。
图1.62 芯片面积的主要构成
有多种途径可以获取软化IP面积,如通过对IP的综合而获取面积信息、由IP设计方提供面积信息、根据设计方提供的等效逻辑门数换算得到面积信息。
在综合时可以得到模块的组合逻辑面积、时序逻辑面积和RAM面积,但累加起来并不是一个模块的真实面积,还需要考虑DFT和利用率的影响。软化IP面积如图1.63所示。
图1.63 软化IP面积
首先,考虑DFT的影响,通常将寄存器调换为扫描寄存器后,单元面积增量为5%,用于DFT扫描及压缩的逻辑所造成的面积增量为单元面积的1%~2%。另外,MBIST引起的面积增量视存储器容量、位宽和分组数量而定,通常造成的面积增量为单元面积的5%~40%。其次,考虑物理实现的影响,需要乘以一个系数以计入利用率或堵塞所导致的面积增量,不过,不同的芯片类型,其参数差异比较大。
通常,第三方IP设计方提供的IP文档中会有形状及面积信息,而存储器编译器(Memory Compiler)生成的文档中含有存储器的形状及面积信息。硬化IP面积需要考虑堵塞影响,即将宏模块的长宽分别加上两倍堵塞宽度后再相乘。
目标工艺的I/O单元库文件提供了各种I/O单元的长宽及面积信息,可根据具体设计要求的I/O引脚选型和数量计算出其面积。
芯片全部I/O单元紧密排列在周边,所围面积小于内核面积,因此内核面积决定了芯片面积,即内核面积=RAM面积+其他宏模块面积+标准单元面积。图1.64给出了一个在28nm工艺下,芯片内核面积的估算示例。
RAM面积通常指RAM自身的面积,该数据可以从lib/lef文件中获得。但作为宏模块的一种,其实际面积还包含Keepout、用于端口访问的存储器通道(Memory Channel),以及MBIST逻辑所占面积。其中,对存储器设置约1μm或更大的Keepout,以避免内核逻辑与存储器之间产生物理设计规则违例;用于端口访问的存储器通道通常会占存储器自身面积的5%~10%,具体情况会随存储器宽长比、位宽、功能类型、PG Grid风格而变化;因支持BIST功能而增加的MBIST逻辑通常占存储器面积的10%,该比例会随着BIST分组方式和BIST选用方法的不同而变化。
宏模块面积还包括PLL、ADC和DAC等模块的面积,需要预留3%~5%的Keepout面积。
图1.64 芯片内核面积的估算示例
标准单元面积的计算公式为:标准单元面积=(预估的门单元数×每个门单元面积)/利用率。其中,利用率与使用的工艺、金属层数和设计用途有关,在16nm工艺下,大多数金属层能达到60%~70%或更高的利用率,但到了7nm工艺,普通逻辑区域只有50%左右的利用率。如果设计的是多媒体芯片,则一般可以增加3%~5%的利用率;如果设计的是网络芯片,则一般要减少3%~5%的利用率。
芯片全部I/O单元紧密排列在周边,所围面积大于内核面积,则裸片面积为I/O单元排列所决定的面积。
如果限制了在I/O环上不能摆放其他单元,估算时将内核当作正方形,则裸片面积为
式中,Area core 为内核面积; W ring 为内核至I/O单元边界距离; H I/O 为I/O单元高度。
如果没有限制在I/O环上不能摆放其他单元,则估算时将内核面积与I/O单元面积(Area I/O )相加,即可得到裸片面积为
Size die =Area core +Area I/O
裸片面积估算的基本公式(以28nm工艺为例)如表1.1所示。
表1.1 裸片面积估算的基本公式(以28nm工艺为例)
考虑划片槽和封装条的要求,整个芯片的面积就是裸片边长先加上两倍的封装条宽度,再加上划片槽宽度,最后平方。
式中,Area die 为裸片面积; W seal ring 为封装条宽度; W scribe line 为划片槽宽度。
每个晶圆上可以分割得到的裸片数量可以按下式计算。
式中, d 为晶圆直径(mm); S 为裸片面积(mm 2 )。
测试过的裸片数量为
裸片数量的估算如图1.65所示。
图1.65 裸片数量的估算
功耗估算有助于确认芯片的功耗是否合理和满足要求。利用一些简便的方法和途径可以快速获取功耗信息。例如,芯片数据手册通常会提供功耗信息;依据参考设计,根据供电芯片的最大电流可以推测出被供电芯片或模块的电流;对于引线键合芯片来说,每一个电源引脚都是用键合线连接的,一般一个电源引脚的最大电流为50mA,根据芯片电源引脚的数量,可以估算出该芯片的最大电流。对于其他封装形式的芯片,则需要参考芯片数据手册,如果芯片数据手册中没有直接写明,则可以参考其中的最大额定值、I/O引脚参数等。
实际上,根本不可能人工计算实际的芯片功耗,往往需要借助EDA工具来分析。
图1.66所示为某节点的开关行为。
图1.66 某节点的开关行为
反转(次)数是指逻辑变化的次数,图1.66中信号的反转数为3次。反转率(ToggleRate)是电平反转数占时钟周期的百分比。在图1.66中,反转率为3/6×100%=50%(6个时钟周期内反转了3次)。静态概率(Static Probability,SP)是指(节点)信号逻辑值为1的概率,图1.66中的SP为4/6=2/3。
开关行为用反转率衡量。然而,只有在开关行为代表了芯片实际工作状态的情况下,任何层次上的功耗估算才有意义。
开关行为(反转率)可以直接用指令设置,也可以由仿真工具产生。常用的格式有SAIF(Switching Activity Interchange Format,开关行为内部交换格式)、VCD(Value Change Dump)及FSDB(Fast Signal Database)。其中,SAIF文件是用于仿真器和功耗分析工具之间交换信息的ASCII文件(美国信息交换标准码文件),而VCD文件或FSDB文件是通过仿真得到的ASCII文件,包括设计中的节点活动、结构连接性、路径延迟、时序和事件方面的信息。
功耗估算主要使用两种方法:无向量估算法和向量估算法。
无向量估算法通过指令定义节点的反转率以估算功耗。实际上,只需要设置起点的反转率,因为内部节点的反转率可以通过传播得到。当需要比较精确的估算值时,通常使用向量估算法,即通过电路仿真得到SAIF文件和VCD文件。其中,VCD文件通过相关指令转换成SAIF文件,而后使用SAIF文件进行功耗估算。
功耗估算可以在设计流程的各个阶段进行,对应设计表征的不同形式。功耗估算的4个阶段如表1.2所示,每个阶段所估算的功耗精确度随增补设计和可利用的库信息的增加而提高。越早的阶段,层次越高,估算的功耗精确度越差,但可以越早反馈给设计者。
表1.2 功耗估算的4个阶段
在进行软件级功耗估算时,首先选择系统将执行的典型程序。典型程序通常会有上百万个机器周期,进行一次完整的RTL仿真可能需要数月的时间,这是不现实的。比较实用的方法是根据特定的硬件平台,统计出每条指令对应的功耗数据,进行指令级仿真。
在进行行为级功耗估算时,由于物理电路单元尚未建立,因此难以得到电容与反转率的数值。理论估算是根据电路复杂度得到电容,由信息理论估算反转率,而实验是通过快速综合得到RTL原型,进而估算电容与反转率。
在进行RTL功耗估算时,首先通过静态分析电路结构或动态仿真,收集电路反转率数据,得到各个组件的功耗;然后将所有组件的功耗求和,得到总功耗。
在进行门电路级功耗估算时,因为功耗数据是通过电路仿真获取的,所以其结果更精确。
在进行晶体管与版图层功耗估算时,所有连线的电容、单元负载和驱动信息都已获得,根据晶体管和连线模型的电压、电流方程,可以算出精确的功耗数据。
RTL功耗估算和门电路级功耗估算是常用的选择。实际功耗估算必须借助工具,如RTL功耗估算采用Power Compiler,门电路级功耗估算则采用PrimePower。
在设计流程早期,可对设计的芯片的功耗进行粗略估算。由于尚未选择单元库,因此此时进行电子数据表(Spread Sheet)分析可找出最佳的单元库和设计架构。电子数据表中包含了大致的门电路数和每个模块的反转率、功耗速度比及相关的功耗估算数据。
为了使用电子数据表分析方法,有必要对每个模块的门电路数(每种类型的库单元数)和活动水平进行估算,同时需要知道每种类型的门电路在开关时所耗费的能量,库供应商手册中的数据可用于确定功耗速度比。
每种类型的门电路的动态功耗可由下式计算。
动态功耗=门电路数×功耗速度比×反转率×频率
将一个模块内所有不同类型的门电路的功耗加在一起,就可得出该模块总的动态功耗估算值。例如,在工艺条件1GHz@TT/0.8V/85℃下,模块的动态功耗为200mW,当在3GHz@TT/1.0V/85℃工艺条件下时,可计算其动态功耗,得到
200×3×1.25 2 =937.5mW
在综合前,可根据所选择的体系架构和对设计本身的理解来对门电路数进行估算。例如,根据总线宽度、字长、控制层和存储器深度等可得出大致的门电路数。选择单元库后,模块的门电路数可以利用综合工具的初期综合方法获得。
设计中的门电路都具有不同的活动水平,通过仿真确定开关行为或不进行仿真直接进行估算均可,推荐进行仿真来确定开关行为。
综合完成后,根据实际门电路数和仿真得到的反转率,使用工具(Power Compiler等)可以获得相当精确的功耗估算值。此时估算的不准确性来自反转率及布局前的线负载值。
布局完成后,门电路级仿真能够生成SAIF文件或VCD文件,精确度可以得到改善。必须强调,只有在仿真向量代表真实的应用行为时,反转率才准确。物理设计工具可以提供含有寄生电阻、电容估算值的寄生参数(SPEF)文件。
如果芯片I/O引脚数量众多,则在高速状态下切换开关并驱动很长的线路,有可能造成功耗估算不精确。当希望得到精确而非最坏情况下的功耗估算值时,采用I/O引脚的集总负载模型可能会产生过分悲观的估算结果。若想获得更为精确的结果,则可以在关键的I/O单元类型中利用精确的分布阻抗模型进行HSPICE仿真。
图1.67所示为功耗估算流程。
技术库是包含功耗信息的工艺库,由代工厂提供。比较精确的技术库里面还应该包含状态依赖路径延迟(State Dependent Path Delay,SDPD)信息。当进行功耗估算时,输入设计文件是设计的门电路级网表文件,可以通过综合得到。寄生参数包括寄生电阻等,通常由后端寄生参数工具提供。开关活动包含设计中每个节点的开关行为情况,如节点的反转率或可以计算出节点反转率的文件。完成功耗估算后,工具可以报告单元、模块和芯片的功耗,包括动态功耗(内部短路功耗、开关功耗)和静态功耗(泄漏功耗)。
图1.67 功耗估算流程
图1.68所示为一个SoC的系统框图。其中,Cortex-A73(四核)的工作频率为3GHz,Cortex-A53(四核)的工作频率为1.6GHz,Mali G71全一致性GPU的工作频率为850MHz,Mail-DP550显示模块和Mali-V550视频模块均为4K分辨率(4096像素×2160像素),支持TrustZone,内存带宽为25.6GB/s,总线则工作在800MHz的频率下。
图1.68 一个SoC的系统框图
·对于CPU,先保证其延迟,再保证其带宽。
·对于GPU,先保证其带宽,再保证其延迟。
·对于视频模块,带宽相对来说不大,要保证其实时性,间接需要保证带宽。
·对于显示模块,其实时性要求更高,这是因为不希望应用过程中出现跳屏。
·其余的模块可以放在相对靠后的位置考虑。
·CPU簇×2,理论上每个总线接口提供的读写带宽均为43.2GB/s。
·GPU运行曼哈顿(Manhattan)场景时,每一帧需要370MB/s带宽(读加写,未压缩),850MHz下可以完成45帧,带宽接近17GB/s,压缩后需要的带宽为12GB/s。
·显示模块需要4096(列)×2160(行)×4B(数据位宽)×60(帧)×4(图层)的输入,未压缩时共需要8GB/s的带宽,压缩后需要的带宽约为5GB/s。
·视频模块解压缩后需要的带宽为2GB/s。
当然,上述模块并不会同时运行。在复杂的场景下,视频模块、GPU、CPU、显示模块在工作,带宽需求非常高。
内存控制器的物理极限带宽为25.6GB/s,考虑到带宽利用率只有70%,因此只能提供约18GB/s的带宽,低于带宽需求。不能无限制地增加内存控制器和内存通道,因为内存颗粒成本高,增加内存颗粒会导致功耗上升,所以必须设法提高带宽利用率。
系统各模块的延迟如图1.69所示,图中单位均为ns,百分比由工具自动计算得出,可能存在相加不为100%的情况。
图1.69 系统各模块的延迟
从图1.69中可以算出,系统静态延迟,即访问CPU之外的总线和DRAM颗粒所花时间,总共需要58.9ns。通过提高时钟频率和减少路径上的模块,可以缩小此延迟。
处理器拥有L2缓存,访问时间为10~20个总线时钟周期。
CCI-550与CPU之间使用异步桥来处理时钟、电源和电压域的跨越。异步桥延迟较大,来回需要7.5ns,即6个总线时钟周期,只能通过提高总线频率来缩小延迟。如果异步桥两侧模块的工作频率相差整数倍,如内存控制器与CCI-550工作频率相同,则可以省略。
在图1.70中,总线使用CCI-550(图1.70中用CCI简单表示),一个可共享(Shareable)传输从进入到出去需要12.5ns,即10个总线时钟周期。
虽然CCI和NoC都可以进行交织,但是它们的交织粒度不同(CCI的交织粒度大于NoC),常见的是CCI直接连接DDR SDRAM进行交织,或者CCI不交织,让NoC进行交织。常用的交织策略如下。
(1)对于没有缓存一致性要求的主设备,可直接将其挂载到NoC,通过NoC的交织功能提升内存颗粒访问效率。
(2)对于有缓存一致性要求的IP,如CPU、GPU,可以通过CCI/CMN等缓存一致性互连组成一个子网,挂载到NoC,与其他主设备一起通过NoC访问内存颗粒。
(3)CCI/CMN本身支持交织功能,但是需要注意其与NoC的交织方式是否相同,考虑不同情况下是否需要进行集成适配,同时考虑两级交织时交织粒度的选择。
在图1.70(a)中,将CCI及其上的CPU和GPU作为一个子网挂在NoC下,由NoC连接到DMC,此架构的优点是由NoC负责交织和调度,当然会增加额外的一层总线延迟(10~20ns),CPU测试跑分会降低2%~4%。在图1.70(b)中,考虑到所有主设备都需要访问内存颗粒,因此交织由CCI直接完成,而调度交给了DMC。由于没有采用两层总线的连接方式,因此省去了两层异步桥,减少的12个总线时钟周期已接近整个通路静态延迟的1/5。通常,主流的总线拓扑都是将CCI直接连接至DMC的。如果DMC端口足够多,也可以考虑直接将CPU连接至DMC,不过此时系统架构就不是硬件支持的对称多处理架构了,这在功能上可能不被允许。
图1.70 SoC系统架构
当CPU和其他主设备访问内存系统时,交织导致自身的连续内存地址实际访问了不同内存颗粒,但通过CCI,保证了数据访问的一致性。如果某个CPU直连到某内存颗粒,而其他主设备依然通过CCI且交织访问多个内存颗粒,那么在CPU对直连内存颗粒的连续地址访问与其他主设备对相同地址的访问中,将无法保证访问数据的一致性。一种解决方法是设定CPU对直连内存颗粒的某个地址访问空间为内存非缓存区,而其对内存缓存区的访问仍通过CCI,从而与其他主设备保持缓存一致性;另一种解决方法是在其他主设备访问直连内存颗粒的指定地址空间内,取消互连的交织功能而同样专访该内存颗粒。
DMC和DDR PHY的延迟为21.4ns,约17个总线时钟周期,这部分延迟很难被缩小。如果要实现TrustZone,那么还要加上DMC与CCI之间的TZC400延迟。至于内存颗粒间的延迟,则可以通过准确的DMC预测和调度来缩小。
处理器带宽受限于两个方面:处理器内核带宽(包括读带宽、写带宽、内核总线接口单元带宽)、处理器接口带宽。
总体上,写带宽主要受限于内核总线接口单元,而读带宽受系统延迟影响,受限于处理器接口。
假定处理器ACE接口的传输数据位宽均为64B,系统延迟为60ns,同时支持48个可缓存读请求,则处理器总线接口可提供读操作的带宽为48×64B/60ns=51.2GB/s。
CCI与CPU/GPU之间使用ACE接口,数据读或写位宽均为128bit(16B)。如果CCI工作在800MHz,则单口的理论读或写带宽均为12.8GB/s。
在图1.70(b)中,CCI共有4个出口,每个出口带宽为2×12.8GB/s,总共约为100GB/s。但是外接内存最多提供25.6GB/s的带宽。
对于处理器与互连模块之间的通信,瓶颈通常在于互连模块带宽。可以增加互连模块的数据位宽,但这样会导致互连模块的最大频率降低等负面效应,因此需要通盘考量。
对于互连模块与内存之间的接口通信,瓶颈一般在于内存带宽。
以LPDDR4-3200为例,其理论带宽为25.6GB/s。但是通常带宽利用率只有50%~70%,即至多只能提供约18GB/s的带宽。
内存带宽取决于4个因素:DRAM时钟频率、每时钟周期的数据传输次数、内存总线带宽、内存通道数量。
对于存储系统,通常需要在延迟和带宽之间进行权衡:较小的延迟有利于指针追逐代码(Pointer-chasing Code),如编译器和数据库;较高的带宽有利于简单、采用线性访问模式的程序(如图像处理和科学程序)。内存技术的进一步改进及更多层次的缓存,有助于解决内存墙问题。
由于内存按块进行数据传输,缓存缺失是阻塞处理器的主要潜在原因,因此内存的传输速率至关重要。使用更好的内存颗粒,增加内存存储阵列组(Bank)数量、加宽总线可以增加带宽。但更宽的总线意味着更昂贵的主板,在安装方式上有更多的限制,以及更高的最低内存配置。