create_clock你用對了嗎

  • 2019 年 11 月 6 日
  • 筆記

毋庸置疑,create_clock是最基本、最簡單的時序約束命令,而且在FPGA設計中必然會用到。但看似簡單的命令,卻也常常被用錯。這裡我們就來回答一些常見的問題。

問題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會單獨使用。