天天看點

FPGA之道(47)時鐘及時鐘域

文章目錄

  • 前言
  • 時鐘及時鐘域
    • 時鐘,時序邏輯的心跳
    • 時鐘信号基本特征
      • 時鐘信号基本特征參數介紹
      • 如何區分時鐘和資料
    • 時鐘信号的分類
      • 按來源分
        • 外部時鐘
        • 再生時鐘
        • 門控時鐘
        • 行波時鐘
      • 按波形分
        • 連續時鐘
        • 間歇時鐘
        • 不規則時鐘
    • 時鐘域
      • 時鐘域的概念
      • 時鐘樹簡介
      • 時鐘樹的分類
      • 正确的時鐘使用方式
      • 什麼情況下時鐘應該“上樹”?
      • 如何選擇時鐘樹?
      • 時鐘信号怎麼“上樹”?
        • 使用全局時鐘樹資源
          • 方法一,通過正确的實體連接配接。
          • 方法二,通過恰當的代碼描述。
        • 使用區域時鐘樹、IO時鐘樹資源
      • 被“拉下樹”的時鐘信号

前言

本文節選自《FPGA之道》,通過作者的講解,一起看看時鐘和時鐘域的相關問題,下一篇部落格再看看作者如何來解釋跨時鐘域問題。

時鐘及時鐘域

時鐘,時序邏輯的心跳

在時序邏輯中,正是時鐘信号将各個存儲單元中的資料一級、一級的推動下去,如果時鐘信号突然停止,那麼整個時序邏輯也将陷入癱瘓,是以,時鐘就好像時序邏輯的心跳一樣,那麼重要、卻又那麼平常地存在着。

幾乎所有的FPGA設計都是時序邏輯,是以幾乎所有的FPGA設計都離不開時鐘信号,但是正因為時鐘信号是時序邏輯最基本的必須,就好比空氣之于衆生一樣,也許有些時候,你并不能意識到它的重要性,而這種潛意識裡對時鐘信号的不重視,則早已為FPGA設計的最終失敗埋下了深深地伏筆。是以,要想確定FPGA設計最終的成功,先要確定時鐘信号的成功!如果有人讓你評判在FPGA上實作某一個功能的可行性,第一步,看時鐘,判斷該功能對時鐘信号的要求是否超越了FPGA的能力範圍;如果讓你着手開始一個FPGA設計,第一步,還是先看時鐘,選取合适的時鐘方案作為整個項目的支撐。

時鐘的重要性遠非區區一個章節所能介紹的完的,可以說,本書的大部分内容都在圍繞着時鐘信号展開,不過在本章節,我們将目光更加集中于時鐘信号本身,來對其進行一些基本介紹,好讓大家更加清楚的認識時鐘。

時鐘信号基本特征

時鐘信号基本特征參數介紹

時鐘信号具有什麼樣的基本特征呢?本小節将為大家慢慢道來。請看下圖:

FPGA之道(47)時鐘及時鐘域

對于一個時鐘信号來說,最重要的三個參數非周期、頻率和占空比莫屬了。

周期一般用大寫的英文字元T表示,其的數學定義為:對于一個函數f(x),如果存在一個非零常數T,使得當x取定義域内的每一個值時,都有f(x+T) = f(x),那麼f(x)就叫做周期函數,而非零常數T則叫做這個函數的周期。由此可見,一個函數可以有很多個周期,通常,我們取其中最小的非零常數T,即最小周期做為該周期函數的周期。由此可見,連續兩次上升沿或下降沿之間的時間間隔即為時鐘信号的周期,如上圖所示,當然了,時鐘信号周期的認定并不局限于此。

頻率一般用小寫的英文字元f表示,它和周期互為倒數,即f = 1 / T。例如,如果時鐘信号的周期為0.1秒,那麼其頻率就為10赫茲,表示一秒鐘的時間内共包含了時鐘信号的10個周期。由此可見,相比于周期參數,頻率參數在描述時鐘信号變化的快慢程度上更加直覺。

占空比等于時鐘信号一個周期内邏輯1持續的時間與周期時間的比值。對于數字波形來說,波形圖上幾乎除了邏輯1就是邏輯0,而上圖中的“高電平”、“低電平”即分别對應一個時鐘周期内邏輯1和邏輯0的持續時間。通常來說,50%是最常見的時鐘信号占空比,即“高電平”寬度等于“低電平”寬度。

