【黑金原創教程】【TimeQuest】【第五章】網表質量與外部模型

黑金微課堂

黑金微課堂系黑金動力社區(Http://www.heijin.org)旗下的原創教程連載博客。 通過此博客,我們將不定期的更新有關FPGA等技術的相關內容,敬請大家關注!

【黑金原創教程】【TimeQuest】【第五章】網表質量與外部模型

 

聲明:本文爲黑金動力社區(http://www.heijin.org)原創教程,如需轉載請註明出處,謝謝!


黑金動力社區2013年原創教程連載計劃:

http://www.cnblogs.com/alinx/p/3362790.html


《FPGA那些事兒--TimeQuest 靜態時序分析》REV5.0 PDF下載地址:

http://www.heijin.org/forum.php?mod=viewthread&tid=22811&extra=page%3D1


第五章:網表質量與外部模型

5.1 網表質量的概念

5.2 Fmax評估值

5.3 外部模型①

5.4 外部模型②

5.5 推導外包資料的公式

5.6 外部模型的input/ouput 約束指令

總結:


第五章:網表質量與外部模型

5.1 網表質量的概念

筆者在第二章稍微談過網表 ... 不過現在又爲何會無緣無故提及它呢?筆者以前曾以爲TimeQuest 等靜態時序工具是按照實際的物理情況來評估物理時序,不過事實卻不是如此。即使靜態時序工具再怎麼神,身爲數學工具的它只能模擬出“近似”的情況而已,其中一定留有餘量。

同樣,筆者也在第四章不停重複“默認網表下 ... 默認網表下”... 難道讀者不覺得有伏筆嗎?筆者不是在賣關子,因爲根據筆者的腳步而言,要理解接下來的內容,必須對TimeQuest 做好足夠的認識。爲此,筆者特地繞了一個大圈,爲了就是讓同學們做好準備。

TimeQuest 作爲數學工具必須根據各種 CASE 作出分析,CASE 簡稱點就是環境或者狀況,然而 TimeQuest 卻有兩種CASE,其一是 Worst Case,其二是 Best Case ,前者對應 slow model,後者對應 fast model。

表5.1 Worst Case 和 Best Case 的對應因數。

Case

模型

環境

溫度

性能限制

Worst Case

slow

極端

低溫/高溫

Best Case

fast

最佳

室溫

 

如表5.1所示,除了 slow model 和 fast model 以外,Worst Case 分別對應的其他因數有,極端環境,還有低溫/高溫的影響。換之 Best Case 對應有最佳環境和室溫。

所謂Worst Case是指極端的環境,也指主供源的電壓不穩定以外,還有各種內部延遲因數都推向極端,結果拖累整個硬模型的速度——Fmax,最終成爲 slow model,如此反思於是越壞的情況,衍生的保險餘量就越多,因此性能限制也很大。

所謂 Best Case是指最佳或者理想環境,也指不僅足夠而且還穩定,此外各種內部延遲因數越近似實際,也愈小,結果而言整個硬模型的速度——Fmax也會跟着提高,最終成爲 fast model。如此反思,越是理想的環境,一旦遇上麻煩可衍生的保險餘量也有限,因此性能限制也很小。

筆者這樣一講,可能會讓同學們一時之間不知所措 ... 不過我們可以這樣認爲。保險餘量就好比一位生存者,常常會思考最壞的情況,假設情況A。換言之,只要一天不發生比情況A更糟的事情,這位生存者都可以有餘過活。相反的,那些樂天的屁民們已經習慣過着舒適的生活,假設爲情況B。換句話說,只要稍微發生比情況B哪怕糟一點點的事情,屁民們就會被嚇到半死。

TimeQuest所謂的默認 CASE —— slow model也指最極端的情況,結果而言Time Quest

就像爲世界末日作好準備的生存者,往往評估和分析極端環境的各種狀況。粗略一點說

,凡是通過 slow model 分析的硬模型,fast model 理應也合格。反過來說,凡是在 fast model合格(屁民)的硬模型,不一定通過 slow model的分析。

繼續深入之前,讓我們回顧一下什麼是 post-fit 什麼是 post-map。雖然官方的手冊上有定義,用俗話說的話,post-fit 網表會參考近似物理的參數(優化之後),而 post-map 只會參考原生的編譯結果(優化之前)。論質量而言,post-fit 比起 post-map 更適合。

所謂的默認網表,是指 post-fit model -slow ,也是雙擊 Create Netlist 快捷選項會產生的結果,對應的tcl命令式create_timing_netlist -model slow。結果而言 TimeQuest 是不擇不扣的生存主義者,打從一開始就已經評估任何最壞的情況。當然讀者也可以回憶一下在第三章中所描述的“玩具與金錢還有媽媽”的比喻。

這個章節的重點,我們僅要了解各種 case 對內部延遲因數造成的影響,其中也包括寄存器的特性,如tsu,tco和th等。筆者繼續以實驗三的 delay_monster 爲例子,其中除了100Mhz的 create clock 聲明以外,一切約束命令通通都拿掉。

clip_image002

圖5.1.1 默認網表 worst case / slow model

首先我們先示範默認網表,亦即 worst case 或者 slow model,讀者可雙擊 create timing

netlist 選項,也可以調出 Create Timing Netlist 窗口,然後手動建立(如圖5.1.1所示)

clip_image004

圖5.1.2 隨意舉例10個節點的setup報告。

讓後隨意列出10個節點的 setup 報告,目前該時序違規與否,不是我們要關心的問題。

然而重點就在於 slack 和Data Delay值,以節點1爲例 -27.378ns 和 37.439ns。

clip_image006

圖5.1.3節點1的詳細信息(Setup)。

然後打開節點1的詳細信息,在此觀測 clock path—2.813ns 還有 uTco—0.304ns 和 uTsu—0.040ns。

clip_image008

圖5.1.4 隨意舉例10個節點的hold報告。

再來隨意舉例10個節點的hold 報告,以節點1爲例,slack 爲 5.952ns,而Data Delay 爲6.279ns。

clip_image010

圖5.1.5 節點1的詳細信息(Hold)。

再來展開節點1的詳細信息和觀察 uTh—0.306ns。

clip_image012

圖5.1.6 Fmax結果。

接着雙擊 Report Fmax Summary 調出 Fmax 簡報,結果如圖5.1.6所示—26.75Mhz。

===================================================================

clip_image014

圖5.1.7 自定義網表 best case / fast model

在此讓我們建立 best case 網表,亦即 fast model。這個必須手動建立,如圖5.1.7 所示。

clip_image016

圖5.1.8 隨意舉例10個節點的setup報告。

接着隨意列舉10個節點的setup報告,同樣 ... 此時時序違規與否都不是重點,讓我們注意節點1的 slack—1.194ns 還有 Data Delay—11.248ns

clip_image018

圖5.1.9節點1的詳細信息(Setup)。

再來展開節點1的詳細信息,關注 clock path—1.469ns,uTco—0.141ns和uTsu—0.032。

clip_image020

圖5.1.10 隨意舉例10個節點的hold報告。

同樣隨意舉例10個節點的hold時序報告,關注節點1的 slack—1.845ns。

clip_image022

圖5.1.11 節點1的詳細信息(Hold)。

接下來展開節點1的詳細信息,關注 uTh—0.152ns。

clip_image024

圖5.1.12 Fmax結果。

最後取得 Fmax 簡報 —— 89.33Mhz

===================================================================

根據上述的內容,筆者以節點1爲例(Setup和Hold各不同),然後根據不同的網表狀況,再取各種參數做出表5.1。

表5.1 節點rA[0]~rProduct[13] 革命劇Worst Case 和 Best Case的相關參數比較。

rA[0]~rProduct[13]

worst case/ slow model

best case/ fast model

Setup Slack

-27.378ns

-1.194ns

Data Delay

37.439ns

11.248ns

Clock Path

2.813ns

1.469ns

uTco

0.304ns

0.141ns

uTsu

0.040ns

0.032ns

Hold Slack

5.952ns

1.845ns

uTh

0.306ns

0.152ns

Fmax(約束前)

26.75Mhz

89.33Mhz

Fmax(約束後)

107.01 MHz

357.27 MHz

 

實際上表5.1不用看都知道那是一面倒的情形,亦即節點 rA[0]~rProduct[13] 的worst case 相較 best case 之下都呈現各種極端的參數結果。由於 worst case 把所有內部延遲因數都推向極端,結果導致 Fmax 的速度下降(無論是約束前或者約束後)。不過表5.1還有一個特殊的情形讓同學們在不知覺中產生疑問 ...

“worst case 的 hold slack 不應該比 best case 的 hold slack 更小纔對嗎?”,讓我們回憶一下用屁股求出 hold 餘量的公式:

保持餘量 = 數據抵達時間 - 數據獲取時間

Hold Slack = Data Arrival Time - Data Required Time

數據抵達時間 Data Arrival Time = 啓動沿 + Tclk1 + Tco + Tdata

數據獲取時間 Data Required Time = 鎖存沿 + Tclk2 + Th

= 理想保持關係值 + Tclk2 + Th

Hold Slack 是 Data Arrival Time 相減 Data Required Time 以後的結果,其中最爲關鍵的是 Tdata(Data Delay),worst case 與 best case 相比之下 worst case 的 Data Delay還有大過 best case 的 Data Delay。結果也因此造成 worst case 的 hold 餘量大於 best case 的 hold餘量。

===================================================================

筆者曾經這樣思考過:“創建網表會不會也是某種約束呢?”例如創建默認網表A,sdc文件下就會添加相關的約束,然後編譯器會依照這個約束命令來創建網表A的硬模型

;如果是網表B,就會創建網表B的硬模型等 ... 這是學習 TimeQuest的思路陷阱。

事實上,網表的概念非常直接 ... 首先把TimeQuest 想象成硬模型的模擬器,我們可以假設 best case 硬模型是最接近物理硬模型,不過相較實際的硬模型 best case 的硬模型還保留10~20%的餘量。假設物理硬模型的某個延遲值是10ns,那麼best case硬模型對於10ns採取保留的12ns。

相反之下 worst case 硬模型是最保險的硬模型,比起 best case 硬模型worst case 硬模型相較物理硬模型有80~90%的餘量。再假設物理硬模型的某個延遲值是10ns,那麼worst case硬模型會採取保險的 19ns。

這個作法有一個好處 ... 就算 best case 硬模型遇見狀況,如果不超過10~20%的餘量範圍,結果還是健康。相反對於 worst case 硬模型而言,餘量範圍比起 best case 硬模型還要更大。舉例某個狀況是發生35% 的範圍,那麼best case 硬模型就會出現問題,換之 worst case 硬模型還是穩如泰山。

讓我們繼續思考 ... 有關延遲怪獸實驗的重點就是“即時式Booth乘法器”。31ns的延遲壓力是不是實值呢?31ns延遲壓力是 worst case硬模型的保險估算,最接近是實值是 best case硬模型,延遲壓力大約是10ns左右。即時式 Booth 乘法器的壓力取值實際上比best case硬模型還要低,不過具體的數值是多少呢?這點我們就不知道了。

實驗六的 delay_master 筆者以 worst case 硬模型評估即時式 booth 乘法器的延遲壓力,大約是30ns左右,然後供源和加工時間都給予40ns的。

總體而言,默認下的TimeQuest都是採取保險措施,亦即默認下網表是 slow model,默認硬模型是 worst case。不過,這不是強制性的 ... 同學們還有各種選項自由選擇,如post-fit和post-map,或者 speed grade,還是 zero ic delay 等。

不過根據一般使用習慣,有時候需要比 worst case 更極端的環境 ... 假設同學預測到在環境A會使時鐘頻率更動10%,除了選擇 worst case 硬模型以外,同學還可能不放心,所以在 create clock(聲明主時鐘)的時候,會故意爲主時鐘留下10~20%的餘量 ... 如100Mhz的頻率,會用80~90Mhz或者100~120 Mhz的頻率分別測試 worst case 硬模型。

另外還有一種說法說,best case網表 setup分析不容易合格,worst case 網表 hold分析不容易合格。結果會分別用 best case 針對 setup分析,用 worst case 針對 hold 分析,如果best case下 setup分析有餘量 & worst case 下 hold 分析有餘量,那麼這個模塊就是沒問題。

此外也有這樣的說法,在室溫(常溫)以外的極端溫度:如在低溫狀態,所有資源會有所遲鈍;高溫狀態會提高資源的阻值。所以 worst case 有時候也用來測試模塊在某種惡劣的溫度下是否能正常工作。

嘛 ... 網表的故事是千奇百怪的,對於普通的使用而言: worst case 最保險但是性能限制大;best case 保險有限但是性能限制小。說白一點,假設FPGA的最高頻率是300Mhz,如果使用 best case,最高頻率使用允許是280Mhz左右;如果使用 worst case,最高頻率的使用允許是60Mhz左右。

總結說“牛排到底要幾成熟最後還是要根據客官當時的口味”,筆者是非常怕死,所以喫牛排都是全熟,亦即 worst case 最適合筆者 ... 結果同學又如何呢?最後補上不相關的話題 ... 當TimeQuest爲某個設計建立網表(硬模型)的時候,而這個網表只是分析對象卻沒有環境因數,或者缺少分析環境 ... 因爲如此,我們需要透過各種約束命令爲分析對象製造刺激,以致達到接近的現實的環境因數,這也是俗稱的網表約束。

這個環境因數就是所謂的內部延遲因數,還有外部延遲因數。內部延遲因數TimeQuest可以自動曉得,反之外部延遲因數卻必須人爲告知。假設某個設計的硬模型,它的外部路徑有3ns的延遲 ... 當我們用TimeQuest這個硬模型的時候,我們有必要將3ns延遲的外部路徑告訴TimeQuest,好讓它可以分析3ns的延遲是否對這個硬模型的時序作出違規。

5.2 Fmax評估值

fmax 是什麼?Fmax 是一個用處不大的評估值,亦即某節點的最高頻率(也可以理解成是組合邏輯的數量),同時也是網表性能限制的評估值。當我們雙擊 Report Fmax Summary,TimeQuest 會將某個節點的 Fmax 提出;如果某個設計有時序違規,TimeQuest 又會將那個有問題的 Fmax 提出。

Fmax之所以曖昧是因爲它僅評估某個節點 ... 不,更貼切說是部分節點的最高頻率。在一羣小朋友之中有幾位是特別調皮,結果我們卻不能說所有小朋友都一樣調皮,Fmax的情形就好比這個比喻。在前面我們瞭解過 worst case 是某個極端的狀況,亦即餘量範圍的保留很大,內部延遲壓力的保險取值也隨之很高,結果卻導致Fmax的評估降低。換句話說,best case 的 Fmax評估比起 worst case 有更好的表現(也更接近實體的Fmax評估)。

clip_image026

圖5.2.1 Fmax評估模型。

fMAX = 1/(<register to register delay> - <clock skew delay> + <micro setup delay> + <micro clock to output delay>)

clock skew delay = <clock to destination register delay> - <clock to source register delay>

= Tclk2 - Tclk1

圖5.2.1 是Fmax評估模型(基本上也是基於 TimeQuest分析模型)而Fmax求出的公式如上述所示,包含:reg2reg delay 就是兩者寄存器之間的總和延遲,亦包括組合邏輯延遲,路徑延遲等;clock skew delay,中文叫時鐘差也是 Tclk2 相減 Tclk1的結果;micro setup delay 的符號是 Tsu,也是目的寄存器最小的建立時間;micro clock to output

delay 的符號是 Tco,也是源寄存器輸出最小延遲時間。

從一個簡單的公式中我們可以理解到,Fmax事實上是單個節點的最高頻率評估值,其中最左右 Fmax 的兇手就是 reg2reg delay ... 粗略點說,Fmax高低是否,是由寄存器之間夾着的組合邏輯的延遲壓力來決定。Fmax之所以曖昧是因爲TimeQuest每當給出 Fmax,實際上是針對“最差勁節點”的評估值。

換句話說,如果某個設計出現時序違規,TimeQuest就會給出那個“最差勁節點”的Fmax,而不是其他 ... 那怕其它節點也是違規,只要不是最差勁就不會被TimeQuest提名。

“如何提升Fmax”算是學習TimeQuest的迷信吧 ... 有許多同學認爲只要Fmax比系統時鐘(主時鐘)的頻率還要高時序越Okay。話說這種迷信也不無道理,因爲 Fmax是針對“最差勁節點”... 換言之,如果該“最差勁節點”得到好成績,那些不是最差勁的節點的成績當然比“最差勁節點”好。這回就讓筆者暫時入鄉隨俗和大夥一起迷信,一同尋找“提升Fmax”的昇仙之路。

Fmax另一種既是“組合邏輯的數量”,如何減少組合邏輯的數量,直接上與 HDL的建模有十足的關係,不過我們先拋開 HDL不說 ... 如此一來,網表的質量就是下一個因數,同樣我們也拋開網表不說 ... 這個拋開,那個拋開,餘下還有什麼因素可以影響Fmax呢?啊 ... 就只剩下編譯器了。

我們知道軟模型要變成硬模型就需要經過編譯器的綜合 ... 話是那麼說,不過我們又要如何設置編譯器呢?回去Quartus,Assignment菜單進入 Setting :

clip_image028

圖5.2.2 Physical Synthesis Optimizations 優化選項。

如圖5.2.2所示,我們可以打開相關的選項如 Perform register retiming;Effort Level - Extra;Perform register duplication。

clip_image030

圖5.2.3 Filter Settings 優化選項。

或者進入 Filter Setting,打開 More Setttings,然後將 Router Effort Multiplier 設置3.0 還有 Router Timing Optimization level 設置 Maximum。基本上設置上述優化選項以後,Fmax可以提高 10~15%,不過要增加編譯的時間。(至於這些優化選項有什麼具體的意義?請高擡貴手放過筆者,自己回去翻翻Quartus手冊就可以知道了)

好了,讓我們把主題切回 Verilog ... 雖然說減少組合邏輯就等於提升 Fmax,不過在建模的時候,使用組合邏輯是不可避免的,而且組合邏輯的使用數量我們也是模糊。舉個例子來說:

if( C1 == 10 ) begin ... end

當我們聲明 if,不知使用了N個組合邏輯 ... 然後聲明 == 有不知道使用了N個組合邏輯。說實在,如果不使用 if 或者 == 等這些關鍵字HDL 就不是 HDL了。既然如此 ... HDL 與 Fmax 之間還存在什麼“優化空間”呢?我們又該如何下手呢?同學們還記得《整合篇》裏出現過的“操作模式”嗎?事實上,我們可以從操作模式上下手,不過這話又如何說呢?

clip_image032

圖5.2.4 筆者所知的各種操作模式。

HDL有並行操作的本質,並行操作自然而然也是HDL的默認操作,可是這種默認操作就像沒有容器的水源,不好控制。結果筆者就自定屬於自己的義默認操作,亦即仿順序操作了 ... 並行操作如果要模仿順序操作,根本上就要付出最基本數量的組合邏輯,建立可以支持順序操作的結構。

據筆者所知,仿順序操作可以轉換成爲其他操作模式 ... 如循環操作,它本質上還是順序性的操作模式,不過它重複利用同一個資源,結果而言會比方順序操作少用一點資源;即時操作就不用說了,本身就是一個大組合邏輯,也是Fmax最大的敵人;至於流水操作是最接近並行操作的操作模式,它不像仿順序操作那樣用而外的資源建立支持順序的結構,結果而言它擁有的Fmax 比其它操作模式高。

clip_image034

圖5.2.4 即時操作。

如果不苟其他小節,讓筆者舉個簡單的例子,如圖5.2.4所示,夾在兩個寄存器之間是即時式Booth乘法器。換言之兩個寄存器之前存有一個40ns延遲壓力的組合邏輯,不過過大的延遲壓力會降低 Fmax,因此我們必須更改 Booth 乘法器的操作模式,其中流水操作是最爲理想。

clip_image036

圖5.2.5 流水操作。

同樣繼續不苟其他小節的話 ... 筆者將即時式Booth 乘法器隨便分屍成8個部分,因此40ns的延遲壓力就會被品均化爲5ns,延遲壓力的降低隨之也會提升 Fmax。上述只是粗略的例子而已,雖說流水操作在 Fmax 的表現上擁有最好的成績,不過流水操作不是什麼場合也適合,如“步驟性強的操作”它就顯得英雄無用武之地了。

HDL除了操作模式以外,還有HDL的使用習慣 ... 如:嵌套If的層次又或者 <= 和 = 的使用,讓筆者舉個簡單的例子。

if( C1 == 1 ) //嵌套 if

if( C1 == 2 )

if(C1 == 3)

begin rA = 1 + Z; rB <= rA; end // 應用即時事件

嵌套if 按原理來說會建立更深的邏輯層次 ... 雖然這樣的做法沒有錯,不過從代碼的解讀來講是非常不推薦。應用即時事件是筆者的壞習慣,好處上可以偷喫時鐘,壞處上增加該節點的延遲壓力。總結來說 ... HDL 如何優化 Fmax歸根就底還是需要根據當時的情況而定,所以是沒有絕對的規則。

好了,有關 Fmax的故事就講到這裏吧 ... 同學們好好記住,Fmax不過是一個用處不大的評估值而已,雖說 Fmax 越高越好,不過不是每個設計都需要那麼高的 Fmax。此外Fmax也是性能限制的另一種評估值。

5.3 外部模型①

如果筆者說:“大部分的約束命令都是爲外部延遲因數而存在 ... ”,同學們又相信嗎?

事實上,這句話一點也不誇張 ... 在第三章中筆者曾解釋說,外部和內部之間的區別就是 TimeQuest 知道與不知道,自動與手動。直接點說,內部各種延遲因數就好比 TimeQuest身上的一塊肉,它當然知道這塊肉是什麼樣子,既然它知道這塊肉是什麼樣子,TimeQuest自然會曉得這塊肉的相關信息。這就是所謂的 知道和自動。

外部延遲因數就好比別人身上的一塊肉,TimeQuest自然而然不知道這塊肉的具體形狀,

結果那個人就無比告訴TimeQuest自己身上的那塊肉是在哪裏,是什麼形狀等相關信息。者就是所謂的不知道與手動。因此如此,TimeQuest有大部分的約束命令就是用來告訴TimeQuest相關的“外部信息”。

在此之前,先讓我們回憶一下之前學過的內容 ... TimeQuest事實上只會在模型裏打滾的豬頭,亦即只要它離開模型,它就不曉得如何打滾了,這個模型就是我們熟悉的TimeQuest模型。所以說,TimeQuest能不能分析外邊的時序狀況之前,TimeQuest模型能不能山寨?如何山寨?纔是頭號任務。

clip_image038

圖5.3.1 節點概念的TimeQuest模型

圖5.3.1是最沒有個性的TimeQuest模型 ... 換句話說,節點模型是概念上的TimeQuest模型,不過除了時鐘固定以外,節點1,節點2和延遲都會隨着山寨的目標不同也跟着改變。

clip_image040

圖5.3.2 內部的TimeQuest模型。

圖5.3.2 是大夥再熟悉不過的內部 TimeQuest模型,同時間也是默認下的TimeQuest模型,亦即除了時鐘信號不變以外,就是兩個寄存器夾着一個組合邏輯。根據FPGA的基本資源而言,除了寄存器以外的一切,如乘法器,PLL等都可以看成組合邏輯。

clip_image042

圖5.3.3 外部的TimeQuest模型。

圖5.3.3是外部的TimeQuest模型(簡稱外部模型)也就是接下來我們要學習的內容。事實上外部模型是最麻煩,也是上鏡率最低的TimeQuest模型。它之所以麻煩是因爲它有fpga2ic 或者 ic2fpga之分,fpga2ic 也是fpga輸出致 ic,又說ic讀入fpga;換之

ic2fpga 是ic輸出致ic,又說fpga讀入ic。至於外部延遲有第三章所說的種種。

之所以說外部模型上鏡率最低是因爲外部模型的山寨成功率是非常低,除了特定的 ic 芯片如 sdram或者高速 dac/adc 等以外,外部模型幾乎不能成立。話雖這麼說,不過大部分約束命令卻因它而生,可見它在學習中有多重的分量。

醜話說在前頭,在後來的實驗裏,筆者也只能用 sdram 作爲學習對象,那些不熟悉的同學應該好好補補一下與 sdram有關的知識 ... 老王賣瓜一定會自賣自誇,筆者建議《整合篇》的第三章,嘻嘻。那麼,讓我們開始吧。

===================================================================

筆者在前面說過,外部模型和內部模型之間的區分就在於知道與不知道,自動與手動。

至於是什麼樣的“不知道”的外部因數,必須通過“手動”告訴 TimeQuest呢?

clip_image044

圖5.3.4 各種需要告訴 TimeQuest的延遲因數。

基本上要告訴 TimeQuest的外部延遲因數不算多,在此有可以劃分2個情況:

fpga2ic:

fpga2ext是fpga致ic信號的走線延遲;

clk2fpga是時鐘信號致fpga的走線延遲;

clk2ext是時鐘信號致fpga的走線延遲;

Tsu/Th 外部器件的寄存器特性;

(Tsu信號建立時間;Th信號保持時間)

ic2fpga:

ext2fpga是ic致fpga信號的走線延遲;

clk2fpga是時鐘信號致fpga的走線延遲;

clk2ext是時鐘信號致fpga的走線延遲;

Tco/minTco 外部器件的寄存器特性;

(Tco信號輸出時間;minTco最小信號輸出時間)

clip_image046

圖5.3.5 (左)fpga2ic簡單例子(右)理想時序圖。

假設有一個簡單的fpga2ic例子,如5.3.5的左圖所示。fpga向ic發送一個時鐘週期的D[0],如5.3.5的右圖所示,此時時序圖是理想狀態。

clip_image048

圖5.3.5 建立時間與建立關係的等價圖。

圖5.3.5左邊是信號D[0]有2ns的延遲,隨之導致 Data向右移動2ns,最後Data的建立時間剩下8ns。圖5.3.5右邊是等價圖,這個等價圖基本上是無視Data。換句話說,2ns的延遲,讓啓動沿向右移動2ns,結果使得建立關係成爲8ns。圖5.3.5有一個重點,亦即左圖是數據與時鐘相互作用,取得數據的建立時間;相反,右圖裏的時鐘和數據相互作用不大,而是用啓動沿和鎖存沿取建立關係。

clip_image050

圖5.3.6 保持時間與保持關係的等價圖。

如果建立時間和建立關係有等價圖,同樣保持時間與保持關係也有等價圖,如5.3.6所示。左圖是 D[0] 受2ns延遲,接着數據向右推向2ns,最後取得2ns的保持時間。換之,右圖是建立時間的等價圖,亦即2ns延遲影響下一個啓動沿向右移動2ns,結果導致建立關係取得-2ns。

建立時間或者保持時間是分析一般時序圖時用來評價數據的有效性,換之建立關係和保持關係是TimeQuest應用在模型或者公式的參考值。不過不管怎麼樣,理想時序 ... 更貼切說是在理想狀態下,建立時間或者建立關係相等於時鐘週期,保持時間或者保持關係相當於零值。在此,我們先理解這些,接着再繼續往後看 ...

clip_image052

圖5.3.7 ext_clk右移,建立時間與建立關係的等價圖。

除了數據信號會受延遲影響以外,同樣時鐘信號也會受延遲影響,圖5.3.7是 ext_clk信號受2ns延遲的結果 ... 左圖中,ext_clk受延遲影響而向右移動2ns,結果建立時間爲10ns;換之,右圖是建立關係的等價圖,亦即由於ext_clk受2ns延遲的影響,鎖存沿也從原本10ns的位置,移至12ns,結果造成建立關係爲10ns。

這種看法是不傷大雅的碎事,不過對於TimeQuest而言,尤其是計算上 ... 我們知道 TimeQuest是利用 Setup Relationship(建立關係)與Hold Relationship(保持關係)作爲計算的參考和補助(或者簡化),單是數據信號跑來跑去TimeQuest已經夠煩了,如果時鐘再參一腳也跑來跑去的話,結果會造成TimeQuest 會抓狂的,爲此 ...

===================================================================

師弟:我說,師兄呀 ... TimeQuest 在計算的時候,有沒有利用“手段”,不讓時鐘跑來

跑來去,而只讓數據跑來跑去?

師兄:什麼跑來跑去?你的意思是不是說“讓時鐘信號的延遲變化影響在數據身上”,

亦即TimeQuest計算時,時鐘信號位置基本不變,不過時鐘信號受延遲影響的結

果直接疊加在數據信號身上?

師弟:真不愧是我的偶像,那麼快就悟出本意 ...

師兄:少拍馬屁了 ... 不過,TimeQuest確實有用“手段”!

師弟:手段?什麼樣的手段?我很好奇!

( 師弟的眼睛睜得大大的 ... )

師兄:在Fmax的章節中,有沒有了解過 Clock Skew?

師弟:有是有 ... clock skew 就是目的寄存器clk相減源寄存器clk的時鐘差,對否?

師兄:正解!

師弟:不過,師兄啊 ... 我雖然知道 clock skew 的定義而已,但不曉得實際用途卻。

師兄:fmax與clock skew放在一起談的確意義不大,畢竟影響fmax的兇手還是組合

邏輯的延遲壓力。

師弟:那麼,clock skew 的實際用途是甚麼?

師兄:嘛,別急師弟,讓我們看akuei2如何解釋 ...

(師兄話玩用手指着電腦屏幕 ... )

===================================================================

clock skew 的定義正如師弟所言“的寄存器clk相減源寄存器clk的時鐘差”,爲方便筆者就稱呼“時鐘差”,然而 clock skew 的公式如下所示。clock skew結果最終會直接作用在數據的延遲上。

clock skew = < destination reg clock delay > - < source reg clock delay >

時鐘差 = <源寄存器時鐘源延遲> - < 目的寄存器時鐘源延遲 >

對 fpga2ic 的外模型而言,fpga_clk 是源寄存器時鐘然而ext_clk 是目的寄存器時鐘。從圖5.3.7中我們可以知道 fpga_clk 的延遲是0ns,而 ext_clk 的延遲是2ns,clock

skew取值自然是 2ns。

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = <ext_clk delay> - < fpga_clk delay>

= (2 - 0)ns

= 2ns

data delay = 2ns

data delay' = <data delay> - <clock skew>

= 2ns - 2ns

= 0ns

data delay 數據延遲

data delay' 時鐘差作用後的數據延遲

clip_image054

圖5.3.8 clock skew,建立時間與建立關係的等價圖。

圖5.3.8是圖5.3.7受 clock skew 作用以後,建立時間與建立關係的等價圖。從中我們可以知道fpga_clk 還有 ext_clk 不再跑來跑去,換之原本向右移動2ns的D[0],受時鐘差2ns作用以後的位置是0ns。結果造成建立時間爲10ns,至於右圖的啓動沿也受到時鐘差的作用,從原本的2ns返回0ns,最終建立關係取得10ns。

圖5.3.8的建立時間與建立關係結果,基本上和圖5.3.7的建立時間與建立關係一模一樣。

這下 clock skew真的神了 ... “欸,筆者!clock skew 真的那麼神嗎?還是你老子在故弄玄虛?”爺爺我是不騙人的,不信嗎?好,讓我們再實驗看看 ..

clip_image056

圖5.3.9 fpga_clk與ext_clk右移,建立時間與建立關係的等價圖。

圖5.3.9左圖中的fpga_clk 延遲1ns;ext_clk延遲2ns;D[0]的延遲還是之間的2ns。結果而言,Data的建立時間是9ns。然而右圖中,啓動沿不僅受D[0]的2ns延遲,也受fpga_clk的1ns延遲影響,結果啓動沿從原本的0ns變成3ns。不過,鎖存沿本身也受ext_clk的2ns延遲影響,最終取得的建立關係是9ns。然後讓我們來計算一下 clock skew 與 data delay'

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = <ext_clk delay> - < fpga_clk delay>

= (2 - 1)ns

= 1ns

data delay = 2ns

data delay' = <data delay> - <clock skew>

= 2ns - 1ns

= 1ns

clip_image058

圖5.3.10 clock skew,建立時間與建立關係的等價圖。

圖5.3.10是圖5.3.9受時鐘差作用下的結果,左圖中的 Data 從原本的2ns延遲,由於受到時鐘差影響,結果延遲變成1ns,最終建立時間取得9ns。換之,右圖中的啓動沿原本位置是2ns,不過受到時鐘差的影響,結果退回1ns,建立關係從而得到9ns。好了,讓我們在一次比較圖5.3.10和圖5.3.9的建立時間與建立關係,答案是不是一樣呢?這回信服了吧,哇咔咔咔!哇咔咔咔!

同學們現在還不能放心,目前我們只是瞭解到 clock skew如何影響數據的延遲,從而使得圖5.3.10是圖5.3.9的建立時間和建立關係取得同樣結果 ... 如果換個角度來想 clock skew作用現象也是不是會發生在保持時間與保持關係的身上呢?本當に興味深い。

clip_image060

圖5.3.11 ext_clk右移,保持時間與保持關係的等價圖。

圖5.3.11左圖是ext_clk 同D[0]延遲2ns,結果造成保持時間爲0ns。然而右圖中的下一個時間沿雖然受到2ns的延遲,從原本的10ns變成12ns,不過由於 ext_clk 也有2ns的延遲,保持關係最後取得0ns。接下來,讓我們計算一下時間差和受作用以後的 data delay:

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = <ext_clk delay> - < fpga_clk delay>

= (2 - 0)ns

= 2ns

data delay = 2ns

data delay' = <data delay> - <clock skew>

= 2ns - 2ns

= 0ns

clip_image062

圖5.3.12 clock skew,保持時間與保持關係的等價圖。

圖5.3.12 與 圖5.3.11 的保持時間和保持關係對於之下,同樣的答案,同樣的結果,不同的只是發生經過。圖5.3.12的左圖,數據原本受2ns的延遲以後應該在2ns的位置,可是被 2ns的時鐘差絆了一道以後變回到0ns的位置,從而取得0ns的保持時間。換之,右圖中的下一個啓動沿原本受2ns的延遲以後,位置應該是12ns纔是,可是不小新絆到 2ns的時鐘差便跌回10ns的位置,結果頁造成0ns的保持關係。

clip_image064

圖5.3.13 fpga_clk 和 ext_clk右移,保持時間與保持關係的等價圖。

圖5.3.13左圖中由於fpga_clk 受延遲1ns,ext_clk受延遲2ns,結果造成保持時間爲1ns

。換之,由圖中的下一個啓動沿由於受到fpga_clk的延遲,再加上D[0]的延遲,最終停留在13ns的位置,不過鎖存沿也受到 ext_clk 延遲2ns的影響,從而保持關係成爲-1ns。

還是先計算時鐘差和受作用以後的data_delay' ...

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = <ext_clk delay> - < fpga_clk delay>

= (2 - 1)ns

= 1ns

data delay = 2ns

data delay' = <data delay> - <clock skew>

= 2ns - 1ns

= 1ns

clip_image066

圖5.3.14 clock skew,保持時間與保持關係的等價圖。

圖5.3.14與圖5.3.13相較之下,同樣的保持時間,同樣的保持關係,不同的只是發生經過 ... 左圖中的D[0]受2ns的延遲,原先位置應該在2ns纔對,不過由於受到時間差1ns的作用,結果退回到1ns的地方,最終取得1ns的保持時間。換之,右圖的下一個啓動沿,原本受2ns的延遲,位置應該在12ns纔是,不過它不小心撞到1ns的時間差,就這樣跌在11ns的位置,最後也不小心取得-1ns的保持關係。

嘻嘻,經過那麼多實驗 ... 同學們也該相信筆者不在故弄玄虛吧!?筆者想必許多同學一定很好奇,這章節我們不是應該在談有關外部模型和外部延遲有關的種種嗎?爲什麼無緣無故又扯上那麼多稀奇古怪的內容?嘛 ... 彆着急,這些都是最基本知識,習得它以後同學們就可以飛天遁地了。

5.4 外部模型②

clip_image068

圖5.4.1 ic2fpga(ext2fpga)的外部模型。

在章節5.3的時候,我們已經談過 fpga2ic的外部模型,還有建立時間,建立關係,保持時間,保持關係,或者clock skew作用等內容。然而這章節將要討論的是 ic2fpga 外部模型,至於內容基本上與fpga2ic大同小異而已,fpga2ic與ic2pfga之間的差別就在fpga與ic的角色扮演換了位置而已:fpga2ic是fpga輸出數據ic讀;ic2fpga是ic輸出數據fpga讀。

clip_image070

圖5.4.2 ext_clk和fpga_clk 右移,建立時間與建立關係的等價圖。

圖5.4.2是不是很眼熟?那當然,筆者只是替圖5.3.9換張皮而已,不過習慣上還是隨便解釋一下。左圖中的ext_clk受1ns延遲,而fpga_clk受2ns延遲,再加上D[0]的2ns延遲,最終導致建立時間爲9ns。換之右圖中的啓動沿,受D[0]延遲2ns再加上ext_clk延遲1ns的影響,結果位於3ns ... 不過 fpga_clk也受2ns的延遲,最後建立關係取得9ns的成績。

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = < fpga_clk delay> - <ext_clk delay>

= (2 - 1)ns

= 1ns

data delay = 2ns

data delay' = <data delay> - <clock skew>

= 2ns - 1ns

= 1ns

clip_image072

圖5.4.3 clock skew, 建立時間與建立關係的等價圖。

圖5.4.3是圖5.4.2受clock skew影響的時序圖。ext_clk 與 fpga_clk時鐘差是1ns,這個時鐘左右了原先位置應該在2ns的D[0],不小心倒回1ns的位置,最後取得9ns的建立時間。換之,右圖中的啓動沿原先受D[0]的2ns延遲,位置應該落在2ns纔是,不過被1ns的時間差絆了一腳,然後跌在1ns的位置,因此取得9ns的建立關係。

clip_image074

圖5.4.4 ext_clk 與 fpga_clk 右移,保持時間與保持關係的等價圖。

不要懷疑,圖5.4.4同是圖5.3.13的換皮結果 ... 左圖中,由於D[0]受到自身2ns的延遲,還有ext_clk延遲的影響,導致起跑線在3ns,而fpga_clk也受2ns的延遲,最後導致保持時間爲1ns;換之,右圖中的下一個啓動沿由於受到 1ns的ext_clk 延遲,再加上D[0]本身的2ns延遲,結果下一個啓動沿的位置從13ns開始,不過由於fpga_clk也受到2ns延遲的影響,最終保持關係取得-1ns。

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = < fpga_clk delay> - <ext_clk delay>

= (2 - 1)ns

= 1ns

data delay = 2ns

data delay' = <data delay> - <clock skew>

= 2ns - 1ns

= 1ns

clip_image076

圖5.4.5 clock skew,保持時間與保持關係的等價圖。

圖5.4.5是圖5.4.4受clock skew 作用以後的時序圖。左圖中的D[0]原本應該從2ns的位置起跑,可是不小心踩到1ns的時間差,然後跌倒在1ns的位置,從而造就1ns的保持時間。換之,由圖中的下一個啓動沿,原受到2ns的延遲而在12ns的位置,結果還是一樣衰,不小心踩到1ns的時間差,然後跌在11ns的位置,最後導致保持關係爲-1ns。

到目前爲止,我們只是在瞭解單位寬信號(數據)的傳輸而已 ... 更多時候,信號位寬都是N*字節爲單位,因此我們有必要好好學習一下TimeQuest是如何“應付”這些多位寬的數據呢?

clip_image078

圖5.4.6 fpga2ic外部模型的多位寬數據傳輸。

圖5.4.6左圖相較上一章節的fpga2ic的外部模型不是D[0]而是D[0:2],也就是多位寬數據傳輸,然而右圖是多位寬傳輸的理想時序圖(fpga向ic發送3位10ns週期的數據/信號)。

TimeQuest認識單位寬傳輸與多位寬傳輸的方法基本上是大同小異,換句話說 ... 某個單位寬重複n次後就會成爲多位寬。筆者知道自己在說廢話,不過也就是這句廢話讓筆者領悟到,TimeQuest不會那麼努力一個一個去識別單位寬,而且我們也不可能逐個逐個將單位寬告訴TimeQuest ... 不然我們和TimeQuest都會抓狂。因此TimeQuest在應付多位寬的時候偷偷用“手段”?這個“手段”又是什麼呢?

clip_image080

圖5.4.7 均爲與不均勻的延遲壓力。

假設fpga2ext的路上存有延遲,結果造成數據D向右移動,這時候我們會遇見延遲壓力均勻與不均勻的問題,延遲壓力均勻如圖5.4.7左圖所示,換之延遲壓力不均勻如圖5.4.7右圖所示。延遲壓力如果均勻的話,不僅在審美上,繪製時序圖上,還是JDL在時序產生上,都非常便利。相反的,如果延遲壓力不均勻的話,在許多方面上會麻煩一點。

筆者在《整合篇》中曾經舉例過,自定義的乘法器比起傳統的乘法器更容易控制延遲壓力均勻與否。當然所謂的延遲壓力均勻不是圖5.4.7的左圖中出現一樣 ... 那麼完美的數值,實際上會是2.8ns,2.9ns,3.1ns等接近3ns的數值。事實上,延遲壓力均不均勻只是完美主義的追求而已,對實際的影響不大,話雖如此 ... 不過可以的話筆者也會努力去均勻一點各個延遲壓力,畢竟這樣看會比較順眼一點~笑。

clip_image082

圖5.4.8 延遲壓力不均勻與建立時間和保持時間的關係。

讓我們切回主題 ... 延遲壓力不均勻是時序的家常便飯,圖5.4.7的右圖告訴我們最大的延遲是 D[2] 的3ns,最小的延遲是D[1] 的1ns。因此,我們可以這樣說道:

D[0..2] delay max = 3ns;

D[0..2] delay min = 1ns;

圖5.4.8是延遲壓力不均勻給建立時間和保持時間造成的影響。讓我們來思考吧 ... 圖5.4.8 的左圖中,有3個信號(數據),D[0]的建立時間爲9ns,D[1]的建立時間爲8ns,還有D[2]的建立時間爲7ns。“請問哪一個數據的建立時間最危險的?”,在物理時序角度上,亦即建立時間越少越危險,我們當然將矛頭指向D[2]。

圖5.4.8的右圖中,同樣也是3個信號,D[0]的保持時間爲1ns,D[2]的保持時間爲2ns,D[3]的保持時間爲3ns。“請問哪一個數據的保持時間是最危險的?”,在物理時序角度上思考,亦即保持時間越少越危險,結果最危險的保持時間自然是D[0]。因此我們可以這樣結論:在D[0]~D[2]三個位寬中,delay max 影響建立時間(建立關係), delay min 影響保持時間(保持關係)。

“欸 ... 筆者怎麼搞的?我越來越搞糊塗了”這個問題一定會由心而生吧?呵呵 ... 筆者沒有胡來,筆者也沒有胡搞,同學們稍微回憶一下“fmax最差勁節點”的故事。事實上,上述的結論與“最差勁節點”都有相同的原理 ...

TimeQuest在分析D[0..2]建立時間的時候,它只要注意“最危險的建立時間”即可,按邏輯而言,沒有什麼比“最危險”更危險。同樣思路,TimeQuest在分析D[0..2]保持時間的時候,它只要注意“最危險的保持時間”即可,因爲沒有什麼比“最危險”更危險。

clip_image084

圖5.4.9 (左)建立時間與保持時間,(右)建立關係與保持關係,之間的等價圖。

圖5.4.9左邊是建立時間與保持時間的時序圖,換之右邊是建立關係與保持關係的等價圖。筆者曾講過,建立關係與保持關係的等價圖事實上不怎麼關心數據的死活,然而它們僅關心,啓動沿,下一個啓動沿,或者鎖存沿的變動,還有建立關係和保持關係而已。

從右圖中我們可以瞭解到,3ns延遲的delay max 影響啓動沿從原本0ns 的位置,向右移至3ns。換之,1ns延遲的delay min 影響下一個啓動沿從原本的 10ns位置,向右移至11ns。最終導致建立關係爲7ns,保持關係爲-1ns ... 這個結果與7ns的建立時間,1ns的保持時間不謀而合。

讀到這裏,筆者理解到許多同學可能一時之間無法消化這些莫名奇妙的東西 ... 說實話,筆者初次認識的時候也有同樣的感覺,原本感覺莫名奇妙的東西經過多次研究以後,漸漸覺得“情有可原” ... 然後誠心接受了。從學習 Verilog 到至今再莫名奇妙的事情也遇過了,最終筆者領悟到一個道理,要用那個世界的自然思考那個世界的現象,不要用這個世界的自然思考那個世界的現象。

接下來讓我們繼續思考 .... clock skew 如何影響 delay max 與 delay min ?

clip_image086

圖5.4.10 Clock skew 影響建立時間與保持時間的時序圖。

在圖5.4.10的左圖中,fpga_clk有1ns的延遲,ext_clk有2ns的延遲,然而D[0]有2ns的延遲,D[1]有3ns的延遲,D[2]有4ns的延遲。各種延遲與數據相互作用以後,D[0]取得9ns的建立時間,1ns的保持時間;D[1]取得8ns的建立時間,2ns的保持時間;D[2]取得7ns的建立時間,3ns的保持時間。接下來,讓我們先計算一下 clock skew ...

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = <ext_clk delay> - < fpga_clk delay>

= (2 - 1)ns

= 1ns

clock skew 的結果爲1ns,結果D[0..2]的延遲都被絆了一腳,通通向後移動1ns,結果如圖5.4.10的右圖所示。雖然左圖與右圖擁有同樣的建立時間與保持時間,不過它們的差別就在於左圖的時鐘跳來跳去,換之右圖的時鐘固步不動。

clip_image088

圖5.4.11 clock skew 影響建立關係與保持關係的時序圖。

圖5.4.11的左圖是未曾受 clock skew 影響的建立關係與保持關係的時序圖,其中fpga_clk,ext_clk與D[0..2]的延遲與上述一樣。差別就在左圖中,啓動沿受4ns延遲的 delay_max影響,再加上 fpga_clk的1ns延遲,結果落在5ns的位置;然而下一個啓動沿,受2ns延遲的delay min影響,結果落在13ns的位置。ext_clk有2ns的延遲,因此鎖存沿的位置也在於12ns。最後建立關係取得7ns,保持關係取得 -1ns。

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = <ext_clk delay> - < fpga_clk delay>

= (2 - 1)ns

= 1ns

clock skew 與上述一樣是1ns ... 右圖中的fpga_clk 與ext_clk固步不動在0ns位置,原本受delay max影響的啓動沿應該落在4ns的位置,可是它不小心撞到1ns的時間差,最後跌倒在3ns的地方;換之,原本受delay min 影響的的下一個啓動沿,同樣也不小心撞到1ns的時間差,從12ns的位置跌到11ns的位置。最終取得 7ns的建立關係,還有 -1ns的保持關係。左圖與右圖之間的差別就在於左圖的 fpga_clk 與 ext_clk都跳來跳去,換之右圖的fpga_clk 與 ext_clk都乖乖呆在原地。

clip_image090

圖5.4.12 ic2fpga(ext2fpga)多位寬的外部模型。

在前面我們解了有關 fpga2ic與多位寬,這回合讓我們來了解一下有關ic2fpga與多位寬的種種。圖5.4.12 是多位寬ic2fpga的外部模型,事實上它與多位寬fpga2ic的外部模型只是換個角色,換個位置而已,大體上都是換湯不換藥。不過筆者還是慣例的講一講 ...

clip_image092

圖5.4.13 (ic2fpga)clock skew 影響建立關係與保持關係的時序圖。

圖5.4.13與圖5.4.12基本上只是更換一下D[0..2]的名字還有ext_clk與fpga_clk的位置而已,其他都一模一樣。在左圖中,ext_clk受1ns的延遲,fpga_clk受2ns的延遲,然而D[0..2]接續有2ns~4ns的延遲。啓動沿不僅受ext_clk延遲1ns的影響,它更受delay max的阻攔從而落在5ns的位置。至於下一個啓動沿同樣也受到ext_clk延遲1ns的影響,它接着又被 delay min妨礙,結果落在13ns的位置。最終取得7ns的建立關係,還有 -1

ns的保持關係。

clock skew = < destination reg clock delay > - < source reg clock delay >

clock skew = <fpga_clk delay> - <ext_clk delay>

= (2 - 1)ns

= 1ns

clock skew 經過計算以後取值爲1ns。至於5.4.13的右圖是啓動沿與下一個啓動沿受時鐘差左右的時序圖 ... 原本受4ns delay max延遲的啓動沿,由於不小心被1ns的時鐘差絆倒,從4ns的位置跌至3ns的位置。換之下一個啓動沿原本受2ns的delay max延遲,同樣也不小心撞到1ns的時鐘差,結果從原本12ns的位置跌至11ns的位置。最後取得

7ns的建立關係,還有 -1 的保持關係。

到目前位置,我們已經瞭解完相關的基礎知識,接下來我們不僅會推導公式,還會學習有關的約束命令,亦即 set_input_delay 與 set_output_delay。同學們,筆者還是建議先歇一會吧,好讓自己的腦袋冷靜一下,就算戰意高昂也不要勉強自己,任何時候都不要高估自己的能力。

5.5 推導外包資料的公式

想必任何人都不喜歡推導公式吧?說實話,筆者也是 ... 不過接下來我們要推導的不是數學公式,而是與外部模型有關的公式。這樣做不是爲了什麼,而是爲了讓同學們進一步認識外部模型。

clip_image094

圖5.5.1 fpga2ic的外部模型(左),有各種延遲的時序圖。

圖5.5.1的左圖是fpga2ic的外部模型,然而右圖是相關的時序圖 ... 從右圖中,我們可以取得以下信息:

fpga_clk delay 1ns

ext_clk delay 2ns

fpga2ext D[0] 2ns (delay min)

fpga2ext D[1] 3ns

fpga2ext D[2] 4ns (delay max)

信息取得以後,我們就要開始推導公式了 ... fpga2ic的外部模型從另一個角度來看是 fpga 輸出數據,ic讀取數據。然而公式的推導都以fpga爲主要,因此fpga2ic 的公式又稱 output 公式,但是output公式又應該針對什麼呢?很簡單,output 公式主要是針對5.5.1右圖中的啓動沿,與下一個啓動沿。

針對啓動沿的output公式又名 output max,換之針對下一個啓動沿的output公式又名 output min。

output max = <fpga2ext delay max>

output min = < fpga2ext delay min >

output max 與 min的公式目前還是很單純,因爲我們還沒有將 clock skew 考慮進去。

clip_image088[1]

圖5.5.2 clock skew 與啓動沿和下一個啓動沿的關係。

圖5.5.2的左圖是還沒有將 clock skew 考慮進去的時序圖,其中fpga_clk的延遲有1ns,ext_clk的延遲有2ns,經過計算以後clock skew 值是1ns。然而右圖是左圖與 clock skew 相互作用以後的結果,無論是啓動沿還是下一個啓動沿,它們都不小心撞到1ns的時鐘差,然後向後移動1ns。

clock skew 無差別對待啓動沿與下一個啓動沿,換句話說clock skew 無論是output max 或者 output min它都看不順眼,因此:

output max = <fpga2ext delay max> - < destination reg clk delay - source reg clk delay >

= <fpga2ext delay max> - < ext_clk delay - fpga_clk delay >

= <fpga2ext delay max> - < clock skew >

output min = < fpga2ext delay min > - < destination reg clk delay - source reg clk delay >

= <fpga2ext delay min> - < ext_clk delay - fpga_clk delay >

= <fpga2ext delay min> - < clock skew >

clip_image096

clip_image098

 

圖5.5.3 Tsu影響建立關係(左),Th影響保持關係(右)。

就算是外部ic,凡是有IO口就有寄存器,凡是有寄存器一定有寄存器特性,因此外部ic的寄存器一定有參數 Tsu 和 Th。Tsu粗略點講,它是影響建立關係的寄存器參數;換之,Th粗略點將,它是影響保持關係的寄存器參數(如圖5.5.3所示)。要將Tsu與Th加入 output min 與 output max公式,建立關係和保持關係是關鍵。

clip_image100

圖5.5.4 Tsu影響建立關係,Tsu影響啓動沿(output max)的等價關係。

5.5.4的左圖是啓動沿受 delay max 影響後落在3ns的位置,由於外部ic的寄存器也存有0.5ns的Tsu參數,結果導致鎖存沿向左移動0.5ns,然後落在9.5ns的位置,最終得到得到6.5ns的建立關係。換之右圖中的鎖存沿固步不動,不過0.5ns的Tsu卻影響原先停留在3ns位置的啓動沿,啓動沿就這樣迷迷糊糊的向右移動0.5ns,然後落在3.5ns的位置。最終得到6.5ns的建立關係。

clip_image102

圖5.5.5 Th影響保持關係,Th影響下一個啓動沿(output min)的等價關係。

圖5.5.5的左圖,下一個啓動沿原本受1ns的delay min 影響,接着移動到11ns的位置。此外,鎖存沿不小心受到0.5ns的Th影響,結果鎖存沿移向10.5ns的位置,最終得到 -0.5ns的保持關係。至於右圖中的鎖存沿卻絲毫不動,可是原本已經受 delay min影響的下一個啓動沿,這下也受Th那0.5ns的影響,然後落在10.5ns的地方,最終得到 -0.5ns的保持關係。

從上述的過程中,我們知道Tsu影響啓動沿也間接影響 output max;Th反而影響下一個啓動沿也間接影響 output min ... 因此,output max 和 output min 的公式可以這樣更動:

output max = <fpga2ext delay max> - < destination reg clk delay - source reg clk delay > + ext_Tsu

= <fpga2ext delay max> - < ext_clk delay - fpga_clk delay > + ext_Tsu

= <fpga2ext delay max> - < clock skew > + ext_Tsu

output min = < fpga2ext delay min > - < destination reg clk delay - source reg clk delay > - ext_Th

= <fpga2ext delay min> - < ext_clk delay - fpga_clk delay > - ext_Th

= <fpga2ext delay min> - < clock skew > - ext_Th

ext_Tsu 別名 ic_Tsu 亦即外部ic寄存器的 Tsu

ext_Th 別名 ic_Th 亦即外部ic寄存器的 Th

clip_image104

圖5.5.6 延遲壓力均衡(左),當單位寬(右)。

圖5.5.6是延遲壓力均勻(作)與單位寬(右)的時序圖 ... 對於均與的延遲壓力來說,沒有所謂的 delay max 與 delay min之分,反過來說 delay max 是 delay min,或者 delay min 是 delay max。至於單位寬來也沒有所謂的 delay max 與 delay min,又或者說delay max 與 delay min 相等。

這種情況我們稱爲 delay both,換句話說 delay both 皆是 delay max 與 delay min,因此 output max 與 output min 可以這樣更動(both英文是皆是的意思):

output max = <fpga2ext delay max> - < destination reg clk delay - source reg clk delay > + ext_Tsu

= <fpga2ext delay max> - < ext_clk delay - fpga_clk delay > + ext_Tsu

= <fpga2ext delay max> - < clock skew > + ext_Tsu

//等價//

output max = <fpga2ext delay min> - < destination reg clk delay - source reg clk delay > + ext_Tsu

= <fpga2ext delay min> - < ext_clk delay - fpga_clk delay > + ext_Tsu

= <fpga2ext delay min> - < clock skew > + ext_Tsu

//等價//

output max = <fpga2ext delay both> - < destination reg clk delay - source reg clk delay > + ext_Tsu

= <fpga2ext delay both> - < ext_clk delay - fpga_clk delay > + ext_Tsu

= <fpga2ext delay both> - < clock skew > + ext_Tsu

output min = < fpga2ext delay max > - < destination reg clk delay - source reg clk delay > - ext_Th

= <fpga2ext delay max> - < ext_clk delay - fpga_clk delay > - ext_Th

= <fpga2ext delay max> - < clock skew > - ext_Th

//等價//

output min = < fpga2ext delay min > - < destination reg clk delay - source reg clk delay > - ext_Th

= <fpga2ext delay min> - < ext_clk delay - fpga_clk delay > - ext_Th

= <fpga2ext delay min> - < clock skew > - ext_Th

//等價//

output min = < fpga2ext delay both > - < destination reg clk delay - source reg clk delay > - ext_Th

= <fpga2ext delay both> - < ext_clk delay - fpga_clk delay > - ext_Th

= <fpga2ext delay both> - < clock skew > - ext_Th

延遲壓力均勻與單位寬是比較特殊的狀況,不過道理上和不均勻的多位寬一樣。

讀到這裏筆者猜想,一定有同學會覺得非常奇妙,fpga2ic是指fpga發送數據給ic“爲什麼在加入外部ic寄存器的 Tsu 與 Th 參數時,卻沒有考慮過 fpga 本身的Tco寄存器參數?”原因很單純,不是我們不考慮事實上TimeQuest已經瞭解了,因爲 output 公式是以 fpga爲主要,換句話說Tco是fpga的內部延遲因數,所以我們不用刻意告訴它。

clip_image090[1]

圖5.5.7 ic2fpga(ext2fpga)的外部模型。

ic2fpga是ic發送數據,fpga讀取數據的外部模型,不過不管位置怎麼改變,大體上都是大同小異而已。ic2fpga依然也是fpga爲主要,亦即fpga讀取數據,因此也稱爲 input 公式。同樣,針對啓動沿的input 公式稱爲 input max;換之,針對下一個啓動沿的 input 公式稱爲 input min。

input max = <ext2fpga delay max> - < destination reg clk delay - source reg clk delay >

= <ext2fpga delay max> - < fpga_clk delay - ext_clk delay >

= <ext2fpga delay max> - < clock skew >

input min = < ext2fpga delay min > - < destination reg clk delay - source reg clk delay >

= <ext2fpga delay min> - < fpga_clk delay - ext_clk delay >

= <ext2fpga delay min> - < clock skew >

clip_image096[1]

clip_image098[1]

 

圖5.5.8 Tco影響建立關係(左),Tco影響保持關係(右)。

ic2fpga的外部模型,外部ic是發送方,因此我們必須考慮外部ic的Tco寄存器參數。如圖5.5.8所示,無論是建立關係還是保持關係都會路出Tco的笑臉。

clip_image106

圖5.5.9 Tco影響建立關係與保持關係。

Tco是比較霸道的寄存器參數,它喫定建立關係與保持關係。從圖5.5.9中我們可以理解到,0.5ns的Tco助長了1ns的delay min 成爲1.5ns,同樣 Tco也助長了 3ns的delay max成爲3.5ns。以此類推,啓動沿受 delay max 影響,而且delay max 的新值是 3ns + 0.5ns,亦即3.5ns。換之下一個啓動沿受 delay min影響,而且delay min 的新值是 1ns + 0.5ns,亦即1.5ns。最終導致建立關係爲6.5ns,保持關係爲 -1.5ns。

因此input max 與 input min 公式可以這樣更動:

input max = <ext2fpga delay max> - < destination reg clk delay - source reg clk delay > + ext_Tco

= <ext2fpga delay max> - < fpga_clk delay - ext_clk delay > + ext_Tco

= <ext2fpga delay max> - < clock skew > + ext_Tco

input min = < ext2fpga delay min > - < destination reg clk delay - source reg clk delay > + ext_Tco

= <ext2fpga delay min> - < fpga_clk delay - ext_clk delay > + ext_Tco

= <ext2fpga delay min> - < clock skew > + ext_Tco

//等價//

input min = < ext2fpga delay min > - < destination reg clk delay - source reg clk delay > + ext_minTco

= <ext2fpga delay min> - < fpga_clk delay - ext_clk delay > + ext_minTco

= <ext2fpga delay min> - < clock skew > + ext_minTco

ext_Tco 別名 ic_Tco 亦即外部ic的Tco寄存器參數。

ext_minTco 別名 ic_minTco 亦即外部ic的最小Tco寄存器參數。

同學們可能會舉得疑惑,爲什麼 input min 會有另一個等價的公式,還有 minTco又是什麼?minTco是Tco的最小值,但是差別的比率,根據硬件的不同,結果也會不同。

按照理論,input min 載入 ext_Tco 還是 ext_minTco都沒有問題。實際上,載入 ext_Tco 比起載入 ext_minTco 有更好的保險作用。既然如此,爲什麼 ext_minTco 還受到重用呢?關於這點筆者就不怎麼清楚了,可能是近似作用或者其他的吧 ... 無論怎樣選擇都是見仁見智了。

5.6 外部模型的input/ouput 約束指令

這一章我們將通過假想的實驗來認識外部模型的input/output 約束命令。

clip_image108

圖5.6.1 假想實驗的外部模型。

圖5.6.1是假想實驗的外部模型,fpga與ic2是 fpga2ic的關係,亦即fpga經過D[0:3]發送數據給ic2。然而D[0..3]之間,delay min 是2ns,然而delay max 4ns,至於ic2的寄存器特性是0.5ns的Tsu和0.5ns的Th。換之 ic1與fpga是fpga2ic的關係,亦即ic1經過D[0:3]發送數據給fpga,其中 delay min 是2ns,delay max 是4ns,此外ic1有0.5ns的Tco。

ext1_clk 是受1ns延遲的100Mhz時鐘;fpga_clk是受2ns延遲的100Mhz時鐘;ext2_clk是受3ns延遲的100Mhz時鐘。然後讓我們計算一下 input/output min/max的各種取值:

delay min 2ns

delay max 4ns

ext1_clk delay 1ns

fpga_clk delay 2ns

ext2_clk delay 3ns

Tco/Tsu /Th 0.5ns

input max = <ext2fpga delay max> - < destination reg clk delay - source reg clk delay > + ext_Tco

= <ext2fpga delay max> - < fpga_clk delay - ext1_clk delay > + ext_Tco

= <ext2fpga delay max> - < clock skew > + ext_Tco

= 4ns - (2ns - 1ns) + 0.5ns

=3.5ns

input min = < ext2fpga delay min > - < destination reg clk delay - source reg clk delay > + ext_Tco

= <ext2fpga delay min> - < fpga_clk delay - ext1_clk delay > + ext_Tco

= <ext2fpga delay min> - < clock skew > + ext_Tco

= 2ns - (2ns - 1ns) + 0.5ns

= 1.5ns

output max = <fpga2ext delay max> - < destination reg clk delay - source reg clk delay > + ext_Tsu

= <fpga2ext delay max> - < ext2_clk delay - fpga_clk delay > + ext_Tsu

= <fpga2ext delay max> - < clock skew > + ext_Tsu

= 4ns - (3ns - 2ns) + 0.5ns

= 3.5ns

output min = < fpga2ext delay min > - < destination reg clk delay - source reg clk delay > - ext_Th

= <fpga2ext delay min> - < ext_clk1 delay - fpga_clk delay > - ext_Th

= <fpga2ext delay min> - < clock skew > - ext_Th

= 2ns - (3ns - 2ns) - 0.5ns

= 0.5ns

實驗六 假想實驗 input/output delay約束

center_module.v

1.    module center_module
2.    (
3.        input CLK,
4.        input RSTn,
5.        input [3:0]Din,
6.        output [3:0]Dout
7.    );
8.        /********************************************/
9.    
10.        reg [3:0]rData;
11.        
12.        always @ ( posedge CLK or negedge RSTn )
13.            if( !RSTn )
14.                begin
15.                    rData <= 4'd0;
16.                end
17.            else 
18.                begin
19.                    rData <= Din;
20.                end
21.        
22.        /********************************************/
23.                
24.        assign Dout = rData;

上述是 center_module.v 的內容,乍看下 fpga 也只是充當 ic1與ic2之間的間接寄存器而已。亦即從ic1讀入數據致 rData,然後又將rData的數據發送給ic2。

clip_image110

圖5.6.2 創建 best case 網表。

再來先創建同名的 center_module.sdc 文件,然後將它設置爲本實驗的約束文本,再來打開TimeQuest。然後手動建立 best case 網表,如圖5.6.2所示。

clip_image112

clip_image114

clip_image116

clip_image118

 

圖5.6.3 創建3個時鐘。

再來建立3個時鐘(如圖5.6.3所示),它們分別爲是 10ns週期的 fpga_clk,ext1_clk還有 ext2_clk。除了fpga_clk是擁有對應的target以外(CLK的io),ext11_clk 與 ext2_clk 都是沒有對應目標的 virtual clock(虛擬時鐘)。

clip_image120

clip_image122

 

圖5.6.4 set_input_delay 界面。

接下來,從Constraints 菜單中調出 set_input_delay界面(圖5.6.4)。任何初次看到這張界面的同學,估計都會被奇奇怪怪的選項嚇一跳,不過不要緊,讓我們逐個來了解。

clock name 指向ic2fpga 外部模型中的ic時鐘源,這裏是 ext1_clk;至於 delay 選線中的 max 是指 input max,換之 min 是指 input min,而both 是指 min/max,接着在

delay value 中輸入相關的數值,min 是 1.5ns,max是3.5ns;然而target是屬於input 有關的輸入口,在此是Din[0:3]。

clip_image124

圖5.6.5 (左)默認,(右)use falling clock edge。

默認選項下 TimeQuest 都會認爲被 clock name 指定的時鐘都是上升沿觸發(輸出數據)。換之,使能 use falling clock edge,TimeQuest就會知道被 clock name 指定的時鐘由下降沿觸發。至於這個選項的用處暫時沒有實例講解,同學們先弄個大概就可以了。

至於 add_delay 選項是比較模糊的東西,一般上一個IO口都由1個寄存器驅動。不過一些特殊的IO口可能由多可寄存器驅動,例如 DDIO,亦即雙沿IO口 ... 它裏邊是由2個寄存器同時驅動一個IO口,使能 add_delay 就是告訴TimeQuest某個IO由1個以上的寄存器驅動。至於rise/fall 或者 both 筆者就不清楚了,不過默認 both 就是了。

clip_image126

clip_image128

 

圖5.6.6 set output delay 界面。

同樣在 Constraints 菜單下調出 set output delay 的界面,如圖5.6.6 所示。基本上 set input delay 與 set output delay 的意義差不多都一樣,只是節點換了位置而已。其中clock name指定驅動外部ic的時鐘,在這裏是 ext2_clk。delay max 輸入 3.5ns,delay min 則輸入 0.5ns;target 則是 Dout[0:3]。完後,sdc文件會自動添加以下的約束命令,

center_module.sdc

#**************************************************************

# Create Clock

#**************************************************************

create_clock -name {fpga_clk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {CLK}]

create_clock -name {ext1_clk} -period 10.000 -waveform { 0.000 5.000 }

create_clock -name {ext2_clk} -period 10.000 -waveform { 0.000 5.000 }

#**************************************************************

# Set Input Delay

#**************************************************************

set_input_delay -add_delay -max -clock [get_clocks {ext1_clk}] 3.500 [get_ports {Din[0]}]

set_input_delay -add_delay -min -clock [get_clocks {ext1_clk}] 1.500 [get_ports {Din[0]}]

set_input_delay -add_delay -max -clock [get_clocks {ext1_clk}] 3.500 [get_ports {Din[1]}]

set_input_delay -add_delay -min -clock [get_clocks {ext1_clk}] 1.500 [get_ports {Din[1]}]

set_input_delay -add_delay -max -clock [get_clocks {ext1_clk}] 3.500 [get_ports {Din[2]}]

set_input_delay -add_delay -min -clock [get_clocks {ext1_clk}] 1.500 [get_ports {Din[2]}]

set_input_delay -add_delay -max -clock [get_clocks {ext1_clk}] 3.500 [get_ports {Din[3]}]

set_input_delay -add_delay -min -clock [get_clocks {ext1_clk}] 1.500 [get_ports {Din[3]}]

#**************************************************************

# Set Output Delay

#**************************************************************

set_output_delay -add_delay -max -clock [get_clocks {ext2_clk}] 3.500 [get_ports {Dout[0]}]

set_output_delay -add_delay -min -clock [get_clocks {ext2_clk}] 0.500 [get_ports {Dout[0]}]

set_output_delay -add_delay -max -clock [get_clocks {ext2_clk}] 3.500 [get_ports {Dout[1]}]

set_output_delay -add_delay -min -clock [get_clocks {ext2_clk}] 0.500 [get_ports {Dout[1]}]

set_output_delay -add_delay -max -clock [get_clocks {ext2_clk}] 3.500 [get_ports {Dout[2]}]

set_output_delay -add_delay -min -clock [get_clocks {ext2_clk}] 0.500 [get_ports {Dout[2]}]

set_output_delay -add_delay -max -clock [get_clocks {ext2_clk}] 3.500 [get_ports {Dout[3]}]

set_output_delay -add_delay -min -clock [get_clocks {ext2_clk}] 0.500 [get_ports {Dout[3]}]

clip_image130clip_image132

圖5.6.7 setup與hold時序分析。

然後我們就可以開始分析時序了 ... 雙擊 Report Timing,選擇 setup與hold分析,其他放空,然後點擊 report timing 執行,如圖5.6.7所示。

clip_image134

圖5.6.8 setup分析結果。

clip_image136

圖5.6.9 hold 分析結果。

經過分析以後,我們發現只有8對節點的setup 分析與hold 分析而已 ... 有4對節點是 rData[0:3]~Dout[0:3],另外4對節點是 Din[0:3]~rData[0:3]。在此,rData是fpga內的寄存器,Din是ic1的寄存器,Dout是ic2的寄存器。從圖5.6.8~9中看見的 Clock Skew 或者 Data Delay 基本上是內部模型的延遲結果,與外部模型一丁兒關係也沒有 ... 這話何說呢?

clip_image138

圖5.6.10 rData[0]~Dout[0] setup分析的時序圖。

clip_image140

圖5.6.11 rDin[0]~rData0] setup分析的時序圖。

筆者展開節點 rData[0]~Dout[0](圖5.6.10)還有節點rData[0]~Dout[0](圖5.6.11)的setup分析過程,其中 3.5ns 還有3.5ns就是 set output delay max 與set input delay max 的結果。

clip_image142

圖5.6.12 rData[0]~Dout[0] hold分析的時序圖。

clip_image144

圖5.6.13 rDin[0]~rData0] hold分析的時序圖。

