首页/文章/ 详情

STA | 5. SDC是如何炼成的?时钟定义篇

8月前浏览3261

前面几篇文章分别介绍了,Cell Delay,Net Delay,以及Path Delay。从《STA | 3. 如何做一条合格的Path》一文中可以看出,对于同步数字电路,只要在时序单元的clock pin定义好了时钟,STA工具或引擎就会默认去检查setup/hold time,否则工具不知道如何进行STA分析。由此可见,定义时钟是STA的第一步,也是写SDC的第一步。

 

定义时钟

从最早的芯片规格定义分解出系统所需要的时钟和频率,以及各个模块需要的时钟和频率。SoC的时钟一般是由PLL产生,然后经过时钟生成电路和分配网络,最终给具体的功能模块使用。般地,第三方IP供应商都会提供比较成熟的SDC,SoC集成时需稍作修改。对于自研的IP和SoC顶层,设计人员在提供RTL的同时,也需提供一份时钟结构图,一方面是方便撰写SDC,另一方面对后端PnR有针对性的进行CTS也非常有帮助。

时钟结构图分不同的层次,或抽象或具体,看具体的需要了,下面是一颗MCU全局时钟分布的结构图,大家有个认识就可以:

基于详细的时钟结构图,定义时钟的命令有两个:create_clockcreate_generated_clock