除了周期、頻率、占空比之外,上升時間和下降時間也是時鐘信号中比較重要的特征參數。由于現實世界中,電容的充、放電等等都需要一定的時間程,是以不同邏輯電平之間的過度總是需要一個過程,而上升時間就是指時鐘信号從邏輯0變化到邏輯1所需要的時間,下降時間則是指時鐘信号從邏輯1變化到邏輯0所需要的時間,分别如上圖所示。對于理想的時鐘信号,我們說時鐘的上升沿就是從邏輯0跳變到邏輯1的這個瞬間,時鐘的下降沿則是從邏輯1跳變到邏輯0的這個瞬間。而對于實際的時鐘信号來說,由于電平之間的變化需要消耗時間,是以,上升沿和下降沿發生的具體時刻就不太好确定,而要根據接收時鐘信号的數字器件對于邏輯電平的判決門限來推算了,不過可以肯定的是上升沿、下降沿一定位于上升時間、下降時間之内。對于時序邏輯來說,其内部的絕大部分存儲單元都是邊沿敏感的,例如寄存器、BLOCK RAM等等,是以一定要對時鐘信号的上升沿、下降沿有一個清楚的認識。

如何區分時鐘和資料

在數字的世界中,所有的信号都是在邏輯0與邏輯1之間不斷切換的,而不僅僅限于時鐘信号。是以,資料信号也完全可以具有時鐘信号的所有基本特征,那麼此時,我們該如何分辨該信号是時鐘信号還是資料信号呢?

如果僅僅通過觀察信号的數字波形,是無法分辨一個信号到底是時鐘信号還是資料信号的。要想做出準确分辨,必須去檢視該信号在數字電路中的連接配接關系,舉個例子,如果一個信号連接配接到一個寄存器的時鐘端,那麼它就是一個時鐘信号;如果該信号連接配接到一個寄存器的資料輸入端,那麼它就是一個資料信号;如果一個信号連接配接到一個寄存器的時鐘端的同時又連接配接到另一個寄存器的資料輸入端,那麼它也就具有了時鐘信号與資料信号的雙重身份。

由此可見,時鐘信号的本質,是在于其是否為時序邏輯提供“心跳”機制,而不在于其具體的表現形式。

時鐘信号的分類

按來源分

時鐘信号按照其來源分,可分為外部時鐘和内部時鐘,而内部時鐘又可分為再生時鐘、門控時鐘、行波時鐘,分别介紹如下:

外部時鐘

外部時鐘,指時鐘信号的來源是在FPGA晶片的外部。通常來說,外部時鐘源對FPGA設計來說是必須的,因為一般FPGA晶片内部沒有能夠産生供内部邏輯使用的時鐘信号的選頻和激勵電路。是以通常來說,我們需要在FPGA晶片的外部使用晶振以及恰當的電阻、電容、電感、三極管等器件,來搭建用于産生時鐘信号的電路,并将其通過FPGA晶片的恰當實體管腳引入到FPGA内部供時序邏輯使用。

順便說一句,當我們用示波器觀察外部時鐘信号時,可以發現其波形很可能不是一個規則的方波,而一個正弦波。這是由于方波信号實際上是一個頻帶非常寬的信号,因為其有着尖銳的上升沿與下降沿,而晶振的選頻回路隻能對針對某一個頻率的信号進行放大,而對其他頻率的信号都會衰減,再加上任何信道其實都相當于一個濾波器,是以導緻時鐘信号的帶寬非常的有限,是以都類似表現為正弦波,這也是時鐘信号中為什麼會有“上升時間”和“下降時間”的一個原因。不過模拟的時鐘信号經過邏輯門的驅動後,由于MOS電路的陡峭導通特性,會對時鐘信号的“上升時間”和“下降時間”起到積極的縮減作用。

再生時鐘

再生時鐘,指FPGA内部産生的新時鐘,當然了,這并不是憑空産生的時鐘(因為FPGA晶片内部一般不具有産生時鐘信号的電路結構),而是以一個輸入的時鐘信号作為參考,然後在此基礎之上通過調整其頻率和相位而産生出來的新時鐘。