接着又展開同樣的節點,然後觀察該 hold 分析圖,如圖5.6.12 與圖5.6.13所示 ... 其中 0.5ns 與 1.5ns 既是 set output delay min 與 set input delay min 的結果。

在這裏,我們得到這樣一個結論:

set output delay 與 set input delay 好似一個“外包資料”,首先我們收集各種外部的延遲信息接着包裹在一個“外包資料”裏,然後丟給 TimeQuest 。TimeQuest當然曉得某某delay max 是針對建立關係,又某某delay min 是針對保持關係。TimeQuest 在分析內部的 setup 與 hold 時序時順便參考一下“外包資料”的信息 ... 就這樣TimeQuest就可以獨立分開外部延遲信息與內部延遲信息。

總結:

第五章終於寫完了,這一章的實驗數量不但少,而且約束命令的出現也不多,不過內容都是深入理解TimeQuest的要點。這個章節我們先了解網表,事實上網表也有極端與好之分,越是極端保險餘量越大,可是性能限制卻越大,結果越偏離實際的信息;換之,越是好保險餘量越小,性能限制也越小,結果越接近實際的信息。默認下TimeQuest是一位極端的生存者,不過也可以手動要它成爲樂天的屁民。

此外,筆者也稍微談論一下 TimeQuest的迷信,亦即Fmax。筆者初學 TimeQuest的時候,同樣也認爲 Fmax 是時序分析的重要標準,後來才知道 Fmax 是指某個“最差勁節點”的最高頻率。Fmax這東西不是越高越好,就像駕駛跑車那樣,就算哪天死了也不會衝到最高速 ... 所以說,夠用就好。提升Fmax 有許多方法,除了選擇較好的網表以外,還可以設置編譯器的選項,當然最根本還是Verilog本身。Fmax也可以是網表質量關係性能限制的評估值。