其中,create_clock命令比较简单易懂,格式如下:

    create_clock [-name clock_name] \    -period period_value \    [-waveform edge_list] \    [-add] \    [source_objects]

     

    create_generated_clock命令解析


    create_generated_clock命令格式如下,主要是定义generated clock和master clock的关系:

      create_generated_clock [-name clock_name] \    -source master_pin \    [-master_clock clock] \    [-edge edge_list] \    [-edge_shift shift_list] \    [-divide_by factor] \    [-multiply_by factor] \    [-duty_cycle percent] \    [-combinational]    [-invert] \    [-add] \    source_objects


      create_generated_clock 需要指定源时钟(master clock)的master_pin,在CTS时,默认会去balance这两个时钟(即generated clock 和 master clock),让skew尽可能小。而且在计算generated clock的clock latency时,会把从master clock pin 到generated clock pin之间的delay也考虑在内。在工具中report_timing的时候,通过选项-path_type full_clock_expanded可以将master clock的部分也展开。

        report_timing -path_type full_clockreport_timing -path_type full_clock_expanded


        需要注意:在使用create_generated_clock时,需要保证电路结构和命令的效果是一致的,否则工具在report_timing时会报错,比如下面的错误(UITE-461),这时就要仔细检查分频电路结构了。

          Error: Generated clock 'CLKdiv2 with source pin Udiv/Q' 'rise_edge' is not satisfiable; zerosource latency will be used. (UITE-461)Error: Generated clock 'CLKdiv2 with source pin Udiv/Q' 'fall_edge' is not satisfiable; zerosource latency will be used. (UITE-461)


          简单2分频

          先看一个简单的2分频的实际的例子,命令和效果图如下:

            create_clock -name SYSCLK \    -period 2 \    [get_ports SYSCLK] create_generated_clock -name DIVIDE \    -source [get_ports SYSCLK] \    -divide_by 2 \    [get_pins FF1/Q]

            考虑了edge/edge_shift的3分频实例

            下面是3分频的实例,-edge选项中{3 5 9}分别表示SYSCLK的第3、5、9个时钟沿(clock edge),也分别对应DIV3B的一个完整时钟周期(上升、下降、上升)的时钟沿时间点。而-edge_shift选项{2.2 2.2 2.2}表示将DIV3B每个时钟沿都往后延迟2.2ns,命令和效果图如下:

              create_clock -name SYSCLK \    -period 2.2 \    [get_ports SYSCLK]create_generated_clock -name DIV3B \    -source [get_ports SYSCLK]  \    -edges { 3 5 9 } \    [get_pins U3/Q]create_generated_clock -name DIV3C \    -source [get_ports SYSCLK]  \    -edges { 3 5 9 } \    -edge_shift {2.2 2.2 2.2} \    [get_pins U4/QN]

              考虑invert/preinvert的实例

              create_generated_clock使用-invert/-preinvert选项都表明generated clock与master clock相位相反,但这两个选项的区别是:

              • preinvert : Creates a generated clock based on the inverted sense of the master clock.

              • invert : Creates an inverted generated clock based on the non-inverted sense of the master clock.

              命令和效果图如下:

                create_generated_clock -name gclk_pos \-source [get_pins FF1/CLK]  \-divide_by 2 \[get_pins FF1/Q]create_generated_clock -name gclk_neg \-source [get_pins FF1/CLK] \-divide_by 2 \-preinvert \[get_pins FF1/Q]create_generated_clock -name glk_inv \-source [get_pins FF1/CLK] \-divide_by 2 \-invert \[get_pins FF1/Q]


                同一点定义多个generated clock

                在实际电路中比较常见的情况是,不同的场景下使用不同频率的时钟来驱动电路,如下图所示,同一个时钟,与经过二分频,四分频后的时钟经过MUX输出给电路使用。

                这种情况下,需要在UMUX输出点定义三个时钟CLKbypass/CLKdiv2/CLKdiv4,而且这三个时钟在物理上是不能共存的(physically_exclusive),可以考虑使用以下命令来定义时钟:

                  create_clock -period 10 CLKcreate_generated_clock -name CLKbypass \    -source [get_ports CLK] \    -master CLK \    -divide_by 1 \    -combinational \    -add \    UMUX/Ycreate_generated_clock -name CLKdiv2 \    -source FFdiv2/CK \    -master CLK \    -divide_by 2 \    -add \    UMUX/Ycreate_generated_clock -name CLKdiv4 \    -source FFdiv4/CK \    -master CLK \    -divide_by 4 \    -add \    UMUX/Yset_clock_groups -physically_exclusive \    -group {CLKbypass} \    -group {CLKdiv2} \    -group {CLKdiv4}


                  注意,这种方式定义时钟看似合理,但是容易造成问题,因为在CLK和UMUX/Y之间有三条不同的路径,延迟大小不同,所以在计算timing时,在launch path和capture path上选择的路径会不同,带来悲观的影响,如下图所示,也有可能在计算min_pulse_width时造成假的违例。

                  在Solvnet上给出了更恰当的处理方式,具体命令如下:

                    # create parent clockcreate_clock -period 10 CLK# create divide-by-2, divide-by-4 generated clockscreate_generated_clock -name CLKdiv2 -divide_by 2 FFdiv2/Q -source FFdiv2/CKcreate_generated_clock -name CLKdiv4 -divide_by 4 FFdiv4/Q -source FFdiv4/CK# create "MUXed" versions of all clocks arriving at MUXcreate_generated_clock -name CLK_mux -combinational UMUX/A -source UMUX/Acreate_generated_clock -name CLKdiv2_mux -combinational UMUX/B -source UMUX/Bcreate_generated_clock -name CLKdiv4_mux -combinational UMUX/C -source UMUX/C# create divide-by-3 versions of all clocks arriving at FFdiv3create_generated_clock -name CLK_mux_div3 \    -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLK_mux -addcreate_generated_clock -name CLKdiv2_mux_div3 \    -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLKdiv2_mux -addcreate_generated_clock -name CLKdiv4_mux_div3 \    -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLKdiv4_mux -add# apply physical exclusivity to all clock families (generated clocks included)# which are exclusive due to statically switched MUXset_clock_groups -physically_exclusive \    -group {CLK_mux     CLK_mux_div3} \    -group {CLKdiv2_mux CLKdiv2_mux_div3} \    -group {CLKdiv4_mux CLKdiv4_mux_div3}
                    来源:白话IC
                    电路芯片UMSCL
                    著作权归作者所有,欢迎分享,未经许可,不得转载
                    首次发布时间:2023-09-07
                    最近编辑:8月前
                    白山头
                    签名征集中
                    获赞 10粉丝 3文章 155课程 0
                    点赞
                    收藏
                    未登录
                    还没有评论

                    课程
                    培训
                    服务
                    行家

                    VIP会员 学习 福利任务 兑换礼品
                    下载APP
                    联系我们
                    帮助与反馈