8.3 多周期路徑
在某些情況下,兩個觸發(fā)器之間的數(shù)據(jù)路徑可能需要一個以上的時鐘周期才能傳播通過邏輯。在這種情況下,這條組合邏輯路徑會被定義為多周期路徑(multicycle path)。雖然數(shù)據(jù)還是會在每個時鐘沿上都被捕獲觸發(fā)器捕獲,但我們需要告知 STA 在指定數(shù)量的時鐘周期之后才會出現(xiàn)有效的捕獲時鐘沿。
圖 8-14 是一個示例。由于數(shù)據(jù)路徑最多需要三個時鐘周期,因此應指定三個周期的多周期建立時間檢查。為此需要指定如下的多周期建立時間約束:
圖 8-14
create_clock -name CLKM -period 10 [get_ports CLKM]
set_multicycle_path 3 -setup -from [get_pins UFF0/Q] -to [get_pins UFF1/D]
多周期建立時間約束規(guī)定,建立時間檢查時從 UFF0 / CK 到 UFF1 / D 的路徑最多可以花費三個時鐘周期,這意味著設計每三個周期才會使用一次 UFF1 / Q 引腳上輸出的數(shù)據(jù),而不是每個周期都使用。
以下是一份具有多周期約束的建立時間路徑報告:
注意,現(xiàn)在捕獲觸發(fā)器的時鐘沿距離發(fā)起觸發(fā)器的時鐘沿三個時鐘周期,為 30ns。
現(xiàn)在,我們來檢查一下多周期路徑上的保持時間檢查。在最常見的情況下,我們希望保持時間檢查保持不變(與單周期路徑一致),如圖 8-14 所示,這樣可使數(shù)據(jù)在三個時鐘周期之內(nèi)任意進行改變。只有指定多周期保持時間為 2,才可以獲得與單周期建立時間檢查情況相同的保持時間檢查。這是因為在沒有這樣的多周期保持時間約束的情況下,默認的保持時間檢查是在建立時間捕獲沿的前一個有效時鐘沿上執(zhí)行的,這顯然不是我們希望的。
我們需要將執(zhí)行保持時間檢查的時鐘沿移動到默認時鐘沿之前的兩個周期,因此指定了多周期保持時間為 2。預期的檢查如圖 8-15 所示,通過多周期保持時間約束,數(shù)據(jù)路徑的最小延遲可以小于一個時鐘周期。
圖 8-15
- set_multicycle_path 2 -hold -from [get_pins UFF0/Q] -to [get_pins UFF1/D]
多周期保持時間約束命令中的周期數(shù)指定了從默認保持時間檢查沿(建立時間捕獲沿之前的一個有效沿)需要移回多少個時鐘周期。以下是一份保持時間檢查的路徑報告:
由于此路徑的多周期建立時間約束為 3,因此其默認保持時間檢查是在建立時間捕獲沿之前的有效時鐘沿上執(zhí)行的。在大多數(shù)設計中,如果最大路徑(或建立時間)需要 N 個時鐘周期,則大于(N-1)個時鐘周期的最小路徑約束是不可行的。通過指定兩個周期的多周期保持時間約束,可以將保持時間檢查時鐘沿移回到數(shù)據(jù)發(fā)起沿處(即 0ns 處),如上面的路徑報告中所示。
因此在大多數(shù)設計中,指定為 N(周期)的多周期建立時間約束應伴隨著指定為 N-1(周期)的多周期保持時間約束。
如果指定了 N 個周期的多周期建立時間約束,但缺少了相應的 N-1 個周期的多周期保持時間約束,會發(fā)生什么情況呢?在這種情況下,會在建立時間捕獲沿之前的一個周期時鐘沿上執(zhí)行保持時間檢查。圖 8-16 顯示了僅約束多周期建立時間為 3 個周期時,進行這種保持時間檢查的情況。
圖 8-16
如圖所示,這規(guī)定了數(shù)據(jù)只能在建立時間捕獲沿之前的一個周期內(nèi)進行改變。因此,數(shù)據(jù)路徑必須具有至少兩個時鐘周期的最小延遲才能滿足此要求。以下是這種情況的路徑報告:
從路徑報告中注意到,在捕獲沿之前的一個時鐘沿對保持時間進行了檢查,這導致了較大的保持時間違例。實際上,該保持時間檢查將要求組合邏輯中的最小延遲至少為兩個時鐘周期。
跨時鐘域
讓我們考慮在周期相同的兩個不同時鐘之間存在多周期路徑的情況。(時鐘周期也不同的情況將在本章后面進行介紹)
例子 1:
create_clock -name CLKM -period 10 -waveform {0 5} [get_ports CLKM]
create_clock -name CLKP -period 10 -waveform {0 5} [get_ports CLKP]
多周期建立時間約束指定了給定路徑的時鐘周期數(shù),如圖 8-17 所示。默認建立時間捕獲沿總是與發(fā)起沿相隔一個時鐘周期,約束多周期建立時間為 2 會使建立時間捕獲沿與發(fā)起沿相隔 2 個時鐘周期。
圖 8-17
多周期保持時間約束指定了保持時間檢查應該在建立時間捕獲沿之前幾個時鐘周期的時鐘沿處執(zhí)行,無論建立時間發(fā)起沿在何處,如圖 8-18 所示。默認的保持時間檢查是在建立時間捕獲沿之前一個周期的時鐘沿處執(zhí)行的。約束多周期保持時間為 1 會將保持時間檢查放置于默認保持時間檢查之前一個周期的時鐘沿處,因此變?yōu)榻r間捕獲沿之前兩個周期的時鐘沿處。
圖 8-18
假設有如下多周期路徑約束:
- set_multicycle_path 2 -from [get_pins UFF0/CK] -to [get_pins UFF3/D]
由于沒有 -hold 選項,因此將默認為 -setup 選項。以上約束指定多周期建立時間為 2 且多周期保持時間為 0。對應建立時間檢查的路徑報告如下所示:
注意,路徑報告中所打印出的路徑組(Path Group)始終是捕獲觸發(fā)器的路徑組,在這種情況下為 CLKP。
接下來是保持時間檢查的路徑報告。由于多周期保持時間約束默認為 0,因此將在建立時間捕獲沿(20ns)之前一個時鐘周期的 10ns 處進行保持時間檢查。
以上報告報出了保持時間違例,這可以通過將多周期保持時間約束指定為 1 來消除,下面的另一個示例對此進行了說明。
例子 2:
set_multicycle_path 2 -from [get_pins UFF0/CK] -to [get_pins UFF3/D] -setup
set_multicycle_path 1 -from [get_pins UFF0/CK] -to [get_pins UFF3/D] -hold
以下是多周期建立時間約束為 2 時建立時間檢查的路徑報告:
以下是多周期保持時間約束為 1 時保持時間檢查的路徑報告:
請注意,本節(jié)中建立時間檢查和保持時間檢查的示例報告是針對同一工藝角(corner)的。通常,在最壞情況的慢速工藝角下,建立時間檢查最難滿足(裕量最?。?,而在最佳情況的快速工藝角下,保持時間檢查最難滿足(裕量最?。?。
8.4 偽路徑
當設計的功能運行時,某些時序路徑可能不真實(或不可能)存在。在執(zhí)行 STA 時可以將這些路徑設置為偽路徑(false path),這樣就可以關閉這些路徑,那么 STA 就不會對這些偽路徑去進行分析了。
偽路徑可能是從一個時鐘域到另一個時鐘域、從觸發(fā)器的時鐘引腳到另一觸發(fā)器的輸入引腳、通過一個單元的引腳、通過多個單元的引腳或這些情況的組合 。當通過單元的引腳指定了偽路徑后,通過該引腳的所有路徑都將被忽略,無需進行時序分析。辨別出偽路徑的好處在于減少了分析空間,從而使分析可以專注于真實存在的路徑,這同樣有助于減少分析時間。但是,過多使用 -through 選項去指定偽路徑同樣會降低分析的速度。
可以使用 set_false_path 命令來約束偽路徑,以下是一些例子:
set_false_path -from [get_clocks SCAN_CLK] -to [get_clocks CORE_CLK]
set_false_path -through [get_pins UMUX0/S]
set_false_path -through [get_pins SAD_CORE/RSTN]
set_false_path -to [get_ports TEST_REG*]
set_false_path -through UINV/Z -through UAND0/Z
下面給出了一些關于設置偽路徑的建議。要在兩個時鐘域之間設置偽路徑,請使用:
- set_false_path -from [get_clocks clockA] -to [get_clocks clockB]
而不要使用:
- set_false_path -from [get_pins {regA_ * }/CK] -to [get_pins {regB_ * }/D]
后者這種方式要慢得多。
另一個建議是盡可能少使用 -through 選項,因為它增加了運行時不必要的復雜性。僅在絕對有必要且沒有替代方法可以指定該偽路徑的情況下,才可以使用 -through 選項。
從優(yōu)化的角度來看,還有一個建議是不要將一條多周期路徑約束為偽路徑。如果需要在已知或可預測的時刻對信號進行采樣,則無論時間間隔多大,都應使用多周期路徑約束,以使路徑具有一定的約束條件并進行優(yōu)化以滿足多周期約束。如果把一條許多時鐘周期后進行采樣的路徑指定為了偽路徑,則對設計中其余邏輯路徑的優(yōu)化可能會使該路徑變長,甚至超出所需的時間。
8.5 半周期路徑
如果設計中同時具有負邊沿觸發(fā)的觸發(fā)器(有效時鐘沿為下降沿)和正邊沿觸發(fā)的觸發(fā)器(有效時鐘沿為上升沿),則設計中可能存在半周期路徑(half-cycle path)。半周期路徑可能是從一個觸發(fā)器的上升沿到另一個觸發(fā)器的下降沿,或者反過來。圖 8-19 給出了一個示例,其中數(shù)據(jù)的發(fā)起沿在觸發(fā)器 UFF5 的時鐘下降沿,而數(shù)據(jù)的捕獲沿在觸發(fā)器 UFF3 的時鐘上升沿。
圖 8-19
以下是建立時間檢查的路徑報告:
請注意起點(Startpoint)和終點(Endpoint)中的邊沿說明。時鐘 CLKP 的下降沿出現(xiàn)在 6ns,上升沿出現(xiàn)在 12ns。因此,數(shù)據(jù)需要在半個周期 6ns 內(nèi)到達捕獲觸發(fā)器的輸入引腳。
雖然在建立時間檢查時數(shù)據(jù)路徑僅有半個時鐘周期,但額外的半個周期可用于保持時間檢查。以下是保持時間檢查的路徑報告:
保持時間檢查通常是在捕獲沿之前一個周期的捕獲沿上執(zhí)行的。由于捕獲沿是在 12ns 處,因此前一個捕獲沿在 0ns 處,故將在 0ns 處檢查保持時間。這為保持時間檢查有效地增加了半個時鐘周期的裕量,因此可以看見保持時間檢查有較大的正裕量(slack)。
8.6 撤銷時間檢查
撤銷時間檢查(removal timing check)可確保在有效時鐘沿與釋放異步控制信號之間有足夠的時間。該檢查可確保有效時鐘沿不帶來影響,因為異步控制信號將保持有效狀態(tài),直到有效時鐘沿之后一段撤銷時間為止。換句話說,異步控制信號會在有效時鐘沿之后被釋放(變?yōu)闊o效),因此該時鐘沿不會產(chǎn)生任何影響,如圖 8-20 所示。該檢查基于的是觸發(fā)器異步引腳上指定的撤銷時間。以下是單元庫中與撤銷時間檢查有關的描述片段:
圖 8-20
與保持時間檢查一樣,該檢查也是針對最小路徑的,不過是在觸發(fā)器的異步引腳上。
終點(Endpoint)表明這是撤銷時間檢查,且在觸發(fā)器 UFF6 的異步引腳 CDN 上。該觸發(fā)器的撤銷時間在報告中顯示為 library removal time,值為 0.19ns。
所有異步時序檢查均被分配給了 async_default 路徑組。
8.7 恢復時間檢查
恢復時間檢查(recovery timing check)可確保異步信號變?yōu)闊o效狀態(tài)的時刻與下一個有效時鐘沿之間的時間間隔大于一個最小值。換句話說,此檢查可確保在異步信號變?yōu)闊o效狀態(tài)之后,有足夠的時間恢復,以便下一個有效時鐘沿可以生效。例如,考慮從異步復位變?yōu)闊o效的時刻到觸發(fā)器有效時鐘沿之間的時間間隔。如果該時間間隔太短即有效時鐘沿在復位釋放后太早出現(xiàn),則觸發(fā)器可能進入未知的狀態(tài)?;謴蜁r間檢查如圖 8-21 所示。該檢查基于的是觸發(fā)器異步引腳上指定的恢復時間,單元庫文件中與恢復時間有關的描述片段如下:
圖 8-21
與建立時間檢查一樣,該檢查也是針對最大路徑的,不過是在觸發(fā)器的異步引腳上。
以下是一份恢復時間檢查的路徑報告:
終點(Endpoint)表明這是恢復時間檢查,并且觸發(fā)器 UFF6 的恢復時間在報告中顯示為 library recovery time,值為 0.09ns?;謴蜁r間檢查也屬于 async_default 路徑組。
8.8 跨時鐘域的時序
8.8.1 慢速時鐘域到快速時鐘域
讓我們來對一條從慢速時鐘域到快速時鐘域的路徑來進行建立時間與保持時間檢查,如圖 8-22 所示。
圖 8-22
這是以上示例的時鐘定義:
create_clock -name CLKM -period 20 -waveform {0 10} [get_ports CLKM]
create_clock -name CLKP -period 5 -waveform {0 2.5} [get_ports CLKP]
當數(shù)據(jù)發(fā)起觸發(fā)器和捕獲觸發(fā)器的時鐘頻率不同時,STA 會首先確定一個公共基本周期(common base period)。下面給出了在具有上述兩個時鐘的設計中執(zhí)行 STA 時打印出的信息。較快的時鐘會被延拓,以便獲得一個公共周期。
圖 8-23
圖 8-23 中為建立時間檢查。默認情況下,將使用最嚴格的建立時間邊沿去檢查,在本例中為 5ns 處的時鐘沿。以下是此時建立時間檢查的路徑報告:
請注意,發(fā)起時鐘沿為 0ns,而捕獲時鐘沿為 5ns。
如前所述,保持時間檢查與建立時間檢查有關,并確保由當前時鐘沿發(fā)起的數(shù)據(jù)不會干擾先前數(shù)據(jù)的捕獲。這是保持時間檢查的報告:
在上面的示例中,我們可以看到發(fā)起的數(shù)據(jù)在捕獲時鐘的第四個周期可用。讓我們假設該設計的目的不是在 CLKP 的下一個有效沿上就捕獲數(shù)據(jù),而是在每第 4 個捕獲沿上捕獲數(shù)據(jù)。該假設給觸發(fā)器之間的組合邏輯路徑提供了 4 個 CLKP 周期的時間,即 20ns。我們可以通過設置以下多周期路徑約束來做到這一點:
- set_multicycle_path 4 -setup -from [get_clocks CLKM] -to [get_clocks CLKP] -end
圖 8-24
-end 選項指定了多周期 4 是用于終點(endpoint)或捕獲時鐘的。此多周期路徑約束將建立時間和保持時間檢查更改為了圖 8-24 中所示。以下是這種情況下建立時間檢查的路徑報告:
上圖 8-24 中也說明了保持時間檢查,請注意,保持時間檢查是根據(jù)建立時間檢查而決定的,默認為當前數(shù)據(jù)捕獲沿之前的一個周期。以下是保持時間檢查的路徑報告。注意,保持時間捕獲沿為 15ns,比建立時間捕獲沿(20ns)早一個周期(5ns)。
在大多數(shù)設計中,這不是理想的時序檢查,應將保持時間檢查一直移回到數(shù)據(jù)發(fā)起沿所在位置。因此,我們可以約束多周期保持時間為 3。
- set_multicycle_path 3 -hold -from [get_clocks CLKM] -to [get_clocks CLKP] -end
3 是指將保持時間檢查沿向后移三個 CLKP 時鐘周期,即 0ns 時刻處。與多周期建立時間約束的區(qū)別在于:在多周期建立時間約束中,建立時間捕獲沿會從默認的建立時間捕獲沿向前移動指定的周期數(shù);而在多周期保持時間約束中,保持時間檢查沿會從默認的保持時間檢查沿向后移動指定的周期數(shù)。-end 選項意味著我們想將終點(或捕獲邊沿)移回指定的周期數(shù),即捕獲時鐘的周期數(shù)。代替 -end 的另一種選項 -start 指定了要移動的發(fā)起時鐘周期數(shù),-end 選項指定了要移動的捕獲時鐘周期數(shù)。-end 是多周期建立時間約束的默認值,-start 是多周期保持時間約束的默認值。
圖 8-25
使用多周期保持時間約束,可以將保持時間檢查的時鐘沿往回移,檢查效果如圖 8-25 所示。具有多周期保持時間約束的保持時間檢查路徑報告如下:
總之,如果指定了 N 個周期的多周期建立時間,那么很可能還應指定 N-1 個周期的多周期保持時間。對于慢速到快速時鐘域之間的路徑,多周期路徑約束的一個好經(jīng)驗是使用 -end 選項。使用此選項,可以根據(jù)快速時鐘的時鐘周期來調(diào)整建立時間和保持時間檢查。
8.8.2 快速時鐘域到慢速時鐘域
在本小節(jié)中,我們考慮數(shù)據(jù)路徑從快速時鐘域到慢速時鐘域的示例。使用以下時鐘定義時,默認的建立時間和保持時間檢查如圖 8-26 所示。
create_clock -name CLKM -period 20 -waveform {0 10} [get_ports CLKM]
create_clock -name CLKP -period 5 -waveform {0 2.5} [get_ports CLKP]
圖 8-26
總共可能有四種建立時間檢查,請參閱圖 8-26 中的 Setup1,Setup2,Setup3 和 Setup4。其中,最嚴格的是 Setup4 檢查。以下是此最嚴格檢查的路徑報告。請注意,數(shù)據(jù)發(fā)起時鐘沿為 15ns,捕獲時鐘沿為 20ns。
與建立時間檢查類似,總共也可能有四種保持時間檢查。圖 8-26 中所示為最嚴格的保持時間檢查,該檢查可確保 0ns 處的捕獲沿不捕獲 0ns 處正在發(fā)起的數(shù)據(jù)。以下是這種情況下保持時間檢查的路徑報告:
通常,設計人員可以將從快時鐘域到慢時鐘域的數(shù)據(jù)路徑指定為多周期路徑。如果想要放寬建立時間檢查,比如為數(shù)據(jù)路徑提供兩個快時鐘周期,則此多周期路徑約束如下:
set_multicycle_path 2 -setup -from [get_clocks CLKP] -to [get_clocks CLKM] -start
set_multicycle_path 1 -hold -from [get_clocks CLKP] -to [get_clocks CLKM] -start
在這種情況下,圖 8-27 中為用于建立時間和保持時間檢查的時鐘沿。-start 選項指定周期數(shù)的單位(在這種情況下為 2)是發(fā)起時鐘周期(在這種情況下為 CLKP)。約束多周期建立時間為 2 會將發(fā)起沿移動到默認發(fā)起沿之前的一個時鐘沿,即在 10ns 而不是默認的 15ns 處。多周期保持時間約束確保了在 0ns 處發(fā)起沿發(fā)起的數(shù)據(jù),不會被 0ns 處的捕獲沿捕獲到。
圖 8-27
以下是建立時間檢查的路徑報告。與預期一樣,發(fā)起時鐘沿為 10ns,捕獲時鐘沿為 20ns。
以下是保持時間檢查的路徑報告。保持時間檢查是在 0ns 處執(zhí)行的,此時捕獲時鐘和發(fā)起時鐘均為上升沿。
與從慢速時鐘域到快速時鐘域的路徑不同,在從快速時鐘域到慢速時鐘域的路徑中,多周期路徑約束的一個好經(jīng)驗是使用 -start 選項,然后再根據(jù)快速時鐘調(diào)整建立時間和保持時間檢查。