目前來說,FPGA晶片内部能夠産生再生時鐘信号的子產品主要有DCM和PLL兩個,在【本篇->程式設計思路->DCM與PLL】章節中,我們将為大家詳細介紹。順便說一下,FPGA晶片内部僅有DCM和PLL可以對時鐘信号進行升頻操作。

門控時鐘

門控時鐘,指的是由組合邏輯産生的時鐘,其中,組合邏輯的輸入可以全部是資料信号,也可以包含原始時鐘信号。由于組合邏輯中的基本單元就是與、或、非等門電路,而與門和非門又具有“開關性”,固該類時鐘又稱為門控時鐘。例如,下面的電路圖中的門控時鐘是由與門産生的,當en信号為1時,與門打開,原始時鐘信号可以通過并作用到觸發器;而當en信号為0時,與門關閉,觸發器由于沒有時鐘信号驅動,将會處于休眠狀态,不會有任何動作:

FPGA之道(47)時鐘及時鐘域

通常情況下,不建議大家在FPGA設計的内部引入門控時鐘,因為門控時鐘由組合邏輯産生,那麼它身上就潛伏了組合邏輯的最大隐患——競争與險象,是以門控時鐘信号容易産生毛刺,而寄存器等存儲單元對時鐘信号的邊沿都非常的敏感,是以具有毛刺的時鐘會造成時序邏輯的不穩定。

事實上,控制時鐘信号的目的是為了控制觸發器的行為,這點我們也可以通過控制觸發器的使能端來做到,是以,上例中的電路完全可以修改如下:

FPGA之道(47)時鐘及時鐘域

這樣一來,這個系統将會免受競争與險象的困擾。

行波時鐘

行波時鐘,指的是由時序邏輯産生的時鐘。例如,A寄存器的輸出如果作為B寄存器的時鐘,則A寄存器的輸出稱為行波時鐘。例如,如下電路中,驅動右邊那個觸發器的時鐘即為行波時鐘:

FPGA之道(47)時鐘及時鐘域

通常情況下,也不建議大家在FPGA設計的内部引入行波時鐘,因為這樣會在FPGA設計中引入新的時鐘域(後續小節将會介紹),增加時序分析的難度,并且由于行波時鐘的相位通常會滞後于原始時鐘,是以後續觸發器的保持時間(關于保持時間的概念參見【時序分析篇->基本概念介紹->常用時間參數介紹】小節)不一定能夠得到滿足。

事實上,采用行波時鐘的目的無非是為後續時序電路的處理速度進行降頻,而要實作降頻的功能,除了通過降低時鐘信号的頻率外,仍然可以通過控制後續時序電路存儲單元的使能端來實作,是以,上例中的電路完全可以修改如下:

FPGA之道(47)時鐘及時鐘域

這樣一來,整個時序邏輯将隻被一個時鐘信号所驅動,變得清晰又易控。

按波形分

時鐘信号按波形分,可分為連續時鐘、間歇時鐘、不規則時鐘,分别介紹如下:

連續時鐘

連續時鐘,指從波形圖上來看,時鐘波形呈連續的、周期的,例如下圖所示:

FPGA之道(47)時鐘及時鐘域

FPGA内部的時鐘通常來說都是連續時鐘。

間歇時鐘

間歇時鐘,指從波形圖上來看,時鐘波形存在間斷,時有時無,例如下圖所示:

FPGA之道(47)時鐘及時鐘域

間歇時鐘常見于FPGA的資料輸入或輸出接口,這是因為有些外圍器件的同步接口不包括使能端,是以當沒有需要傳輸的資料時隻能通過關閉時鐘來暫停通信,并且這樣也可以在一定程度上減少功耗。

不規則時鐘

不規則時鐘,指從波形圖上來看,時鐘的波形無固定規律可循,沒有固定的周期、頻率,也沒有固定的占空比,并且還時有時無,例如下圖所示:

FPGA之道(47)時鐘及時鐘域

不規則時鐘也常見于FPGA的資料輸入或輸出接口,與間歇時鐘産生的原因類似,隻不過間歇式時鐘往往針對成包或成幀傳輸資料的接口,是以每次都會輸出一連串規則的波形信号,而不規則時鐘針對的接口資料量往往比較小,也沒有固定的資料結構,是以有一個資料就會傳一個資料。

