時鐘樹問題——二

轉載:https://blog.csdn.net/Reborn_Lee/article/details/84564542

目錄

(1)什麼情況下,時鐘應該“上樹”?

(2)如何選擇時鐘樹?

(3)時鐘信號如何“上樹”?

(4)被“拉下樹”的時鐘信號


 


上篇博文:時鐘域問題簡介,介紹了時鐘域的相關知識,形象的說就是時鐘信號的“勢力”範圍,它通過時鐘樹的形式實現。

時鐘樹不僅可以做到高扇出,還可以做到讓時鐘信號到達各個觸發器的時刻儘可能一致,也即保證時鐘信號到達時鐘域內不同觸發器的時間差最小。

這篇博文進一步說時鐘樹的問題,我們知道了時鐘樹的這麼強大的功能,好處這麼多,那麼怎麼使用時鐘樹,我什麼時候使用到了時鐘樹呢?

(1)什麼情況下,時鐘應該“上樹”?

如果一個時鐘信號是爲FPGA內部的一些邏輯資源提供“脈搏”的,那麼強烈建議該時鐘“上樹”;

如果時鐘信號的時鐘域實在太小,例如僅控制若干個觸發器,那麼也許不利用時鐘樹,FPGA設計也可能通過時序分析,但是仍然建議使用時鐘樹;

如果時鐘信號的時鐘域只包括一個觸發器,那麼也就不存在所謂的時間差了,此時就完全不需要時鐘樹;

如果一個時鐘信號僅僅是爲FPGA外部的硬件電路提供時鐘激勵的,那麼外部無論有多少個存儲單元需要使用該時鐘,都沒必要使用時鐘樹,因爲FPGA內部的時鐘樹無法延伸到FPGA芯片外部。

(2)如何選擇時鐘樹?

上篇博文提到了時鐘樹的類型,分爲全局時鐘樹、局部時鐘樹和IO時鐘樹。那麼具體來說,如果需要使用時鐘樹,該爲時鐘選擇哪一類時鐘樹呢?

也許自覺會這麼告訴自己,時鐘域大的,選擇全局時鐘樹;時鐘域小的,選擇區域時鐘樹;時鐘域特別小,選擇IO時鐘樹。

事實告訴你,自覺是完全錯誤的。

IO時鐘樹分佈在FPGA的接口資源中,由於它們離IO管腳最近,所以可以協助FPGA完成一些較高速率的串行數據接收,再經過簡單地串並轉換之後,以比較低的速率將並行數據丟進FPGA芯片的內部,供其他資源使用。一般來說,每個IO BANK內部會有若干個IO時鐘樹的資源,因此IO時鐘樹雖然覆蓋範圍小,但並不是爲小規模的時鐘域量身定做的,因此FPGA內部的資源也無法使用該時鐘樹。

再看全局時鐘樹,由於全局時鐘樹可以覆蓋到整個FPGA芯片,因此全局時鐘樹的個數也十分有限,因此使用一定要謹慎,不可濫用。但是如果你硬着頭皮省下來一堆全局時鐘樹,結果卻閒置在一邊,不派上用場,那簡直就是浪費時間,白花心思。因此,全局時鐘樹這樣的資源,不可濫用,也不可不用,要充分利用。

因此,在全局時鐘樹不緊缺的情況下,無論時鐘域的大小,統一建議使用全局時鐘樹,因此這樣也能給編譯器提供最大的佈局佈線自由度,從而讓時序約束更容易實現。

最後來看區域時鐘樹。老實說,區域時鐘樹覆蓋範圍也是相當的大,最大可能能到FPGA芯片的幾分之一,因此如果時鐘域不是特別大,到底使用全局時鐘樹還是區域時鐘樹,其實沒有一個確定的結論。不過如果不是全局時鐘樹資源不夠用,一般不建議使用區域時鐘樹。當然了,使用區域時鐘樹可以讓時鐘域中資源的分佈在物理上更緊湊一些,並且有些功能是必須使用區域時鐘樹和IO時鐘樹配合來完成的,因此請注意相關功能的說明。

最後總結下,IO時鐘樹用於IO接口的串並轉換,不可用於FPGA內部時鐘域。

全局時鐘樹,可以覆蓋到整個FPGA芯片,在全局時鐘樹不緊缺的情況下,儘量使用全局時鐘樹,可以給編譯器提供最大的佈局佈線自由度,讓時序約束更容易實現。

局部時鐘樹,特定情況下可能又用途,但全局時鐘樹不緊缺的情況下,建議使用全局時鐘樹。

(3)時鐘信號如何“上樹”?

1)使用全局時鐘樹資源

方法一,通過正確的物理連接。

如果時鐘信號是由FPGA芯片外部產生的,那麼我們可以不通過編程就可以實現時鐘樹資源的分配。

