天天看點

STA - Clock Groups:set_clock_groupsset_clock_groups Asynchronous ClocksLogically Exclusive ClocksPhysically Exclusive Clocks

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]

STA - Clock Groups:set_clock_groupsset_clock_groups Asynchronous ClocksLogically Exclusive ClocksPhysically Exclusive Clocks

上面兩個時鐘定義在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

現在考慮這兩個時鐘其中一個(或者兩個)産生其他時鐘,如圖所示

STA - Clock Groups:set_clock_groupsset_clock_groups Asynchronous ClocksLogically Exclusive ClocksPhysically Exclusive Clocks

本案例中,時鐘 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 之後不會互相作用。

STA - Clock Groups:set_clock_groupsset_clock_groups Asynchronous ClocksLogically Exclusive ClocksPhysically Exclusive Clocks

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 時鐘,建立的時鐘可以設定為邏輯互斥關系。

STA - Clock Groups:set_clock_groupsset_clock_groups Asynchronous ClocksLogically Exclusive ClocksPhysically Exclusive Clocks

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 時鐘。

STA - Clock Groups:set_clock_groupsset_clock_groups Asynchronous ClocksLogically Exclusive ClocksPhysically Exclusive Clocks

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]

繼續閱讀