時鐘域

時鐘域的概念

時序邏輯離不開時鐘,有時鐘的地方也必然存在着時序邏輯,而随着FPGA晶片所承載功能的日漸複雜與多樣化,單個時鐘信号已經往往不能滿足FPGA設計的需求。就拿一個最簡單的串并轉換接口來說吧,要實作它就至少需要兩個時鐘信号,是以,通常情況下,一個FPGA設計中往往要用到多個時鐘信号。都說“一個和尚挑水喝,兩個和尚擡水喝,三個和尚沒水喝”,當FPGA設計中的時鐘增多了之後,會不會也存在一些問題呢?答案是肯定的!多時鐘并存,最嚴重的就是會導緻跨時鐘域問題,這個我們将會在下一小節詳細介紹,而現在,讓我們将目光集中于時鐘域上,隻有先搞清楚什麼是時鐘域,後續的讨論才會變得有意義。

簡而言之,時鐘域就是時鐘信号的“勢力範圍”,用來昭告天下,“哪一片歸我管”,“這裡我最大”等等。一個時鐘域中隻能存在一個時鐘信号,典型的“一山不容二虎”,但一個時鐘信号最多可以對應兩個時鐘域,當其上升沿和下降沿分别都被一部分資源敏感的時候。而被時鐘域所瓜分的資源,正是具有存儲功能的各個單元,而其中最典型的就是寄存器。要想判斷一個寄存器是屬于哪一個時鐘域的,方法很簡單,隻要看它的時鐘輸入端口接的是哪個時鐘信号以及敏感哪個邊沿即可。時鐘信号直接掌控着屬于其時鐘域内的寄存器們,同時也間接的掌控着一些組合邏輯資源,因為FPGA内部組合邏輯的輸入往往是寄存器的輸出。不過,要想判斷某一塊組合邏輯到底是屬于哪個時鐘域的,就沒那麼容易了,因為組合邏輯本身并不直接受時鐘信号的控制。是以,要想判斷組合邏輯的歸屬,需要分析它的所有輸入:如果一個組合邏輯的所有輸入都來自同一個時鐘域内的寄存器的輸出,那麼該組合邏輯輸出的變化頻率必然也會跟随該時鐘的脈搏跳動,是以可以确定該組合邏輯屬于該時鐘域;反之,則該組合邏輯中存在異步或者跨時鐘域問題,它不屬于任何一個時鐘域。

時鐘樹簡介

既然是“勢力範圍”,那麼不同時鐘信号的時鐘域大小就有可能不同,這就好比世界上有很多個國家,可每個國家的領土大小、人口數量卻各不相同。如果一個國家隻有一個人,那麼執政者隻用嚴于律己就好,因為一人吃飽全家不餓;如果一個國家隻有10個人,那麼執政者隻需要管理好自己以及其餘9個人即可;如果人再多些,例如一個國家有10億人,那麼執政者就沒有那個精力來挨個管了,于是就需要有省一級、市一級、區一級、鄉一級等等的上司班子來組成所謂的公務員團體,來協助其進行管理。是以,對于“勢力範圍”大小不同的各個時鐘域,時鐘的管理方法也必然不同,隻不過這次的幫手不是公務員,而是時鐘樹!(時鐘樹其實就是FPGA内部的時鐘網絡資源。)

那麼,時鐘樹是怎麼幫助時鐘來“管理”時鐘域的呢?

首先,如果一個時鐘域包含了10000個觸發器,那麼該時鐘信号必須要能夠同時連接配接到這10000個觸發器的時鐘輸入端,而如此大的信号扇出要怎麼實作呢?不用擔心,時鐘樹可以做到這麼大的扇出。

其次,為了達到更好的時序名額,我們總希望時鐘信号盡可能同時的到達其時鐘域内各個觸發器的時鐘輸入端,那麼如此苛刻的要求又要怎麼實作呢?不用擔心,時鐘樹可以保證時鐘信号到達時鐘域内不同觸發器的時間差最小。

由此可見,時鐘樹資源對時鐘信号的重要性,我們可以形象的通過如下圖示來了解時鐘樹的工作原理:

FPGA之道(47)時鐘及時鐘域

