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

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

日志

Timing Constraint

热度 5已有 3649 次阅读| 2019-6-18 14:52 |个人分类:DC|系统分类:芯片设计

1. syntax 检查: dcprocheck TOP.con

2. Timing budget
    2.1 综合时,如果不知道外部的timing的情况,一般
         Input delay: 内部保留40%
         Output delay: 内部保留40%
              create_clock -period 10 [get_ports clk]
              set_input_delay -max 6 -clock clk [all_inputs]
              remove_input_delay [get_ports clk]
              set_output_delay -max 6 -clock clk [all_outputs]

    2.2 推荐使用Register Output
          set CLK2Q_MAX 1.5;   #Assume slowest register driving input port
          set CLK2Q_MIN 0.9;   #Assume fastest register driving output port
          set ALL_INPUTS_EXCLUDE_CLK [remove_from_collection [all_inputs] [get_ports Clk]]
          set_input_delay -max $CLK2Q_MAX -clock CLK $ALL_INPUTS_EXCLUDE_CLK
          set_output_delay -max [expr {$period - $CLK2Q_MIN}] -clock CLK [all_outputs]

3. Timing constraint:
   3.0 综合时,只对setup time进行约束
   3.1 Reg2Reg: create_clock
        需要定义clock,还要考虑uncertainty和latency
        3.1.1 pre-layout uncertainty = skew + jitter + margin:   #set_clock_uncertainty -setup 0.2 [get_clocks clk]
                     jitter: 一般可以从PLL datasheet得到
                    skew
        3.1.2 clock domain uncertain
                 set_clock_uncertainty -setup Tu -from clk1 -to clk2
        3.1.3 latency: 分为source latency和network latency
                a.               
                      source_latency: set_clock_latency -source -max 0.3 [get_clocks clk]
                      network_latency: set_clock_latency -max 0.3 [get_clocks clk]     ;#没有-source就表示是network latency
                      #latency可以设置为rise, fall, min, max,
                      #-max用于对setup time计算时进行约束
                      #-min用于对hold time计算时进行约束
                      #-min,-max不可以同时在一个命令中使用,必须在分开的命令中使用,例如
                                 set_intput_delay -clock_fall -max -clock Clk 0.30 [get_ports A]
                                 set_intput_delay -clock_fall -min -clock Clk 0.04 [get_ports A]
               b.    一般计算时,外部的register默认使用与current_design一样的latency
                     
                     但是,当外部的register和current_design的latency不同,该怎么办?例如:
                                                        input_launch_register     current_design    output_sample_register
                              source_latency                0.18                        0.30                            0.30
                              network_latency              0.12                        0.12                            0.07
                    b.1 traditional method
                         create_clock -period 2 [get_ports Clk]
                         create_clock -period 2 -name Clk_input_launch_register      ;#launch register's virtual clock
                         create_clock -period 2 -name Clk_output_capture_register   ;#Capture register's virtual clock
                         set_source_latency -source 0.3 [get_clock Clk]
                         set_source_latency -source 0.18 [get_clocks Clk_input_launch_register]
                         set_source_latency -source 0.3 [get_clocks Clk_output_capture_register]
                         set_source_latency 0.12 [get_clocks Clk]
                         set_source_latency 0.12 [get_clocks Clk_input_launch_register]
                         set_source_latency 0.07 [get_clocks Clk_output_capture_register]
                         set_input_delay -max 0.6 -clock Clk_input_launch_register [all_inputs]
                         set_output_delay -max 0.8 -clock Clk_input_launch_register [all_outputs]
                   b.2  "included" method
                         create_clock -period 2 [get_ports Clk]
                         set_source_latency -source 0.3 [get_clock Clk]
                         set_source_latency 0.12 [get_clocks Clk]
                         set_input_delay -max [expr {0.6+0.18}]  -clock Clk -source_latency_included [all_inputs];
                                          #launch_register的network_latency和current_design的network_latency是一样的,只有source_latency不一样,
                                          #所以用-source_latency_included把current_design的source_latency在launch_register中去除,并把0.18加到input_delay上去
                         set_output_delay -max [expr {0.8-0.07}] -clock Clk -network_latency_included [all_outputs]
                                         #capture_register的source_latency和current_design的source_latency是一样的,只有network_latency不一样,
                                         #所以用-network_latency_included把current-design的network_latency在capture_register中去除,并把0.07从output_delay中减去
     

         3.1.4 transition time: 对clock的rise和fall time建模
                 set_clock_transition -max Tt [get_clocks clk]
         3.1.5 pre-layout clock
                      create_clock -period 5 [get_ports clk]
                                set_clock_latency -source -max 4 [get_clocks clk]
                                set_clock_latency -max 2 [get_clocks clk]
                                set_clock_uncertainty -setup 0.5 [get_clocks clk]
                                set_clock_transition -max 0.08 [get_clocks clk]
         3.1.6 post-layout clock    #network clock latency已经在post-layout netlist中已经包含了
                      create_clock -period 5 [get_ports clk]
                      set_clock_latency -source -max 4 [get_clocks clk]
                      set_propagated_clock [get_clocks clk]           ;# 这个命令会强制analyzer计算实际时钟树的skew, latency和transition time,只要考虑jitter
                      set_clock_uncertainty -setup 0.2 [get_clocks clk]
         3.1.7 clock object nameclock port name不一样
                 create_clock -period 2 -name MY_CLK [get_ports Clk]
                 set_input_delay -max 0.6 -clock MY_CLK [get_ports A]
                        clock object name: 由-name设定
                        clock port name: design上面的input port或get_nets等命令的返回值
                        set_input_delay的"-name"使用的是clock object name
         3.1.8 duty-cycle默认是50%,如果不是,需要用-waveform设定
                 create_clock -period 2 -waveform {0 0.6} -name MY_CLK [get_ports Clk]
                        #上升沿:0ns     下降沿: 0.6ns    时钟周期: 2ns    => duty_cycle = 0.6/2 = 30%
         3.1.9 时钟的偏置(offset)
                 a. create_clock -period 2 -waveform {0.4 1.4} -name My_CLK [get_ports Clk]
                        #上升沿:0.4ns     下降沿: 1.4ns    时钟周期: 2ns      第二个上升沿: 2.4ns
                        时钟偏置了0.4ns, 但是不推荐使用这种方法
                        在多时钟设计中,用-waveform设置的偏置值会使DC使用错误的launch或capture edge,从而造成under-或over-constrain
                        -waveform建议只是用在duty-cycle或clock invert的设置上
                b. 要设置clock offset,建议使用set_clock_latency
                        create_clock -period 2 -name MY_CLK [get_ports Clk]
                        set_clock_latency -rise 0.4 [get_clocks MY_CLK]
                        set_clock_latency -fall 0.4 [get_clocks MY_CLK]
       3.1.10 复杂时钟(不太会使用)
             
               create_clock -period 1.6 -waveform {0 0.4 0.6 1.4} -name My_CLK [get_ports CLK]
                       #时钟周期:1.6ns         1st上升沿: 0ns      1st下降沿:0.4ns       2nd上升沿: 0.6ns      2nd下降沿:1.4ns
        3.1.11multiple clock
              a. DC中的multiple_clock的定义
                  几个clock是从一个时钟源获取的,有的clock在current上并没有clock_port, 单一的port有几种约束
                 
              b. multiple clock相关的input_delay
                
                              create_clock -period -2.0 [get_ports CLKC]
                              create_clock -period 3.0 -name CLKB
                              set_input_delay 0.55 -clock CLKB -max [get_ports IN1]
             c. 相关的input_delay的计算, 可以用report_interclock_relation获取相关的信息
                 report_interclock_relation:提供不同clock驱动的register之间的timing path的common clock period的信息
                       
                        说明:从这个报告中,CLKB和CLKC有两个方向需要计算时序
                                  可以看到CLKB的周期是3,CLKC的周期是2,两个clock的共同最小周期是6
                                  所以CLKB需要计算2个周期(count1), CLKC需要计算3个周期(count2)
                      这种path可以用set_false_path -from CLKB -to CLKC来去除
           d. multi_clock相关的output_delay
                       set_output_delay -max 0.15 -clock CLKD [get_ports OUT1]
                       set_output_delay -max 0.52 -clock CLKE -add_delay [get_ports OUT1]
           e. output_delay相对于multiple_clock的计算
                       CLK: 3GHz     CLKD:CLK/4=3/4GHz        CLKC: CLK/6=0.5GHz                   CLKE:CLK/3=1GHz
                                           CLKD:4/3ns                     CLKC: 2ns                                      CLKE: 1ns
                       common period: 4ns
                      
                       DC根据计算: CLKC->CLKD: 0.67-0.15=0.52,    CLKC->CLKE: 1-0.52=0.48
                       因此,DC会算出最大output_path_delay只允许0.48ns
           f. multi_clock之间的uncertainty的计算
              如果lauch_clk和capture_clk都定义了uncertainty time,DC只会使用capture_clk的uncertainty time
              如果知道时钟之间的uncertainty,那么可以使用set_clock_uncertainty -setup 0.15 -from [get_clocks launch_clk] -to [get_clocks capture_clk]
        3.1.11generated clock
                 create_generated_clock -source master_pin source_objects
                       [-name clk_name] [-add] [-divide_by div_factor] [-multiply_by multi_factor]
                       [-duty_cycle percent] [invert] [-preinvert] [-edges edge_list] [-edge_shift edge_shift_list]
                       [-combinational]
                
                 但在RTL中,不存在FF1,可以用gtech cell/pin,
                 例如,RTL有个div_clk,那么对应的gtech中就成为div_clk_reg/Q(其余的div_clk_reg/<p>in为:preset, clear, QN, next_state, clocked_on
                           create_generated_clk -divide_by 2 -name CLK_DIV2 -source [get_ports CLK] [get_pins div_clk_reg/Q]
               
                
             

   
                
   3.2 Input2Reg: set_input_delay
         a. 默认是外部用clock object的上升沿,但如果用下降沿驱动
                  set_input_delay -max 3 -clock Clk -clock_fall [get_ports A]
         b. 如果input port由两个register通过组合电路驱动的话, 假设一个register使用Clk的上升沿,另一个register使用Clk的下降沿
                 
                  set_input_delay -max 0.3 -clock Clk -clock_fall [get_ports A]
                  set_input_delay -max 1.2 -clock Clk -add_delay [get_ports A]
                  #DC在综合时需要同时满足两种input_delay造成的时序要求
         c. 在input port上的额外的load也会增加transition time, 可以用set_load命令加上
            set_load 0.012 [get_ports INPUT_A]
            但是,如果你是用set_input_transition设置transition时间的,那么即使使用set_load,DC也不会在计算中采用这个值
           set_load只和set_driving_cell配合使用才有用 
3.3 Reg2Output: set_output_delay
         会使用set_clock_latency/uncertainty命令产生的latency和uncertainty
        
   3.4 pure combinational_path: virtual clock:
            create_clock -period 2 -name vclk
            set_clock_uncertainty -setup 0.3 [get_clocks vclk]
            set_input_delay -max 0.4 -clock vclk [get_ports A]
            set_output_delay -max 0.4 -clock vclk [get_ports B]

4. input transition和output load
    DC和PT判断timing pass还是fail的依据是: data_required_time - data_arrival_time = slack,如果slack>0,就是pass,否则就fail
        data_arrival_time和data_required_time的计算(假设clock uncertainty和latency都是0)
                                      input_delay: 由set_input_delay设定;       input_gate_delay: 和input_port相连的那个gate
                                      output_delay: 由set_output_delay设定; output_gate_delay: 驱动output_port的那个gate
                  reg2reg path:     Tarrival = Tck2Q (Launch DFF) + combinational_gates_path_delay
                                           Trequired = Period - Tsetup (Capture DFF)
                  input2reg path:   Tarrival = input_delay+ input_gate_delay + combinational_gates path_delay
                                           Trequired = Period - Tsetup(Capture DFF)
                  output2reg path: Tarrival = TCK2Q(launch DFF) + combinational_gate_path_delay + output_gate_delay
                                           Trequired = Period - output_delay
    DC计算input/output_gate delay依赖input transition time和output capacitive load, DC会默认output port上的load是0,input port上的transition time是0,这会导致IO path的delay变得最优的结果,从而data arrival time和实际电路相比也会相应变小。
   所以,必须设定output port上的load和input port上的transition time
   4.1 output load的设定
              
      set_load [expr {30.0/1000}] [get_ports B]    ;#   设定output_port B所需要驱动的output_load为30fF
                                                   #   假设工艺库所使用的单位是pF(.lib文件中可以查到)
                                                                       #   chip level常用,load的大小一般在datasheet的AC参数部分可以找到
      set_load [load_of my_lib/AN2/A] [get_ports B]       ;# block level综合时,一般没法确定负载,假设要驱动的load是1个AN2
      set_load [expr {[load_of my_lib/inv1a0/A] * 3}] [get_ports B]    ;# 假设要驱动的load是3个inv1a0
       4.1.1 复杂情况
               
              output port B需要驱动两个register,一个上升沿采样,一个下降沿采样
                   set_output_delay -max 2.5 -clock Clk [get_ports B]
                   set_output_delay -max 0.7 -clock Clk -clock_fall -add_delay [get_ports B]
                   DC计算S的最大延时时,会分别计算,然后取两者中较小的一个。
   4.2 input transition time的设定
        a. chip level: datasheet的AC参数列表中一般找得到
                set_input_transition 0.12 [get_ports A]
        b. block level综合不知道时,假设一个驱动的cell
               set_driving_cell -lib_cell OR3B [get_ports A]
            或set_driving_cell -lib_cell FD1 -pin Qn [get_ports A]    ;#如果没有使用"-pin",DC会使用cell的第一个output pin
                        #在使用set_driving_cell命令时,这个cell的DRC属性也会被加入,如果不想引入DRC,就使用set_driving_cell -no_design_rule
        c. DC计算data_arrival_time的方法(set_input_delay和set_driving_cell)
          
             data_arrival_time = input_max_delay + ring_time/falling transition time on input port
         d. 当datasheet指定了多组input_delay和load时
                0.6ns with 50fF load,     0.48ns with 0.0fF load
                写约束时,set_input_delay应该使用zero load的那个value(上面的例子中应该使用0.48ns)
  
5. area
    compile_ultra:(DCT):自动将area的目标设为0
    report_area

6. constraint file
    DC运行constraint file: source top.con
    将旧的DC script转成Tcl格式:dc-transcript old_script.scr new_script.tcl
    DC batch mode:   dc_shell -topo -f run.tcl | tee -i dc.log
                      -i: ignore the interrupt like <Ctrl-C>

6. constraint file推荐形式:扩展名使用.con或.tcl
    reset_design                     ;#去除旧的constraint
    create_clock -period 2 [get_ports clk]
    report_port -verbose;        # 检查port上的约束
    report_clock;                  #检查clock 属性的约束
    report_clock -skew;           #检查clock skew的约束
    report_clock -skew -attr;    #检查clock skew和属性的约束
    check_timing;                   #检查constraint的缺陷:
                                              1. 例如endpoint没有constraint    2. clock没有constraint  
                                              3. clock的constraint互相overlapping...
                                              4. clock-gating和clock互相影响   。。。
    把报告结果存入文件
        redirect  -tee  -file precompile.rpt {link};  #等价于 link > precompile.rpt, 但是-tee同时可以在screen上显示
        redirect -append -tee -file precompile.rpt {check_design};    #等价于 check_deign >> precompile.rpt
   



5

点赞

刚表态过的朋友 (5 人)

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 11

    粉丝
  • 2

    好友
  • 18

    获赞
  • 7

    评论
  • 3608

    访问数
关闭

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

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

GMT+8, 2024-4-27 10:34 , Processed in 0.121014 second(s), 15 queries , Gzip On, Redis On.

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