這裡的資料來源於《Synopsys® Timing Constraints and Optimization User Guide, Version P-2019.03-SP4, September 2019》
下面圖中這幾種情況都是我在實際專案中碰到過的,因此有必要單獨做個說明。
第一個是同步派生時鐘,即CK2是透過CK1的分頻來產生的,我們之前的一個實際專案裡的情況是射頻介面給進來一個高速時鐘,需要分頻之後再給內部的數字模組使用,就碰到了這個約束場景,這裡可以看到例子是CK1透過一個D觸發器做二分頻。一般來說我們會透過counter或者觸發器鏈來進行分頻操作,這裡的關鍵命令是create_generated_clock
,並且要把CK2透過get_pins
約束到D觸發器的Q端輸出上。實際操作中,由於我們在RTL級寫得程式碼可能並不知道具體的要約束的觸發器是哪個,可以在不加CK2約束的情況下先對設計進行一次綜合,看網表中連線到CK2上的觸發器是哪個,然後再去重寫約束。
第二個是非同步時鐘,這種情況是既有外部時鐘,又有片上PLL給的時鐘,並且兩個輸入都要作用到設計上,我們在專案裡的實際情況是SoC的CPU部分使用內部PLL的時鐘,同時還有外部的JTAG除錯邏輯單獨使用一個時鐘,兩個時鐘非同步,這種情況下直接單獨建立兩個時鐘即可,另外注意時鐘相互之間要set_false_path
,或者使用這裡的set_clock_groups -asynchronous
。
最後一種是互斥時鐘,這種情況下有兩個不同的時鐘經過一個MUX選通到片內去。我們在專案裡碰到的實際情況是除了射頻介面提供的時鐘外,我們希望能夠再加入一個測試時鐘,這樣可以在不需要射頻介面工作的情況下仍然可以提供時鐘從而測試內部邏輯,那麼這裡提供的set_clock_groups -logically_exclusive
是一個比較好的方案(我們當時的簡單粗暴做法是隻約束了一路時鐘,因為兩路時鐘我們認為會是同頻的)。