上圖即為一個時鐘樹的原理結構圖,時鐘信号由最中間的樹根引入時鐘樹,并經由第一級緩存扇出若幹個分别送往不同的區域;在各個區域中,再采用同樣的方式繼續扇出并送往不同的子區域;如此往複,直到時鐘信号到達最基本的觸發器等資源。由此可見,時鐘樹主要利用多級扇出的形式來達到最終的高扇出結果;而通過控制每級扇出後的布線長度盡量一緻來保證時鐘信号能夠盡可能同時的到達各個觸發器,這就是時鐘樹的基本工作原理。注意,如果兩個時鐘域分别對應一個時鐘信号的上升沿和下降沿,則它們可以共用一個時鐘樹。

最後,需要澄清一個概念,那就是時鐘樹是保證時鐘信号到達時鐘域内不同觸發器的時間差盡可能小的資源,而不是保證時鐘信号到達觸發器所消耗時間最短的資源。例如,時鐘域内有3個觸發器,如果利用時鐘樹資源,并假設0時刻是時鐘信号的初始時刻,那麼時鐘信号到達這三個觸發器的時刻可能為8ns、9ns、8.5ns,而如果不應用時鐘樹,時鐘信号到達這三個觸發器的時刻可能為2ns、6ns、11ns。

時鐘樹的分類

既然時鐘樹是幫助時鐘來管理時鐘域的,那麼由于時鐘域可能很大、也可能很小,是以時鐘樹也會有大有小。由于時鐘樹資源在FPGA晶片中屬于比較稀有的資源,那麼為FPGA設計的每個時鐘信号選擇合适的時鐘樹就顯得十分重要。那麼,按照時鐘樹的作用範圍來看,FPGA内部的時鐘樹資源共有三種,即:全局時鐘樹、區域時鐘樹、IO時鐘樹,相關的具體說明可以回顧本書【知己知彼篇->FPGA内部資源介紹->時鐘網絡資源】小節。

正确的時鐘使用方式

了解了時鐘域的相關内容,那麼在平時的FPGA設計工作當中,該怎樣正确運用呢?這一小節,将為大家介紹一些正确的時鐘使用方式。

什麼情況下時鐘應該“上樹”?

如果一個時鐘信号是為FPGA内部的一些邏輯資源提供“脈搏”的,那麼強烈建議讓該時鐘上樹;如果時鐘信号的時鐘域實在太小,例如僅控制若幹個觸發器的話,那麼也許不利用時鐘樹,FPGA設計也可能通過時序分析,但是仍然建議使用時鐘樹;如果時鐘信号的時鐘域隻包括一個觸發器的話,那麼也就不存在所謂的時間差了,此時就完全不需要時鐘樹;如果一個時鐘信号僅僅是為FPGA外圍的硬體電路提供時鐘激勵的,那麼無論外部有多少個存儲單元需要使用該時鐘,都沒有必要使用時鐘樹,因為FPGA内部的時鐘樹無法延伸到FPGA晶片外部,就好比美國公民不受中國法律限制一樣。

如何選擇時鐘樹?

如果需要使用時鐘樹,那麼該為時鐘選擇哪一類時鐘樹呢?

也許你會想當然的覺得,時鐘域大的,選擇全局時鐘樹;時鐘域較小的,選擇區域時鐘樹;時鐘域特别小的,選擇IO時鐘樹。那麼在這裡,我隻能告訴你,完全錯誤!

首先來看IO時鐘樹,IO時鐘樹隻分布在FPGA的接口資源中,由于它們離IO管腳最近,是以可以協助FPGA完成一些較高速率的串行資料接收,在經過簡單的串并轉換之後,以比較低的速率将并行資料丢進FPGA晶片的内部,供其他資源使用。一般來說,每個IO BANK内部會有若幹個IO時鐘樹的資源,是以,IO時鐘樹雖然覆寫範圍小,但并不是為小規模的時鐘域量身定做的,是以FPGA内部的資源也無法使用該時鐘樹。