但是這章讓筆者最着重的內容 ... 亦即TimeQuest用非常巧妙的手段將外部信息包裹爲“外部資料”,這外部資料有標誌性的 max 與 min,而 max是針對建立關係,min則是針對保持關係。外部資料是由以下公式(手段)將外部延遲信息包裹而成:

input max = <ext2fpga delay max> - < destination reg clk delay - source reg clk delay > + ext_Tco

= <ext2fpga delay max> - < clock skew > + ext_Tco

input min = < fpga2ext delay min > - < destination reg clk delay - source reg clk delay > + ext_Tco

= <fpga2ext delay min> - < clock skew > + ext_Tco(或者 ext_minTco)

output max = <fpga2ext delay max> - < destination reg clk delay - source reg clk delay > + ext_Tsu

= <fpga2ext delay max> - < clock skew > + ext_Tsu

output min = < fpga2ext delay min > - < destination reg clk delay - source reg clk delay > - ext_Th

= <fpga2ext delay min> - < clock skew > - ext_Th

對筆者而言,最辛苦的差事就是推導以上的公式 ... 很久以前,筆者在接觸TimeQuest不久,它們就出現在手冊上。不過一般而言,絕對不會有人犯賤到折騰自己去推導它們。但直覺告訴筆者,推導公式可以讓自己更瞭解 TimeQuest ... 就這樣,筆者一度跌進學習的死衚衕,然後灰心離開,學習進度從此就定格在哪裏。

當《整合篇》完成,時間大約是一年後 ... 筆者再次打開當時的草稿,然後繼續思考,不出幾天的時間,許多東西就那樣自然而然的理解起來 ... 推導整套公式的關鍵自然是那個不起眼的建立關係與保持關係。心想真妙,建立時間與保持時間既然與建立關係與保持關係有如此微妙的關係,這就是第五章的重點內容。

分類: TimeQuest

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