在同步電路設計中,各功能邏輯單元之間的數據傳輸由一個同步信號控制,這個執行統一指揮的信號就是時鐘信號,因此需要在設計之初創建時鐘,基於該時鐘頻率進行優化設計,使設計性能達到時序收斂的目的。
創建時鐘
時鐘信號爲一個週期性信號,定義時鐘需要包括以下主要信息:
(1)時鐘源點
時鐘源點可以根據情況定義爲設計中一個端口,一個網絡,也可以是一個邏輯單元的PIN腳。爲端口時用[get_ports 端口名],爲網絡時用[get_nets 網絡名],爲PIN腳時用[get_pins 引腳名]。
(2)時鐘週期
時鐘週期定義爲時鐘的震盪週期,爲時鐘頻率的倒數。時鐘週期是時序分析中最基本的、最小的時間單元。用{-period period_value}表示
(3)時鐘佔空比
時鐘佔空比主要定義時鐘高低電平在一個時鐘週期內的分佈情況。用-[waveform edge_list]表示
通過使用SDC命令creat_clock來創建時鐘,比如通過該命令定義一個從CLK端口輸出並且時鐘週期爲10、佔空比爲50%的時鐘信號,命令如下。
creat_clock -period 10 -waveform { 0 5 } [ get_ports clk ]
如上圖所示,該命令可以對所有內部觸發器到觸發器類型的路徑進行約束。
(4)命名時鐘
每個時鐘定義都會給時鐘信號命名。用 -name選項可以指定一個字符串作爲時鐘名稱。當-name選項沒有明確指定字符串並且時鐘已被聲明時,工具將指定自己的名字給時鐘信號命名。時鐘信號一旦被定義並且命名,所有其他依賴於此時鐘信號的SDC指令只需要提到時鐘信號的名稱,而不用提供其他任何特徵。當提到時鐘信號名字的時候,時鐘信號的所有特徵就都知道了。時鐘名稱提供了更加簡單的方法來統稱時鐘信號的所有特徵。
下面以定義一個佔空比不是50%的時鐘爲例。
creat_clock -name BDYCLK -period 15 -waveform {5 12} [get_ports CLK]
時鐘信號波形如下圖所示。
(4)時鐘轉換延時
時鐘轉換延時定義時鐘在高低電平狀態下切換所需要的延時。
通過SDC命令set_clock_transition來定義時鐘轉換延時信息,示例命令如下:
set_clock_transition -rise 0.1 [get_clocks clk]
set_clock_transition -fall 0.12 [get_clocks clk]
以上命令定義名爲clk的時鐘信號上升轉換延時爲0.1ns,下降轉換延時爲0.12ns。
(5)時鐘不確定性
由於實際時鐘本身與理想時鐘有一定的誤差,所以通過時鐘不確定來涵蓋這些實際的導致誤差的因素,比如時鐘抖動、時鐘偏斜等因素。
由於芯片內部各個觸發器的位置不同,導致每個觸發器到時鐘源點的距離不相同,所以時鐘源點的時鐘信號到達每個觸發器的時間與理想情況的時間有誤差。如下圖所示,假設路徑P1的時間爲0.5ns,路徑P2的時間爲1ns,路徑P3的時間爲1.2ns,路徑P4的時間爲1.3ns。那麼,時鐘不確定性的延時爲0.8ns。
通過使用SDC命令set_clock_uncertainty來定義時鐘不確定性信息,示例如下:
set_clock_uncertainty -setup 0.2 [get_clocks clk]
set_clock_uncertainty -hold 0.05 [get_clocks clk]
以上命令定義名爲CLK時鐘信號的不確定性爲:建立時間爲0.2ns,保持時間爲0.05ns。其結果如下圖所示。
設計中可能存在由不同的時鐘信號驅動的時序路徑,如下圖所示。
不同時鐘域之間也可以定義時鐘不確定性,示例命令如下:
set_clock_uncertainty -from CLK1 -to CLK2 -hold 0.05
set_clock_uncertainty -from CLK2 -to CLK1 -hold 0.05
set_clock_uncertainty -from CLK1 -to CLK2 -setup 0.1
set_clock_uncertainty -from CLK2 -to CLK1 -setup 0.1
以上命令定義名爲CLK1和CLK2時鐘之間的不確定性爲:建立時間爲0.1ns,保持時間爲0.05ns。
(6)時鐘延遲
時鐘信號從時鐘源輸出端到達時序單元時鐘輸入端是需要傳播時間的。時鐘延遲由時鐘源點到達時鐘定義的端口的延時(source latency)和時鐘定義的端口到時序單元時鐘輸入端的延時(network latency)兩部分組成,如下圖所示。
通過使用SDC命令set_clock_latency來定義時鐘延遲信息,示例命令如下:
set_clock_latency 1.8 -rise [all_clocks]
set_clock_latency 2.1 -fall [all_clocks]
以上命令定義了時鐘網絡延遲:上升延遲爲1.8ns,下降延遲爲2.1ns。
set_clock_latency 0.851 -source -min [get_clocks CLK]
set_clock_latency 1.322 -source -max [get_clocks CLK]
以上命令定義了時鐘源信號到達時鐘CLLK輸出端的延時,最大延遲爲1.322ns,最小延遲爲0.851ns。
時鐘網絡延遲與時鐘源延遲的一個明顯區別是,時鐘網絡延遲是時鐘樹生成前的設置。當實際時鐘樹生成後,時鐘網絡延遲的設置將會通過命令set_propagated_clock被時鐘樹的實際結果替代,而時鐘源延遲會一直存在,即使使用實際的時鐘樹傳播延時信息。