因爲在FPGA芯片的外圍管腳中,有一些專門爲全局時鐘設計的管腳,這點我們可以通過相應的FPGA芯片的數據手冊來確認,如果在製作電路板時,直接將外部時鐘信號通過這些管腳接入FPGA內部,那麼它將自動佔據全局時鐘樹資源。當然了,這些管腳也可以接入普通的數據信號,編譯器會對該管腳引入的信號在FPGA設計內部扮演的角色進行分析,如果發現其並沒有作爲時鐘信號來使用,那麼將不會爲其分配時鐘樹資源。

方法二,通過恰當的代碼描述。

如果很不巧,外部的時鐘信號(外部時鐘)沒有通過專用的全局時鐘管腳連接到FPGA內部,又或者某一個時鐘信號是FPGA內部產生(再生時鐘)的,例如FPGA內部PLL的輸出,那麼此時就需要通過編寫程序來完成時鐘的“上樹”工作了。有些時候,即使不使用代碼顯示指定,編譯器也會根據代碼的分析結果,來爲時鐘信號分配全局時鐘資源。不過這種靠“天”喫飯的思想不可取,FPGA工程師一定要讓FPGA芯片儘可能的處於自己,而不是編譯器的掌控之下,因此強烈建議通過自己的代碼來指明時鐘樹的使用。

那麼具體要怎麼通過HDL代碼來實現時鐘樹資源的分配呢?答案就是使用原語。

由於原語是跟FPGA芯片的生產廠商息息相關的,因此同一個功能的原語在不同的編譯器中的名稱很可能大相徑庭,例如用於全局時鐘樹分配的最主要的原語,Xilinx公司叫它BUFG,而Altera公司卻稱其爲global。

這裏,以Xilinx公司的FPGA產品爲例,來介紹代碼的描述方法,其他公司的FPGA產品方法類似,只不過需要替換原語的名稱罷了。

如果FPGA內部有一個名爲innerClk的時鐘信號,我們想爲它分配一個全局時鐘樹,Verilog HDL描述爲:

wire globalClk;

BUFG onTree(.O(globalClk), .I(innerClk));

按照上述HDL代碼描述以後,我們就可以在後續的邏輯功能中放心使用上樹後的innerClk——globalClk了。

實際上,直接從外部全局時鐘管腳引入的時鐘信號,相當於在HDL代碼中使用了IBUFG + BUFG原語。

除此之外,如果希望多個時鐘信號分享一個時鐘樹,也可以使用BUGMUX這個原語,相當於MUX +BUFG,例如,希望當前FPGA設計中的某一部分邏輯其時鐘是可以在40Hz和60Hz之間切換的。

2)使用區域時鐘樹、IO時鐘樹資源

與全局時鐘管腳類似,FGPA芯片的外圍管腳中也有專門爲區域時鐘和IO時鐘設計的專有管腳,但是,光將時鐘信號連接到這些管腳上,還並不一定能完成相應時鐘樹的使用,還必須要在代碼中顯式地進行描述纔行。

以Xilinx公司爲例,使用原語BUFIO,將會爲這些專用管腳上的信號分配IO時鐘樹資源,使用BUFR,將會爲這些專用管腳上的信號分配區域時鐘樹資源。由於區域時鐘常配合IO時鐘完成串並轉換,因此,BUFR還具有神奇的分頻功能。最後,由於這兩個時鐘樹的覆蓋範圍並不是整個FPGA芯片,所以在進行HDL代碼編寫時,也請注意資源的使用。

(4)被“拉下樹”的時鐘信號

已經上樹的時鐘信號,若不小心,也可能被拉下樹,因此,在HDL代碼編寫的時候,一定要避免這種情況。

是什麼導致時鐘信號脫離了時鐘樹了呢?

通過前面的介紹,我們知道時鐘樹是由若干級緩衝器再加上一些近似等長的連線組成的,這也就是說,時鐘樹僅能對時鐘信號起到一個基本的傳遞作用,除此以外,別無它用。

因此,凡是相對時鐘樹上的時鐘信號進行任何邏輯操作,來生成一個新的信號,那麼新的信號已經不再位於時鐘樹上了(注意,原來的時鐘信號仍在時鐘樹上)。如果希望新的信號仍然作爲時鐘來驅動一些邏輯,那麼必須重新調用相應原語來讓新的時鐘信號獲得空閒的時鐘樹資源,所以,之前介紹的FPGA內部生成的再生時鐘,門控時鐘,行波時鐘,如果需要使用,一定要先使用原語爲它們分配好時鐘樹資源。

下面舉例說明,原始時鐘信號被拉下樹以及在此上樹的過程:

  1. // gClkOnTreeA is on the clock tree
  2. assign midClk0 = ~gClkOnTreeA; // midClk0 is not on the clock tree
  3. assign midClk1 = en & gClkOnTreeA; // midClk1 is not on the clock tree
  4. BUFG reOnTree0(.O(gClkOnTreeB),.I(midClk0)); //gClkOnTreeB is on the clock tree
  5. BUFG reOnTree1(.O(gClkOnTreeC),.I(midClk1)); //gClkOnTreeC is on the clock tree

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章