0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SDC是如何煉成的?create_generated_clock花式定義方法

冬至子 ? 來源:RTL2GDS ? 作者:老本 Benjamin ? 2023-06-27 15:00 ? 次閱讀

定義時鐘

從最早的芯片規(guī)格定義分解出系統(tǒng)所需要的時鐘和頻率,以及各個模塊需要的時鐘和頻率。SoC的時鐘一般是由PLL產(chǎn)生,然后經(jīng)過時鐘生成電路和分配網(wǎng)絡(luò),最終給具體的功能模塊使用。一般地,第三方IP供應(yīng)商都會提供比較成熟的SDC,SoC集成時需稍作修改。對于自研的IP和SoC頂層,設(shè)計人員在提供RTL的同時,也需提供一份時鐘結(jié)構(gòu)圖,一方面是方便撰寫SDC,另一方面對后端PnR有針對性的進(jìn)行CTS也非常有幫助。

時鐘結(jié)構(gòu)圖分不同的層次,或抽象或具體,看具體的需要了,下面是一顆MCU全局時鐘分布的結(jié)構(gòu)圖,大家有個認(rèn)識就可以:

圖片

基于詳細(xì)的時鐘結(jié)構(gòu)圖,定義時鐘的命令有兩個: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的關(guān)系:

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時,默認(rèn)會去balance這兩個時鐘(即generated clock 和 master clock),讓skew盡可能小。而且在計算generated clock的clock latency時,會把從master clock pin 到generated clock pin之間的delay也考慮在內(nèi)。在工具中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時,需要保證電路結(jié)構(gòu)和命令的效果是一致的,否則工具在report_timing時會報錯,比如下面的錯誤(UITE-461),這時就要仔細(xì)檢查分頻電路結(jié)構(gòu)了。

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),也分別對應(yīng)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相位相反,但這兩個選項的區(qū)別是:

  • 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

在實際電路中比較常見的情況是,不同的場景下使用不同頻率的時鐘來驅(qū)動電路,如下圖所示,同一個時鐘,與經(jīng)過二分頻,四分頻后的時鐘經(jīng)過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上給出了更恰當(dāng)?shù)奶幚矸绞?,具體命令如下:

# 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}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SoC芯片
    +關(guān)注

    關(guān)注

    1

    文章

    592

    瀏覽量

    34814
  • 驅(qū)動電路
    +關(guān)注

    關(guān)注

    152

    文章

    1515

    瀏覽量

    108240
  • SDC
    SDC
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    15510
  • PLL電路
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    6381
收藏 人收藏

    評論

    相關(guān)推薦

    時序分析的設(shè)計約束(SDC

    使用SDC命令create_clock創(chuàng)建時鐘,時鐘周期20,占空比50%的時鐘信號;
    的頭像 發(fā)表于 11-08 09:12 ?7527次閱讀

    時序約束之時鐘約束

    、變占空比 create_clock -name clkin -period 10[get_ports clkin]create_generated_clock -name clkdiv2
    發(fā)表于 09-21 11:51

    CLOCK作為外部輸出控制Pin的整體延遲?

    , using create_generated_clock, but more importantly I can control the delay from the MMCM
    發(fā)表于 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]我已經(jīng)通過
    發(fā)表于 11-05 11:32

    Xilinx工具vivado使用約束命令時出現(xiàn)警告的解決辦法?

    (TX_CLK_o)。我想使用下面的約束命令來設(shè)置時鐘轉(zhuǎn)發(fā),但我在合成時發(fā)現(xiàn)了警告。警告是什么意思?// constraints命令create_generated_clock -name TX_CLK_o
    發(fā)表于 05-04 08:04

    請問如何約束作為輸入時鐘復(fù)制的時鐘?

    的問題是如何約束這個TDM_SCKx4輸出時鐘。我試過這個:create_generated_clock -name TDM_SCKx4 -source [get_pins
    發(fā)表于 08-18 10:16

    靜態(tài)時序分析

    ]create_generated_clock -name CORE_CLK -divide_by 1 -source SYS_CLK [get_pins UAND1/Z]什么時候定義一個新的master clock,而不是
    發(fā)表于 04-20 16:17

    今日說“法”:TimeQuest約束外設(shè)之詭異的Create Generated Clocks

    create_generated_clock -name {clk_div_r} -source [get_ports {sysclk}] -divide_by 2 -master_clock {sysclk
    發(fā)表于 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
    的頭像 發(fā)表于 11-17 16:28 ?2269次閱讀
    FPGA案例之衍生時鐘約束

    時序分析的設(shè)計約束SDC怎么寫呢?

    使用SDC命令create_clock創(chuàng)建時鐘,時鐘周期20,占空比50%的時鐘信號
    的頭像 發(fā)表于 06-18 09:42 ?4089次閱讀
    時序分析的設(shè)計約束<b class='flag-5'>SDC</b>怎么寫呢?

    SDC是如何煉成的?怎么去驗收SDC呢?

    STA是由SDC驅(qū)動的,所以SDC的完整性、正確性和一致性直接決定著綜合、布局布線以及STA的有效性。
    的頭像 發(fā)表于 06-28 17:17 ?3541次閱讀
    <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中,是一個重要的時鐘概念。
    的頭像 發(fā)表于 07-06 10:34 ?2095次閱讀
    時序分析基本概念介紹&lt;generate <b class='flag-5'>clock</b>&gt;

    探討下clock的基本定義(上)

    Clock分為兩大類,一類是root clock,其定義指令是create_clock;另外一類是generated
    的頭像 發(fā)表于 07-06 15:31 ?1989次閱讀
    探討下<b class='flag-5'>clock</b>的基本<b class='flag-5'>定義</b>(上)

    探討下clock的基本定義(下)

    要探討今天的主題,首先需要跟大家一起學(xué)習(xí)下clock latency這個基本概念。Clock latency通俗意義上是指clock定義點到cloc
    的頭像 發(fā)表于 07-06 15:34 ?3830次閱讀
    探討下<b class='flag-5'>clock</b>的基本<b class='flag-5'>定義</b>(下)

    請問create_generated_clock該怎么使用呢?

    FPGA設(shè)計中,生成時鐘分為兩大類:自動生成時鐘和用戶生成時鐘。
    的頭像 發(fā)表于 01-25 09:06 ?1733次閱讀
    請問<b class='flag-5'>create_generated_clock</b>該怎么使用呢?