数字IC后端小白学习日志---009 day(05脚本与实战-clock)

断更很久,最近两天把这个项目剩余的给补上。

剩下的脚本可以理解为主要是给工具一些约束,或者进行一些设置,目的是来告诉工具,工具应该怎样做。

        place之后所有的Stdcell都已经摆放好了,Timing做了一轮的优化,但是Place之后的Timing有个重要的特点:clock tree的Timing是ideal的,也就是理想的clock tree(clock tree上的delay还都是0)。这就导致了所有的clock之间是没有skew的,也就是clock之间没有delay。实际情况肯定不是这样,clock tree到达不同的的地方会有不同的延迟,到达不同的DFF的时间肯定是有不一样的地方。总结就是place后的优化并不能完全代表最后的时序的结果。所以就会进行我们要介绍的这一步:CTS,即时钟树综合。其作用是把clock由ideal的变为真实的。(1)把clock line上所有的DRV给修掉。(2)在满足指定的fanout,transition等的前提下,去把时钟树建立起来(这一步工具主要是通过插buffer来实现---也称插buffer tree),完成同一个clock之间的delay的balance----可以这样理解:同一个clock下可能有十几万个DFF(sink),我们要保证时钟源到达他们的时间是一样的。当然,这里讲的是同一时钟下的clock,如果要做不同时钟的balance,这就需要人工去分析后做。这个点值得以后去思考,这里不再介绍。下面开始介绍脚本:

分为四小节来讲:

(1)restoreDesign

(2)set_ccopt_property

(3)ccopt_design

(4)reports and check

(1)restoreDesign

        这一部分应该不用过多介绍了,前两个source在之前的章节已经介绍过,variable的设置只不过是为了可重用性(更改一个design的时候,只需要在00脚本里面把一些关于set的语法改变即可,而不必在每个脚本里面修改路径)。

   重要的语法只有一个restoreDesign。

  语法格式:restoreDesign  xxxxxxxx.dat design_name (思考:为什么是“.dat”而不是“.enc.dat”)

restoreDesign之后的结果应该是place之后的。关掉early global route和layer的结果如下所示。

(2)set_ccopt_property

之所以叫ccopt,是因为它的引擎叫这个名字,一般我们又称为CTS,或者clock tree synthesis。

#set dont use cells

就是告诉工具不用哪些Cells。一般来说还有一个更重要的:clock cells selection

#clock cells selection ( latency ( insertion delay) , skew , clock  power , clock em , long common path ( cppr ) , duty cycle )

        来选择做Clock Tree用的cell,有的公司会选择buffer,有的会选择inverter。到底使用谁并没有一个明确的规定,虽然大部分人认为用inverter会更有优势,但是这种优势在先进工艺制程下不太明显。

        这里选择buffer和clock_gating cell用哪些。

        如何知道我们有哪些buffer和inverter呢?可以使用get_lib_cells

#ccopt spec option

这里是一些较为重要的设置

effort :设置做ccopt/CTS优化的力度,一般选择力度比较大的extreme。

max_fanout::设置clock line上最大的fanout有多大。这里不是硬性的要求,因为此处的目的是制约max_transition。只要max_transition和max_cap满足了,max_fanout是否有violation其实是不重要的。大部分公司没有把max_fanout作为sign off的标准,只不过是为了约束max_transition和max_cap来进行的设置。

target_skew:你期望的工具做出来之后任意两个DFF的差(skew)不能超过的值。

target_max_trans:clock上的max transition是多大

target_insertion_delay:latency也称insertion delay。

#skip_type ( leaf )

分为几个概念:

sink:每个挂在clock tree上最末端的,通常是DFF。

sink type的类型有几种:

(1)auto:默认的,让工具自己去判定属于什么type

(2)through:一般情况下,clock会从源头直接trace到最尾端的DFF,在这中间,如果有某一个点工具认为已经是最尾端了,就是要结束的点,但是实际上这个点不是我们想要结束的点。举一个例子:一般会把DFF作为sink点,但是在分频电路中,中间会存在一个DFF(反馈作用),如果不把这个点设为through,工具会认为这个点就是末端,这个点后面的clock不再trace。相当于这个点后面的CTS都没有做。

(3)stop:和through刚好相反,through是告诉工具某些点要穿过去,而stop是告诉工具某些点要停下来,不能穿过去。

(4)ignore:工具会认为这个点仍然是一个clock的pin,只是不会去做balance。

(5)exclude:相比于ignore更极端,直接把这个pin从clock tree上拿掉,甚至不做DRV。假设某种情况下我们想要把clock做短,不想和其他地方balance。这个时候应该用ignore。

#ndr ---non_default_rule

default rule很好理解,就是工艺规定的最小宽度,最小间距。而non_default就是比default更大,更宽。-----(注意:non_default_rule一定不能比default更小,因为default已经是最小的了),default rule可以在tech_lef中找到。

ndr的定义:

        add_ndr -width {  } -spacing {  } -name

创建一种route的类型:

        create_route_type -name -non_default_rule -bottom_preferred_layer -top_preferred_layer

定义clock上的绕线规则:

        set_ccopt_property route_type ${route_type_name}  -net_type

        net_type分为三种:top、trunk、leaf

        直接连到DFF的net称为leaf net。

        trunk和top的区别在于:这条net fanout出去的DFF的数量。简单的理解就是这条net后面挂了多少个DFF。一般有一个变量进行数量的控制:routing_top_min_fanout。超过这个数的称为top,小于这个数的称为trunk。

#generate and read ccopt spec

        绕线规则(set_ccopt_property route_type)定义好之后,spec的定义也差不多了。下面就是生产spec。

        delete:删除原有的ccopt spec

        create:创建基于我们定义的ccopt spec

        source:把spec给source进去

# cts route option

clock的绕线在ccopt之后,所以在做ccopt的时候还是用ccopt自带的绕线引擎

#routing related settings

指定绕线的时候用的是哪些层:

        setDesignMode -bottomRoutingLayer -topRoutingLayer 

(3)ccopt_design

开始run ccopt。

绕线后我们要把所有的clock设为propagated。这是区别于ideal的一个重要的东西。

注意此处要先使用set_interactive_constraint_mode后才能进行更改。

如果这之后还想做一轮clock的绕线,应该怎么做?

先选中所有的clock绕线,因为此时clock的绕线都是fixed,我们要通过dbSet把他们(wire和via)设为routed。然后我们就可以使用globalDetailRoute。globalDetailRoute绕完之后再把clock绕线设置为fixed

最后save design

(4)reports and check

一些report和check(具体什么请自行查阅)

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值