0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SDC是如何炼成的?create_generated_clock花式定义方法

冬至子 来源:RTL2GDS 作者:老本 Benjamin 2023-06-27 15:00 次阅读

定义时钟

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

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

图片

基于详细的时钟结构图,定义时钟的命令有两个:create_clock和create_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_clock
report_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; zero
source latency will be used. (UITE-461)


Error: Generated clock 'CLKdiv2 with source pin Udiv/Q' 'fall_edge' is not satisfiable; zero
source 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 CLK


create_generated_clock -name CLKbypass \\
    -source [get_ports CLK] \\
    -master CLK \\
    -divide_by 1 \\
    -combinational \\
    -add \\
    UMUX/Y


create_generated_clock -name CLKdiv2 \\
    -source FFdiv2/CK \\
    -master CLK \\
    -divide_by 2 \\
    -add \\
    UMUX/Y


create_generated_clock -name CLKdiv4 \\
    -source FFdiv4/CK \\
    -master CLK \\
    -divide_by 4 \\
    -add \\
    UMUX/Y


set_clock_groups -physically_exclusive \\
    -group {CLKbypass} \\
    -group {CLKdiv2} \\
    -group {CLKdiv4}

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

图片

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

# create parent clock
create_clock -period 10 CLK


# create divide-by-2, divide-by-4 generated clocks
create_generated_clock -name CLKdiv2 -divide_by 2 FFdiv2/Q -source FFdiv2/CK
create_generated_clock -name CLKdiv4 -divide_by 4 FFdiv4/Q -source FFdiv4/CK


# create "MUXed" versions of all clocks arriving at MUX
create_generated_clock -name CLK_mux -combinational UMUX/A -source UMUX/A
create_generated_clock -name CLKdiv2_mux -combinational UMUX/B -source UMUX/B
create_generated_clock -name CLKdiv4_mux -combinational UMUX/C -source UMUX/C


# create divide-by-3 versions of all clocks arriving at FFdiv3
create_generated_clock -name CLK_mux_div3 \\
    -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLK_mux -add
create_generated_clock -name CLKdiv2_mux_div3 \\
    -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLKdiv2_mux -add
create_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 MUX
set_clock_groups -physically_exclusive \\
    -group {CLK_mux     CLK_mux_div3} \\
    -group {CLKdiv2_mux CLKdiv2_mux_div3} \\
    -group {CLKdiv4_mux CLKdiv4_mux_div3}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SoC芯片
    +关注

    关注

    1

    文章

    608

    浏览量

    34870
  • 驱动电路
    +关注

    关注

    152

    文章

    1520

    浏览量

    108380
  • SDC
    SDC
    +关注

    关注

    0

    文章

    48

    浏览量

    15528
  • PLL电路
    +关注

    关注

    0

    文章

    92

    浏览量

    6397
收藏 人收藏

    评论

    相关推荐

    时序分析的设计约束(SDC

    使用SDC命令create_clock创建时钟,时钟周期20,占空比50%的时钟信号;
    的头像 发表于 11-08 09:12 7653次阅读

    时序约束之时钟约束

    、变占空比 create_clock -name clkin -period 10[get_ports clkin]create_generated_clock -name clkdiv2
    发表于 09-21 11:51

    CLOCK作为外部输出控制Pin的整体延迟?

    , using create_generated_clock, but more importantly I can control the delay from the MMCM
    发表于 10-30 18:04

    create_generate_clock无法找到正确的引脚

    create_generated_clock -name dut_clk -source [get_ports InClk] -divide_by 6 [get_pins u_clk_div / CLK_OUT]我已经通过
    发表于 11-05 11:32

    Xilinx工具vivado使用约束命令时出现警告的解决办法?

    (TX_CLK_o)。我想使用下面的约束命令来设置时钟转发,但我在合成时发现了警告。警告是什么意思?// constraints命令create_generated_clock -name TX_CLK_o
    发表于 05-04 08:04

    请问如何约束作为输入时钟复制的时钟?

    的问题是如何约束这个TDM_SCKx4输出时钟。我试过这个:create_generated_clock -name TDM_SCKx4 -source [get_pins
    发表于 08-18 10:16

    静态时序分析

    ]create_generated_clock -name CORE_CLK -divide_by 1 -source SYS_CLK [get_pins UAND1/Z]什么时候定义一个新的master clock,而不是
    发表于 04-20 16:17

    今日说“法”:TimeQuest约束外设之诡异的Create Generated Clocks

    create_generated_clock -name {clk_div_r} -source [get_ports {sysclk}] -divide_by 2 -master_clock {sysclk
    发表于 05-06 16:24

    FPGA案例之衍生时钟约束

    create_generated_clock -name clk_samp -source [get_pins clk_gen_i0/clk_core_i0/clk_tx] -divide_by 32 [get_pins
    的头像 发表于 11-17 16:28 2297次阅读
    FPGA案例之衍生时钟约束

    时序分析的设计约束SDC怎么写呢?

    使用SDC命令create_clock创建时钟,时钟周期20,占空比50%的时钟信号
    的头像 发表于 06-18 09:42 4263次阅读
    时序分析的设计约束<b class='flag-5'>SDC</b>怎么写呢?

    SDC是如何炼成的?怎么去验收SDC呢?

    STA是由SDC驱动的,所以SDC的完整性、正确性和一致性直接决定着综合、布局布线以及STA的有效性。
    的头像 发表于 06-28 17:17 3748次阅读
    <b class='flag-5'>SDC</b>是如何<b class='flag-5'>炼成</b>的?怎么去验收<b class='flag-5'>SDC</b>呢?

    时序分析基本概念介绍&lt;generate clock&gt;

    今天我们要介绍的时序分析概念是generate clock。中文名为生成时钟。generate clock定义sdc中,是一个重要的时钟概念。
    的头像 发表于 07-06 10:34 2195次阅读
    时序分析基本概念介绍&lt;generate <b class='flag-5'>clock</b>&gt;

    探讨下clock的基本定义(上)

    Clock分为两大类,一类是root clock,其定义指令是create_clock;另外一类是generated
    的头像 发表于 07-06 15:31 2169次阅读
    探讨下<b class='flag-5'>clock</b>的基本<b class='flag-5'>定义</b>(上)

    探讨下clock的基本定义(下)

    要探讨今天的主题,首先需要跟大家一起学习下clock latency这个基本概念。Clock latency通俗意义上是指clock定义点到cloc
    的头像 发表于 07-06 15:34 4122次阅读
    探讨下<b class='flag-5'>clock</b>的基本<b class='flag-5'>定义</b>(下)

    请问create_generated_clock该怎么使用呢?

    FPGA设计中,生成时钟分为两大类:自动生成时钟和用户生成时钟。
    的头像 发表于 01-25 09:06 1931次阅读
    请问<b class='flag-5'>create_generated_clock</b>该怎么使用呢?