create_clock你用對了嗎
- 2019 年 11 月 6 日
- 筆記
問題1:什麼樣的時鐘需要用create_clock約束?
有三類時鐘時鐘需要用create_clock進行約束,分別是:
從全局時鐘管腳進來的主時鐘(Primary Clock)
7系列FPGA高速收發器輸出時鐘(RXOUTCLK/TXOUTCLK)
用於接口約束的虛擬時鐘(Virtual Clock)
問題2:什麼是虛擬時鐘(VirtualClock)?
虛擬時鐘,顧名思義,在實際設計中並不存在的時鐘,主要用於輸入、輸出接口的約束。這裡給出一個虛擬時鐘案例,如下圖所示。

問題3:如何約束高速收發器的輸出時鐘?
這裡要分兩種情況進行討論。對於7系列FPGA,需要約束GT的RXOUTCLK和TXOUTCLK,具體約束如下圖所示。事實上,只有在這種情形下create_clock命令才會和get_pins命令結合使用(通常是和get_ports一起使用)。

對於UltraScale系列FPGA,只用約束參考時鐘即可。Vivado會自動推斷GT的生成時鐘約束。
問題4:如何約束差分時鐘?
對於差分時鐘,一定會用到IBUFGDS,只用約束P端。工具會據此自動將此約束傳播到IBUFGDS的輸出端口。如果既約束P端又約束N端,工具會認為這是兩個獨立的時鐘,進而分析相應的內部路徑,最終導致錯誤的時序需求(Requirement)。
問題5:create_clock的時鐘定義在BUFG的輸出端會有什麼影響?


在Vivado中,這兩條約束是不同的,因為它們定義了不同的零時刻起點。這個零時刻起點是用來計算Clock Latency和Uncertainty的,而這兩個值又是用來計算Slack的。換言之,零時刻起點直接影響了Slack的計算。通常,Vivado會忽略零時刻起點上游所有時鐘樹的延遲。如果在BUFG的輸出端定義主時鐘,那就意味着只有部分Latency會被使用。如果該時鐘與其他時鐘有交互,那麼它們之間的Clock Skew將不再準確,最終影響Slack的準確度。
結論:
對於從全局時鐘管腳進來的時鐘,create_clock會和get_ports結合使用;
對於7系列高速收發器的輸出時鐘,create_clock會和get_pins結合使用;
對於虛擬時鐘,create_clock會單獨使用。