|
作者:俞剑
今天我们的主题是综合,进入主题之前先给大家铺垫一下。
如今IC时代,集成电路设计我们分两种:全定制电路设计和半定制电路设计。全定制电路设计我们都直接用SCHEMATIC来做线路设计,半定制电路设计我们从硬件描述语言出发。它们的差异在半定制利用了已有的标准单元库。半定制设计我们又分异步电路设计和同步电路设计,同步异步的差异就在于时钟。而同步设计又分RTL设计和LATCH-BASED设计,RTL以寄存器(Register,即各种对时钟沿敏感的flip-flop)的方式描述,LATCH-BASED设计以锁存器(对时钟电平敏感)方式来描述,LATCH-BASED需要两相时钟,本质上就是把主从触发器主从两级拆开,中间插入逻辑,这样可以使用很多设计技巧比如timing borrowing,从而优化时序。
今天的主题我们放在RTL DESIGN,其它的设计方式大家有机会再去体会,尤其是离RTL DESIGN最近的LATCH-BASED DESIGN,这种设计方式还是很有意思的,在时序性能上可以得到很大的收益。
在进入综合的主题之前给大家再啰嗦下代码风格。什么是代码风格?这个词可能对很多刚入门的人会觉得很神秘,尤其IC的码农还喜欢吼一声coding style。代码风格的存在其实就是约束设计人员能够写出代码质量高的代码,何为质量高?包括可综合性,功能鲁棒性,可验证性,可维护性。可综合性的意思首先是你的代码要可以被综合,其次是综合出来的gate-level实现要和你预想的一致。下面是一些重要的coding style. ,也是面试时候经常会问的:
阻塞(=)和非阻塞(<=),时序逻辑的always里我们用非阻塞,并发执行,组合逻辑的always里面我们用阻塞,顺序执行。
用always来写组合逻辑时,切记把case和if-else写完整了(写完整是指case里面要记得加default;if-else里面有if就要有对应的else),否则综合时会推导出LATCH(而不是你想要的组合逻辑),影响功能,而RTL仿真时case写得不完整多半是不影响功能的。
用always来写组合逻辑时敏感列表一定要完整,否则还是会综合出LATCH。保险起见可以用always @(*)来写,保证不会因为敏感列表不完整出现LATCH。
功能鲁棒性也是一个重要课题,比如跨时钟域该怎么处理。一般来说从高频到低频,我们用展宽,低频到高频可以使用一些技巧直接采。跨时钟域的问题往往在前仿真中看不出来,很多时候是在FPGA验证时甚至芯片回来时才发现,有的芯片动得很好有的就有奇怪的问题,最后发现还是跨时钟没处理好导致鲁棒(稳定)性问题。还有万能的异步fifo,FIFO深度怎么选,工作在空模式还是半满模式,大课题有机会再展开。可验证性包括怎么来基于断言写一些design for verification。可维护性那就更大了去了,包括命名规则啊,注释语言啊,都必须要注意。一个人写的code如果像天书一样,其他人都看不懂,甚至自己过一段时间也看不懂了,可维护性就很差了。
对于综合流程而言我们该怎么去理解呢。首先对综合目标以性能、功耗、面积来排个序。性能我们用时序上能跑到多高的频率来评判,它的瓶颈在关键路径。功耗我们分静态功耗(漏电)和动态功耗(由频率、工作电压、电路规模决定)。这三个目标参数我们可以采用一些技术再不影响某个参数的情况下去提高其它参数指标,某些情况下我们就得去权衡这三个参数。首先讲个题外话,怎么选工艺平台,工艺平台不是最先进的工艺平台对你来说就是最好的,而是应该从战略、成本,需求角度去选择最适合你的工艺平台。选中了工艺平台我们来谈一下怎么来选择需要映射的标准单元库,首先标准单元会以管子开启阈值来分uLVT、LVT、SVT、HVT、uHVT,阈值越低速度越快,但静态功耗(漏电)也越大。利用这些vt在综合时可以使用上multi-vt的策略,比如时序上关键路径才是瓶颈那么我们关键路径上可以使用低VT的,和其它路径上可以使用高VT的,这样在不降低性能的同时,我们降低了静态功耗。同时,标准单元库可以按照走线的TRACK来分7T、9T、12T。面积上7T<9T<12T,漏电功耗上7T<9T<12T,速度上7T<9T<12T。
选好了库以后我们就要写综合约束了。综合约束用来设定电路综合的目标,它包括设计环境约束、时间约束和面积约束。设计环境约束指的是用来描述设计在工作时的温度、电压、驱动、负载等外部条件的一系列属性。基本的环境设置内容包括工作条件、负载模型、系统接口驱动或扇出能力等设置。这些属性约束在电路综合时是必须的,如果用户没有进行显示的说明,则综合工具(例如常用的Design Compiler, 简称DC)在综合的时候会采用默认值。时序约束内容包括定义时钟、定义时钟网络的时间约束和时序路径时间约束设定,绝大部分的时序约束工作在接口上,以及非同步设计、多时钟域的时间约束上。面积约束和时序约束之间是一对矛盾且需要折中的关系,DC综合默认为时间约束比面积约束拥有更高的优先级。DC优化时默认不进行面积优化,如果你关注于芯 片的面积,可以使用set_max_area命令设定面积的约束,使得DC完成时序约束之后继续进行面积优化。