定義時(shí)鐘
從最早的芯片規(guī)格定義分解出系統(tǒng)所需要的時(shí)鐘和頻率,以及各個(gè)模塊需要的時(shí)鐘和頻率。SoC的時(shí)鐘一般是由PLL產(chǎn)生,然后經(jīng)過(guò)時(shí)鐘生成電路和分配網(wǎng)絡(luò),最終給具體的功能模塊使用。一般地,第三方IP供應(yīng)商都會(huì)提供比較成熟的SDC,SoC集成時(shí)需稍作修改。對(duì)于自研的IP和SoC頂層,設(shè)計(jì)人員在提供RTL的同時(shí),也需提供一份時(shí)鐘結(jié)構(gòu)圖,一方面是方便撰寫(xiě)SDC,另一方面對(duì)后端PnR有針對(duì)性的進(jìn)行CTS也非常有幫助。
時(shí)鐘結(jié)構(gòu)圖分不同的層次,或抽象或具體,看具體的需要了,下面是一顆MCU全局時(shí)鐘分布的結(jié)構(gòu)圖,大家有個(gè)認(rèn)識(shí)就可以:
基于詳細(xì)的時(shí)鐘結(jié)構(gòu)圖,定義時(shí)鐘的命令有兩個(gè):create_clock和create_generated_clock
其中,create_clock命令比較簡(jiǎn)單易懂,格式如下:
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 需要指定源時(shí)鐘(master clock)的master_pin,在CTS時(shí),默認(rèn)會(huì)去balance這兩個(gè)時(shí)鐘(即generated clock 和 master clock),讓skew盡可能小。而且在計(jì)算generated clock的clock latency時(shí),會(huì)把從master clock pin 到generated clock pin之間的delay也考慮在內(nèi)。在工具中report_timing的時(shí)候,通過(guò)選項(xiàng)-path_type full_clock_expanded可以將master clock的部分也展開(kāi)。
report_timing -path_type full_clock
report_timing -path_type full_clock_expanded
需要注意:在使用create_generated_clock時(shí),需要保證電路結(jié)構(gòu)和命令的效果是一致的,否則工具在report_timing時(shí)會(huì)報(bào)錯(cuò),比如下面的錯(cuò)誤(UITE-461),這時(shí)就要仔細(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)
簡(jiǎn)單2分頻
先看一個(gè)簡(jiǎn)單的2分頻的實(shí)際的例子,命令和效果圖如下:
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分頻實(shí)例
下面是3分頻的實(shí)例,-edge選項(xiàng)中{3 5 9}分別表示SYSCLK的第3、5、9個(gè)時(shí)鐘沿(clock edge),也分別對(duì)應(yīng)DIV3B的一個(gè)完整時(shí)鐘周期(上升、下降、上升)的時(shí)鐘沿時(shí)間點(diǎn)。而-edge_shift選項(xiàng){2.2 2.2 2.2}表示將DIV3B每個(gè)時(shí)鐘沿都往后延遲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的實(shí)例
create_generated_clock使用-invert/-preinvert選項(xiàng)都表明generated clock與master clock相位相反,但這兩個(gè)選項(xiàng)的區(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]
同一點(diǎn)定義多個(gè)generated clock
在實(shí)際電路中比較常見(jiàn)的情況是,不同的場(chǎng)景下使用不同頻率的時(shí)鐘來(lái)驅(qū)動(dòng)電路,如下圖所示,同一個(gè)時(shí)鐘,與經(jīng)過(guò)二分頻,四分頻后的時(shí)鐘經(jīng)過(guò)MUX輸出給電路使用。
這種情況下,需要在UMUX輸出點(diǎn)定義三個(gè)時(shí)鐘CLKbypass/CLKdiv2/CLKdiv4,而且這三個(gè)時(shí)鐘在物理上是不能共存的(physically_exclusive),可以考慮使用以下命令來(lái)定義時(shí)鐘:
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}
注意,這種方式定義時(shí)鐘看似合理,但是容易造成問(wèn)題,因?yàn)樵贑LK和UMUX/Y之間有三條不同的路徑,延遲大小不同,所以在計(jì)算timing時(shí),在launch path和capture path上選擇的路徑會(huì)不同,帶來(lái)悲觀的影響,如下圖所示,也有可能在計(jì)算min_pulse_width時(shí)造成假的違例。
在Solvnet上給出了更恰當(dāng)?shù)奶幚矸绞剑唧w命令如下:
# 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芯片
+關(guān)注
關(guān)注
1文章
608瀏覽量
34865 -
驅(qū)動(dòng)電路
+關(guān)注
關(guān)注
152文章
1520瀏覽量
108369 -
SDC
+關(guān)注
關(guān)注
0文章
48瀏覽量
15528 -
PLL電路
+關(guān)注
關(guān)注
0文章
92瀏覽量
6397
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論