再來看全局時鐘樹,由于全局時鐘樹可以覆寫到整個FPGA晶片,是以全局時鐘樹的個數也十分有限,是以使用的時候一定要謹慎,不可太過濫用。但是“人死了,錢沒花了”是一件很痛苦的事情,如果你硬着頭皮省下來一堆全局時鐘樹,結果卻閑置在一邊,不派上用場,那簡直是浪費時間、白花心思。是以,全局時鐘樹這樣的“黃金地段”,不能不用,不能濫用,而要充分利用!是以,在全局時鐘樹資源不緊缺的情況下,無論時鐘域的大小,統一建議使用全局時鐘樹,因為這樣也能夠給編譯器提供最大的布局布線自由度,進而讓時序限制更容易實作。

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

時鐘信号怎麼“上樹”?

明确了該為時鐘信号使用的時鐘樹種類,那麼接下來就來看看具體的做法吧。

使用全局時鐘樹資源

方法一,通過正确的實體連接配接。

如果時鐘信号是由FPGA晶片的外部産生,那麼我們可以不通過程式設計就實作時鐘樹資源的配置設定。因為在FPGA晶片的外圍管腳中,有一些專門為全局時鐘設計的管腳,這點我們可以通過相應FPGA晶片的資料手冊來确認,如果在制作電路闆時,直接将外部時鐘信号通過這些管腳接入FPGA内部,那麼它将自動占有全局時鐘樹資源。當然了,這些管腳也可以接入普通的資料信号,編譯器會對該管腳引入的信号在FPGA設計内部扮演的角色進行分析,如果發現其并沒有作為時鐘信号來使用,那麼将不會為其配置設定時鐘樹資源。

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

如果很不巧,外部的時鐘信号沒有通過專用的全局時鐘管腳連接配接到FPGA内部,又或者某一個時鐘信号本身就是在FPGA内部産生的,例如FPGA内部PLL的輸出,那麼此時就需要通過編寫程式來完成時鐘的“上樹”工作了。有些時候,即使不使用代碼顯式指定,編譯器也會根據代碼的分析結果,來為時鐘信号配置設定全局時鐘樹資源,不過這種“靠天吃飯”的思想不可取,FPGA工程師一定要讓FPGA晶片盡可能的處于自己的掌控之下,而不是編譯器,是以強烈建議大家通過自己的代碼來指明時鐘樹的使用。那麼具體要怎麼通過HDL代碼來實作時鐘樹資源的配置設定呢?使用原語。更多關于原語的介紹請參閱【本篇->程式設計思路->原語的使用】章節,在這裡,我們隻簡單介紹一下如何使用原語來完成時鐘信号的“上樹”。

由于原語是跟FPGA晶片的生産廠商息息相關的,是以同一個功能的原語在不同的編譯器中的名稱很可能大相徑庭,例如,用于全局時鐘樹配置設定的最主要的原語,Xilinx公司叫它BUFG,而Altera公司卻稱其為global。在這裡,我們将以Xilinx公司的FPGA産品為例,來介紹代碼的描述方法,其他公司的FPGA産品方法類似,隻不過需要替換原語的名稱罷了。

如果FPGA内部有一個名為innerClk的時鐘信号,我們想為它配置設定一個全局時鐘樹,該怎麼辦呢?可以使用如下HDL描述:

-- VHDL example
signal globalClk : std_logic; 
onTree: BUFG port map(O => globalClk, I => innerClk);

// Verilog example
wire globalClk;
BUFG onTree(.O(globalClk), .I(innerClk));
           

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

被“拉下樹”的時鐘信号

-- VHDL example
	-- gClkOnTreeA is on the clock tree
	midClk0 <= not gClkOnTreeA; -- midClk0 is not on the clock tree;
	midClk1 <= en and gClkOnTreeA; -- midClk1 is not on the clock tree;
-- gClkOnTreeB is on the clock tree
	reOnTree0: BUFG port map (O => gClkOnTreeB, I => midClk0);
-- gClkOnTreeC is on the clock tree
	reOnTree1: BUFG port map (O => gClkOnTreec, I => midClk1);

	// Verilog example
	// gClkOnTreeA is on the clock tree
	assign midClk0 = ~gClkOnTreeA; // midClk0 is not on the clock tree;
	assign midClk1 = en & gClkOnTreeA; // midClk1 is not on the clock tree;
	BUFG reOnTree0(.O(gClkOnTreeB), .I(midClk0)); // gClkOnTreeB is on the clock tree
	BUFG reOnTree1(.O(gClkOnTreeC), .I(midClk1)); // gClkOnTreeC is on the clock tree
           

繼續閱讀