• <DC guide ---6>


    前面说了怎么 get_*  ,下面就是怎么把 约束加载到指定位置上。

    Specifying an Area Constraint

    set_area_max   245000    

            把最大面积约束,自动的施加在current_design上。  一般xxxx的单位,有可能是与非门的个数或者是晶体管数目、或者是mm2、 um2等概念、

             这个要看具体的工艺库.DC没有信息能反馈单位,

    Specifying Setup-Timing Constraints

            

    我和JANE、JOE一起合作一个项目,我负责中间的那一块电路。理论上像上图一样。 该怎么约束?约束什么?

    我们知道了寄存器自己本身有setup_time、holdtime ,即D要提前时钟一些,提前稳定好。 时钟上升沿之后,D应该保持稳定一段,以便正确打入寄存器。

    对于我们的小模块来说,都假设从0时刻开始.  假设时钟是100M , 输入信号经过组合逻辑N, 耗时了t1,那么应该保证 t1< 10ns -setup 。即D提前一段时间稳定。

    两个寄存器之间的组合逻辑x最大是多少? 

    假设时钟是100M, 而组合逻辑是 15ns, 当FF2输出一个信号, 需要经过15ns才传回D_FF3, 显然FF3会抓到一个中间状态,这个状态有正在跳转,这个即使综合器也无法

    确保,在中间状态维持一段时间稳定.  因此,要把这个组合逻辑x约束在一个Period内. 

    两个寄存器之间的组合逻辑x最小是多少?

    实际应用中,我们经常会中间没有组合逻辑.那为什么要提这个概念呢?

    对于两个寄存器来说,在同一节拍, FF2的数据输出,如果马上跳变了,会不会恰好发生在FF3的hold_time时间内呢?如果发生了,显然会引起亚稳态.

    所以说: FF2的单bit数据,跳变后,经过一个组合逻辑x, 安全度过FF3的hold_time之后,才最终完成组合逻辑x。这样就能保证FF3的hold_time了。

    下面是一个我用与非门答的 寄存器电路,仿真了下 关于setuphold期间跳变的现象。

     未满足setup的情况:

     

     未满足hold的情况:

     

    可以看出,q输出端确实会有震荡的现象。这也是我们为什么要关心这个setup/hold的原因。

    怎么才能告诉DC,我所允许组合逻辑x的最大最小值? 我如果是直接告诉DC.那么是不是所有路径都得告诉DC才能?

    显然是太啰嗦的,我们只需要告诉DC 时钟的周期.DC自己就能算出来,(工艺库DFF的setup/hold时间固定),

    create_clock

    Creat_clock –name xxx   -period  20   –waveform  { rise nege}   [get_* ]

    先get_*获得某个pin、prot,然后起名xxx,定义它的周期是20,-waveform决定了时钟的相位。 -add选项后面再讲。

    当然了这是一个理想的时钟, 绝对的周期,绝对的占空比. 但在现实中是不存在的, 所以我们要尽量的描述的和现实中的一样.

    (1) 时钟占空比40%,很难精确.  (2) 时钟信号从0-1-0的跳变不是瞬时完成的,有一个过程。

    (3) 时钟到达DFF2和DFF3的时间,有可能受到布线长度等影响,不是严格对齐的。

    (4) 时钟存在jilter,比如时钟的上升沿,时而超前、时而滞后的偏移称为时钟抖动

    怎么样,把这几个方面也考虑进去,才能说 大致构造一个真实的时钟模型.

    Set_clock_uncertainty:   时钟的uncertainty = skew +jitter

    时钟skew是表示: 时钟到达每个寄存器的时刻不是严格对齐的,受到布局布线影响,所以我们需要提前把这些因素考虑进来。

    时钟Jitter是表示 :  由于物理热运动,时钟的沿跳沿,会时而提前时而滞后的自然现象。

    Clock_uncertainty主要考虑的是skew,顺带着把jitter加进来。

     

    仔细看语法:

    -rise –fall选项已经废弃了。

    -setup :  是说该uncertainty值只用在setup时序分析上。

    -hold :   是说该 uncertainty值只用在hold时序分析上。       (后面会说 uncertainty的值到底会怎么影响 setuphold分析)

     

    上面的例子,就是说:在分析CLK路径 的setup时候,需要考虑unvertainty = 0.65

    在分析CLK路径 的hold时候,此时unvertainty = 0.45

         -from   CLK1     -to/-rise_to/-fall_to   CLK2

         -rise_from   CLK1     -to/-rise_to/-fall_to   CLK2

         -fall_from   CLK1     -to/-rise_to/-fall_to   CLK2    还没弄清楚具体什么意思。后面用到了再学习。慢慢来

    看一下设置之后的效果:

     

    时钟是2ns,在分析setup时候,因为设置clock_uncertainty setup = 0.14 。即上升沿有可能提前或滞后0.14ns。

    如果是滞后0.14,相当于 放松了约束。如果是提前0.14,那么组合逻辑x的最大延迟就变相严谨了。

    DC要保证所有情况,故只会考虑提前0.14ns的情况。 2-0.14-0.08-delay(FF1) = max( x ) 

    故而对组合逻辑x的约束更加严厉了。这符合我们的预期目的。

     set_clock_latency

     时钟从晶体出来,到CLK_Port,耗时称为source_latency.

    从CLK_port,再到寄存器,耗时称为 network_latency.

    这两个值,都通过set_clock_latency

     

    感觉这个值,对于MY_DESIGN内的综合,没有起到约束作用。但是呢或许是模块键的组合逻辑会有帮助。

    set_clock_transition

    时钟从来都是,瞬间完成跳变的。当时钟电压值,达到80%时,认识CLK为高。所以综合时,需呀把这个因素考虑进去。

    一般可以用set_clock_transition设置最大最小值。比如DFF2最慢变,DFF3最快变,这样setup就又严谨了一丢丢。

    通过这几个命令: 我们把理想的idea clock变成了较为真实的时钟。

     

    继续回到MY_DESIGN上:

     

    我们通过creat_clock以及配置波动参数,能够让DC明白,组合逻辑X的最大最小延迟。那对于组合逻辑N,能使用一样的约束吗?

    我们通过补全,JANE’s DESIGN,可以把M+N看作一个整体,这样就跟组合逻辑X一样了。但是现实中,我们经常只综合自己的模块,并不知道

    组合逻辑M。怎么能虚构一个信息,让它替代FF1_cell + M的时间 ?

      

    set_input_delay : 

    指定 port_pin,相对于某个信号、某个时钟,延迟多久。

     

    我们一般用:

    Set_input_delay    -max 0.6 –clock  [get_clock*]    [get_input *] 

     set_OUT_delay :  

    需要理清楚一点:  set_output_delay:  是模拟 JOE模块的。

    因为我们告诉DC所有的信息,都是为了让他能计算出组合逻辑S的范围。

    set_output_delay 值是  =  端口B---到FF4的时间。

    比如 set_output_delay 4 ,意味着  组合逻辑只有 6ns的延迟上限。

    为了方便JOE综合她的模块,我们需要提供我们的组合逻辑S的延迟信息。

    其实这也是,为什么很多代码风格,要求输出信号全部都是寄存器输出的原因。环境独立,不受其他的模块影响。

    纯组合逻辑约束

     讨论下这种情况,约束组合逻辑F的时候,需要考虑B的输入delay时间。需要告诉JOE关于D的输出delay

    从图上,可以看到寄存器时刻----到输入口B,总共耗时0.4ns。 

    FF4需要至少提前0.3ns,才能确保setu. 所以组合逻辑的最大延迟为 2-0.4-0.3 = 1.3ns

    再考虑一种情况: 

    这个时候,MY_DESIGN是纯组合电路。我们的set_input_delay、set_output_delay都是相对于时钟上升沿时刻来说的。

    这个时候没有时钟做参考怎么办 ? 

    我们可以自己虚拟一个跟CLK一样的时钟。  creat_clock -name my_clk -period 2 .剩下的事给之前一样处理。

    综合以上,如果我们知道input_delay的时间,我们就能够约束 DFF之间的组合逻辑、input----DFF的组合逻辑、DFF--output的组合逻辑、Input---Output的组合逻辑。

    这也是我们为什么能够把时序路径划分成  start_point(inputDFF_clk)到endpoint(outputDFF_in)的原因。

    假如我们不知道JANE'的输出延迟信息。我们的input---DFF、Input----Output的组合逻辑块就没有办法保证了。

    这种情况下:我们可以去直接问JANE、或者我们进行一个预估。预估的原则是什么?

    假设: 三个设计,都做一样的约束处理:  设置set_output_delay   60% of  clk 。那么留给我们组合逻辑S的只有40%时间上限了。

    同时 set_input_delay 60% of clk ,对于我们的组合逻辑N而言,只有40%的最大上限。

    如果三个模块都这样设计:  第一个的?组合逻辑,只有40%的上限,我们的N也只有40的上限,这样就能确保有20%的冗余时间足够保证设计可靠性。

    这个原则适用于所有的 小模块的综合。

    现在我们可以说:我们基本能能够约束 DFF之间的组合逻辑、input----DFF的组合逻辑、DFF--output的组合逻辑、Input---Output的组合逻辑。

    这也是我们为什么能够把时序路径划分成  start_point(inputDFF_clk)到endpoint(outputDFF_in)的原因。

     

     组合逻辑N、X、S,以及纯组合逻辑Y都能有效的进行约束了。

      

  • 相关阅读:
    C#文件操作常用相关类(Directory类、File类、Path类)
    winform使用相对路径读取文件的方法
    设置GridView不换行强制GridView不换行GridView强制不换行
    VS2010 Visual Studio2010 保护视力 背景色设置颜色设置
    20190306
    20190325
    常用DOS命令
    项目创建
    VS2015自定义工具栏,往工具栏上添加按钮
    ping不通公网ip时路由器设置
  • 原文地址:https://www.cnblogs.com/mokang0421/p/7594621.html
Copyright © 2020-2023  润新知