set_clock_groups
set_clock_groups 指令有三個選項:“-asynchronous”,“-logically_exclusive”,“-physically_exclusive”
當 set_clock_groups 指令中多個 groups 被指定時,同一個時鐘不能出現在不同的 group 中,但是可以存在于多次 set_clock_groups 指令使用。
例如 set_clock_groups -asynchronous -group {ClkA ClkB} -group {ClkC} -group { ClkA ClkD},其中ClkA 存在于兩個group中是不允許的。
但是 set_clock_groups -asynchronous -group {ClkA ClkB} -group {ClkC}
set_clock_groups -asynchronous -group {ClkA} -group {ClkD}
上面兩個連續聲明是合法的。
Asynchronous Clocks
多個時鐘之間相位關系不确定,就可以将這兩個(或多個)時鐘是asynchronous,一般而言當時鐘來自于不同的PLL或者晶振時,時鐘之間的相位是不固定的。
creat_clock-period 10 -name ClkA [get_ports CLKA]
creat_clock-period 20 -name ClkB [get_ports CLKB]
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csInUyoVdGdFZvB3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1cDO1QDNxkTMyIzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
上面兩個時鐘定義在primary input ports上,并且是asynchronous關系,我們就可按如下設定:
set_clock_groups -asynchronous -group {ClkA} -group {ClkB}
上面的指令等價于如下兩個false path聲明:
set_false_path -from [get_clocks ClkA] -to [get_clocks ClkB]
set_false_path -from [get_clocks ClkB] -to [get_clocks ClkA]
案例1
set_clock_groups -asynchronous -group {ClkA ClkC} -group {ClkB ClkD}
從上面的指令我們可以得到如下資訊
1. ClkA 和 ClkC 是同步關系時鐘。
2. ClkB 和 ClkD 是同步關系時鐘。
3. ClkA & ClkC 與 ClkB & ClkD 是異步關系時鐘。
同一個group分組中的時鐘互相為同步關系,不同分組之間的時鐘互相為異步關系。
案例2
現在考慮這兩個時鐘其中一個(或者兩個)産生其他時鐘,如圖所示
本案例中,時鐘 ClkB 和 ClkDiv1 是同步的, 但與時鐘 ClkA 為異步關系 。divClkB使用 “create_generated_clock” 以 ClkB 作為源時鐘定義。
set_clock_group 在master clock 的作用影響預設不會應用于generated時鐘上面。需要顯式指定generated時鐘的同異步關系。
set_clock_groups -asynchronous -group [get_clocks ClkA] -group [get_clocks {ClkB divClkB}]
Logically Exclusive Clocks
如果兩個時鐘同時存在但是他們之間沒有任何 path,則這兩個時鐘可以設定為 logically exclusive,典型的情況就是一個 MUX 選擇兩個或多個時鐘。
案例1
時鐘 clkOut 通過Mux MX 的 Sel 進行選擇,是以 Clk1 和 Clk2 在 MX1 的下遊路徑上不會邏輯上同時存在。它們在離開 MUX 之後不會互相作用。
set_clock_groups -logically_exclusive -group [get_clocks Clk1] -group [get_clocks Clk2]
案例2
假如在 MUX 之外存在 Clk2 驅動的 flops,并且與 ClkOut 時鐘驅動的 flops 互相作用,這時就不能設定 Clk1 和 Clk2 logically exclusive。
此時必須在 MX1 的 output 處建立 generated 時鐘,建立的時鐘可以設定為邏輯互斥關系。
create_generated_clk -name genClk1 -source MX1/Y -master Clk1
create_generated_clk -name genClk2 -source MX1/Y -master Clk2
set_clock_groups -logically_exclusive -group [get_clocks genClk1] -group [genClk2]
案例3
在 MX1 的輸出有一個分頻器,這種情況下需要建立兩個 generated 時鐘分别以 Clk1 和 Clk2 作為 master 時鐘。
create_generated_clk -name genDivClk1 -source ClkDiv/Y -master Clk1
create_generated_clk -name genDivClk2 -source ClkDiv/Y -master Clk2
set_clock_groups -logically_exclusive -group [get_clocks {Clk1 genDivClk1}] -group [get_clocks {Clk2 genDivClk2}]
Physically Exclusive Clocks
當兩個時鐘在同一時刻不可能同時存在時,則這兩個時鐘就可以設定為 physical exclusive。比如在相同的 primary 端口上建立多個時鐘,但是
這兩個時鐘工作在不同的工作模式,比如TestClk 和 Function Clock。SI 互相作用不會發生在這兩個時鐘之間。
set_clock_groups -physically_exclusive -group [get_clocks TestClk] -group [get_clocks SysClk]