silicontalks的个人空间 https://blog.eetop.cn/1565979 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

剑哥系列--综合I

已有 3251 次阅读| 2016-7-12 18:28

作者:俞剑

今天我们的主题是综合,进入主题之前先给大家铺垫一下。

如今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来写组合逻辑时,切记把caseif-else写完整了(写完整是指case里面要记得加defaultif-else里面有if就要有对应的else),否则综合时会推导出LATCH(而不是你想要的组合逻辑),影响功能,而RTL仿真时case写得不完整多半是不影响功能的。

用always来写组合逻辑时敏感列表一定要完整,否则还是会综合出LATCH。保险起见可以用always @(*)来写,保证不会因为敏感列表不完整出现LATCH。

功能鲁棒性也是一个重要课题,比如跨时钟域该怎么处理。一般来说从高频到低频,我们用展宽,低频到高频可以使用一些技巧直接采。跨时钟域的问题往往在前仿真中看不出来,很多时候是在FPGA验证时甚至芯片回来时才发现,有的芯片动得很好有的就有奇怪的问题,最后发现还是跨时钟没处理好导致鲁棒(稳定)性问题。还有万能的异步FIFO,FIFO深度怎么选,工作在空模式还是半满模式,大课题有机会再展开。可验证性包括怎么来基于断言写一些design for verification。可维护性那就更大了去了,包括命名规则啊,注释语言啊,都必须要注意。一个人写的code如果像天书一样,其他人都看不懂,甚至自己过一段时间也看不懂了,可维护性就很差了。

来到综合,综合其实本是个大概念,从抽象到形象,从高层到低层。现在我们有高级综合或叫行为综合(C to RTL,发展中,写RTL的码农需要着实关心下它的发展),RTL逻辑综合(RTL to GATE LEVEL),版图物理综合(GATE LEVEL to LAYOUT)。今天我们讲的是RTL综合,综合工具的功能即是读入RTL代码,第一步进行翻译translation,即对RTL代码进行推导至GTECH通用库(独立于工艺的)。推导包括寄存推导(是否带异步置位复位的),组合逻辑推导至nandnor等逻辑等逻辑,有时适应库里有的资源,还可以推导RAM,乘法器,加法器(如FPGA的综合)。第二步是工艺映射,将GTECH库映射到相应工艺的标准单元库上。第三步是优化,根据用户的设定的时延,面积,线负载模型对电路网表做进一步的优化。

对于综合流程而言我们该怎么去理解呢。首先对综合目标以性能、功耗、面积来排个序。性能我们用时序上能跑到多高的频率来评判,它的瓶颈在关键路径。功耗我们分静态功耗(漏电)和动态功耗(由频率、工作电压、电路规模决定)。这三个目标参数我们可以采用一些技术再不影响某个参数的情况下去提高其它参数指标,某些情况下我们就得去权衡这三个参数。首先讲个题外话,怎么选工艺平台,工艺平台不是最先进的工艺平台对你来说就是最好的,而是应该从战略、成本,需求角度去选择最适合你的工艺平台。选中了工艺平台我们来谈一下怎么来选择需要映射的标准单元库,首先标准单元会以管子开启阈值来分uLVTLVTSVTHVTuHVT,阈值越低速度越快,但静态功耗(漏电)也越大。利用这些vt在综合时可以使用上multi-vt的策略,比如时序上关键路径才是瓶颈那么我们关键路径上可以使用低VT的,和其它路径上可以使用高VT的,这样在不降低性能的同时,我们降低了静态功耗。同时,标准单元库可以按照走线的TRACK来分7T9T12T。面积上7T<9T<12T,漏电功耗上7T<9T<12T,速度上7T<9T<12T

  选好了库以后我们就要写综合约束了。综合约束用来设定电路综合的目标,它包括设计环境约束、时间约束和面积约束。设计环境约束指的是用来描述设计在工作时的温度、电压、驱动、负载等外部条件的一系列属性。基本的环境设置内容包括工作条件、负载模型、系统接口驱动或扇出能力等设置。这些属性约束在电路综合时是必须的,如果用户没有进行显示的说明,则综合工具(例如常用的Design Compiler, 简称DC)在综合的时候会采用默认值。时序约束内容包括定义时钟、定义时钟网络的时间约束和时序路径时间约束设定,绝大部分的时序约束工作在接口上,以及非同步设计、多时钟域的时间约束上。面积约束和时序约束之间是一对矛盾且需要折中的关系,DC综合默认为时间约束比面积约束拥有更高的优先级。DC优化时默认不进行面积优化,如果你关注于芯 片的面积,可以使用set_max_area命令设定面积的约束,使得DC完成时序约束之后继续进行面积优化。

好了,本篇我们就写到这里吧,写的时候计划写代码风格、综合、逆综合的来写。写到这里觉得这个课题还是老大的,这里文章不适合冗长叙述,我们下篇再对综合进行下展开,再来聊下逆综合,曾自己玩过的一个比较有意思的Project。需要向大家解释的话,剑哥不擅长给大家画图啊,什么的来描述一个细节的东西,我擅长的是从本质和方法学角度去描述一个问题,大家见谅。

===

更多精品内容欢迎关注我们的公众号:silicon_talks


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 1

    评论
  • 访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 11:44 , Processed in 0.032792 second(s), 17 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部