八、時(shí)序約束專題課
【問題8.1】 VIVADO的時(shí)鐘約束向?qū)Вo法找到時(shí)鐘,如下圖所示,位置1中應(yīng)該要識(shí)別出時(shí)鐘。

答:請(qǐng)注意,位置1的地方是列出的是“沒有被約束的時(shí)鐘”,如果該時(shí)鐘已經(jīng)被約束了,就不會(huì)在這里列出來了。
注意上圖中3的位置,該列說明了有2條時(shí)鐘約束。可以點(diǎn)擊這里看看,是不是已經(jīng)對(duì)時(shí)鐘進(jìn) 行約束了。
為什么會(huì)有時(shí)鐘被約束了呢?因?yàn)樵摴こ桃呀?jīng)有約束文件。
【問題8.2】VIVADO/QUARTUS練習(xí)中,rst_n是否需要約束?
答:一個(gè)完整的約束,其基本要求是:所有的路徑都覆蓋,包括所有的輸入管腳和輸出管腳。所以,rst_n需要約束。
注意的是,該信號(hào)是輸入信號(hào),但沒有隨路時(shí)鐘進(jìn)來。所以該信號(hào)可以認(rèn)為是無時(shí)鐘的情形,按照課程理論,應(yīng)該定義一個(gè)虛擬時(shí)鐘。
定義了虛擬時(shí)鐘后,再重新使用約束向?qū)Вs束rst_n。
【問題8.3】在VIVADO中,如何設(shè)置虛擬時(shí)鐘?
答:虛擬時(shí)鐘不能在時(shí)序約束向?qū)е刑砑樱枰谙旅娲翱谔砑?/p>
在Edit Timing Constraints中點(diǎn)擊,然后在creat clock窗口中,雙擊“Double click to create a Create Clock Constrtaint”。
在彈出的窗口中

Clock name為該時(shí)鐘命一個(gè)名字,Source objects是不需要填的,因?yàn)槭翘摂M時(shí)鐘,就是沒對(duì)象了。
【問題8.4】時(shí)序約束出現(xiàn)時(shí)序違例(Slack為負(fù)數(shù)),如何處理?
答:首先指出一個(gè)誤區(qū):當(dāng)約束出現(xiàn)錯(cuò)誤時(shí),想當(dāng)然地認(rèn)為是“時(shí)序約束做得不對(duì)”,所以應(yīng)該怎么去改“時(shí)序約束”,從而讓這些錯(cuò)誤消失,這是一 個(gè)錯(cuò)誤的觀念。
時(shí)序約束的作用:在于檢查“設(shè)計(jì)是否滿足時(shí)序要求”,它是用來審視自己設(shè)計(jì)的,很多情況是,要改設(shè)計(jì)代碼來滿足時(shí)序要求。
當(dāng)時(shí)序約束提示有錯(cuò)誤時(shí),應(yīng)該閱讀“時(shí)序報(bào)告”,從報(bào)告中分析時(shí)序路徑(數(shù)據(jù)到達(dá)時(shí)間、時(shí)鐘到達(dá)時(shí)間和數(shù)據(jù)要求時(shí)間等),根據(jù)報(bào)告分析錯(cuò)誤 的原因,并根據(jù)原因來實(shí)行不同的方法。以建立時(shí)間違例,說明具體方法如下
1. 時(shí)序報(bào)告中,找到提示錯(cuò)誤的路徑,即目的寄存器,以及源寄存器。注意,這是兩個(gè)寄存器的點(diǎn)。
2. 首先判斷,源寄存器的時(shí)鐘,與目的寄存器的時(shí)鐘,是否相同。如果不同,可以認(rèn)為是異步時(shí)序,見步驟3;如果是相同,則看步驟4。
3. 如果是異步電路,那么處理方法如下:
A. 確認(rèn)做了異步處理。對(duì)于數(shù)據(jù),則是通過異步FIFO來做異步處理;如果是控制信號(hào),則要經(jīng)過打兩拍來處理。
B. 確認(rèn)做了異步處理后,仍然會(huì)報(bào)“時(shí)序違例”的。這個(gè)時(shí)候,可以該路徑設(shè)置成set false path,不用再檢查。
4. 同步電路下,具體處理如下.
A. 查看兩個(gè)寄存器點(diǎn)之間,經(jīng)過了多少加法器、乘法器、除法器等。
B. 對(duì)于除法器,要特別留意,一般是1個(gè)時(shí)鐘計(jì)算不完的。那么可以 a.想辦法不用除法;b. 通過使能信號(hào)控制獲取除法器結(jié)果的時(shí)間。
C. 對(duì)于乘法器和加法器,或者其他組合電路較多的。想辦法分隔成流水線來實(shí)現(xiàn)。可以參考MDY 流水線的內(nèi)容。
5. 如果是IP核的違例,檢查是否時(shí)鐘不滿足IP核的要求。如果沒問題,就不用管。
6. 如果是ILA等在線調(diào)試工具路線的違例,則一般不用處理.
7. 如果是線延時(shí)太長的,可以嘗試打一拍處理。即A->B的線太長,可以打一拍,變成A->C->B,這樣線延時(shí)就小了。
【問題8.5】VIVADO中,如何查詢未約束的時(shí)鐘、未約束的輸入延時(shí)和輸出延時(shí)等?
答:如下圖,在VIVADO的時(shí)序約束界面中,在下面欄目可顯示未約束的地方。

【問題8.6】如下圖所示,跨時(shí)鐘域打兩拍的方法,其實(shí)只是一個(gè)信號(hào)的傳遞,當(dāng)?shù)谝粋€(gè)信號(hào)出現(xiàn)不穩(wěn)之后或者錯(cuò)誤之后,
后面就會(huì)把這個(gè)錯(cuò)誤的信號(hào)繼續(xù)傳遞下去,并沒有起到糾錯(cuò)的作用

答:上圖中打兩拍的方法,其本質(zhì)不是為了“糾錯(cuò)”,它的作用是為了防止“亞穩(wěn)態(tài)”。 防止亞穩(wěn)態(tài)的本質(zhì):防止中間狀態(tài)過長。之所以采用兩級(jí)觸發(fā)器的方法,是因?yàn)镈觸發(fā)器出現(xiàn)亞穩(wěn)態(tài)的可能性非常小,而兩級(jí)D觸發(fā)器出現(xiàn)亞穩(wěn)態(tài)的概率就更小了。
【問題8.7】既然打兩拍的方法不能糾錯(cuò),那“打兩拍”還有什么意義?
答:錯(cuò)誤有很多種,有些錯(cuò)誤是1次性錯(cuò)誤,而有些是系統(tǒng)性錯(cuò)誤。
傳輸過程中,如果發(fā)了0,如果全部接收模塊都認(rèn)為是1,這并不是問題,這是可以預(yù)防和可控的(例如檢測多幾次就行了)。 但是亞穩(wěn)態(tài)的時(shí)候,如果發(fā)了0,但部分接收認(rèn)為認(rèn)為是1,而另一部分模塊認(rèn)為是0,至于哪些模塊認(rèn)為是1哪些是0, 這是隨機(jī)的,不可預(yù)知的, 這就是災(zāi)難。更詳細(xì)的內(nèi)容,建議參考:FPGA知識(shí)大串講 http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=581
【問題8.8】模塊A的時(shí)鐘clka為100MHz,模塊B的時(shí)鐘clkb為300MHz。現(xiàn)在模塊A要把32bit的數(shù)據(jù)送給模塊B。模塊A要如何發(fā)送,模塊B要如何接收呢?
答:方法1:采用異步FIFO的方法。
方法2:采用指令信號(hào)的方法傳輸,模塊A產(chǎn)生vld信號(hào)給模塊B,模塊B對(duì)vld進(jìn)行同步化處理(打兩拍)后,檢測同步化信號(hào)的上升沿。
需要注意的,VLD的信號(hào)是讓模塊B周期的三倍或以上。由于clka是100M,產(chǎn)生的vld是10ns,而clkb是300M,周期是3.33ns。
所以模塊A只要產(chǎn) 生1個(gè)時(shí)鐘的vld給模塊B即可。
【問題8.9】模塊A的時(shí)鐘clka為300MHz,模塊B的時(shí)鐘clkb為100MHz。現(xiàn)在模塊A要把32bit的數(shù)據(jù)送給模塊B。
模塊A要如何發(fā)送,模塊B要如何接收呢?
答:方法1:采用異步FIFO的方法。
方法2:采用指令信號(hào)的方法傳輸,模塊A產(chǎn)生vld信號(hào)給模塊B,模塊B對(duì)vld進(jìn)行同步化處理(打兩拍)后,檢測同步化信號(hào)的上升沿。
需要注意的,VLD的信號(hào)是讓模塊B周期的三倍或以上。
由于clka是300M,產(chǎn)生的vld是3.33ns,而clkb是100M,周期是10ns。所以模塊A要產(chǎn)生10個(gè)時(shí)鐘的vld給模塊B。
【問題8.10】一塊電路板上,有兩個(gè)芯片,芯片A的時(shí)鐘clka為100MHz,芯片B的時(shí)鐘clkb為100MHz。
現(xiàn)在芯片A要把32bit的數(shù)據(jù)送給芯片B。模塊A要如何發(fā)送,模塊B要如何接收呢?
答:方法1:采用異步FIFO的方法。
方法2:采用指令信號(hào)的方法傳輸,模塊A產(chǎn)生vld信號(hào)給模塊B,模塊B對(duì)vld進(jìn)行同步化處理(打兩拍)后,檢測同步化信號(hào)的上升沿。
需要注意的,VLD的信號(hào)是讓模塊B周期的三倍或以上。
雖然clka和clkb都是100M,但他們不是同一個(gè)晶振產(chǎn)生的,因此都是異步時(shí)鐘。為了滿足以上要求,所以模塊A要產(chǎn)生3個(gè)時(shí)鐘的vld給模塊B。
【問題8.11】A, B時(shí)鐘都是50M,但是他們不相關(guān),為了防止編譯器把他們默認(rèn)為同一個(gè)時(shí)鐘,是不是要用一個(gè)異步時(shí)鐘組約束,
來告訴編譯器他們是不同的兩個(gè)時(shí)鐘?
答:一般分別產(chǎn)生A和B的時(shí)鐘約束即可。
【問題12】 建立時(shí)間可以是負(fù)值嗎?
答:建立時(shí)間當(dāng)然可以是負(fù)數(shù)了。負(fù)數(shù)表示,可以在時(shí)鐘上升沿后數(shù)據(jù)才變化。(建立時(shí)間是器件的屬性,至于怎么器件怎么做到的,
那就要問器件工程師了)
【問題13】 程序原本時(shí)序可以通過,加上singalTap節(jié)點(diǎn)之后時(shí)序不通過是什么原因
答:增加signaltap ILA等在線調(diào)試工具時(shí),需要使用到內(nèi)部的資源,例如RAM、選擇器、寄存器等,增加后再去綜合和布局布線。
由于改變了資源,因此肯定對(duì)時(shí)序是有影響的,有可能改善了也有可能惡化了。如果時(shí)序有問題,分析路徑,如果是在線調(diào)試工具路徑,
評(píng)估是否會(huì)有風(fēng)險(xiǎn),沒風(fēng)險(xiǎn)就算了
【問題8.14】時(shí)序約束什么時(shí)候要做?
答: 1.在需要的時(shí)鐘頻率下,如果邏輯功能不穩(wěn)定,那么就需要時(shí)序約束。
2.一般時(shí)鐘大于100M的時(shí)候,我們就要做一下時(shí)序約束。
【問題8.15】時(shí)序約束建立時(shí)間和保持時(shí)間的生活案例。
答:可以想象,有一個(gè)人從家里出發(fā)去機(jī)場,搭乘13點(diǎn)的飛機(jī)。
1. 13點(diǎn)起飛,起飛前15分鐘要到機(jī)場,這個(gè)15分鐘,就類似于建立時(shí)間要求。
2. 機(jī)場每小時(shí)有要飛一趟飛機(jī),每個(gè)小時(shí)表示的是時(shí)鐘周期。
3. 飛機(jī)起飛后,機(jī)場要保持10分鐘,之后才能來下一批乘客,這個(gè)10分鐘就是保持時(shí)間。
4. 這個(gè)人出發(fā)去搭13點(diǎn)的飛機(jī),因此他要在12點(diǎn)45分之前到機(jī)場,并且是12點(diǎn)10分之后到機(jī)場。既不能早到,也不能晚到機(jī)場。
5. 如果這個(gè)人12點(diǎn)45分之后才到機(jī)場,那就搭不上本趟飛機(jī),即違反了建立時(shí)間要求。(建立時(shí)間影響的是自己坐飛機(jī))
6. 如果這個(gè)人12點(diǎn)10分前就到了機(jī)場,那就會(huì)因此上一趟飛機(jī)的起飛,即違反了保持時(shí)間要求。(保持時(shí)間不滿足,影響的是上一批乘客坐飛機(jī))
7. 這個(gè)人是計(jì)劃去機(jī)場,因此他要估算幾點(diǎn)能到機(jī)場。首先他會(huì)算所有情況下的最大延遲,如剛到路口紅燈就來了、走路最慢等,在這種最慢的情況 下,如果能在12點(diǎn)45分前到,說明建立時(shí)間沒問題。然 后,他會(huì)算所有情況下的最小延遲,如剛到路口綠燈,走路最快,
在這種最快的情況下,如果能在12點(diǎn)10分后才,那說明保持時(shí)間沒問題。
【問題8.16】為什么建立時(shí)間分析的時(shí)鐘到達(dá)時(shí)間要加一個(gè)時(shí)鐘周期而保持時(shí)間分析則不用呢?
答: 因?yàn)榻r(shí)間是源寄存器發(fā)出數(shù)據(jù),目的寄存器采集,也就是上一個(gè)時(shí)鐘發(fā)出來,本時(shí)鐘采集。這里有一個(gè)時(shí)鐘周期的因素,
所以要加1個(gè)時(shí)鐘周期。而保持時(shí)間分析,則是“本個(gè)時(shí)鐘”發(fā)出數(shù)據(jù)后,如果延時(shí)太小,會(huì)影響“本個(gè)時(shí)鐘”對(duì)上一個(gè)數(shù)據(jù)的采集,
因?yàn)椴恍枰?個(gè)時(shí)鐘周期。另外,要注意一點(diǎn),保持時(shí)間是跟時(shí)鐘周期無關(guān)的。
【問題8.17】一個(gè)外部的信號(hào),經(jīng)過狀態(tài)機(jī)的“組合邏輯”,這也要做同步處理嗎?
答:需要做同步處理的。首先明白一點(diǎn),F(xiàn)PGA里的時(shí)序邏輯=組合邏輯 + D觸發(fā)器。組合邏輯的最終結(jié)果,還是要發(fā)D觸發(fā)器的。所以還要做同步化處理的。
【問題8.18】請(qǐng)教下,做時(shí)序約束,做到這步時(shí),這些都要勾選上嗎?

答:當(dāng)然不是,要逐個(gè)分析確認(rèn),沒有一選就全選上的道理。
【問題8.19】下面的生成時(shí)鐘約束,是否一定要勾選?

答:這應(yīng)該看生成時(shí)鐘那一節(jié)視頻,里面重點(diǎn)強(qiáng)調(diào)了“什么叫時(shí)鐘”? 上面的圖里,您應(yīng)該要搞清楚,它被識(shí)別出時(shí)鐘了,正不正常.
如果是正常,那您肯定是要添加約束,定義頻率吧。如果它不應(yīng)該識(shí)別出時(shí)鐘了,那您應(yīng)該檢查您的代碼,看是不是代碼不規(guī)范引起,或者有沒有潛在的問題。注意一下:約束不是目的,約束是為了查看報(bào)告,看設(shè)計(jì)有沒有問題的。
【問題8.20】系統(tǒng)同步只可能是單沿采集?沒法像DDR那樣雙沿采集?
答:系統(tǒng)同步也是可以是雙沿采集的,但比較少。課程里,只是介紹了部分情形。 如果想看所有情形有哪些,可以打開VIVADO的時(shí)序約束向?qū)В梢栽O(shè)置INPUT DELAY窗口查看。
【問題8.21】QUARTUS生成SDC時(shí),默認(rèn)出現(xiàn)的那條時(shí)鐘約束是正常的么?我自己刪掉就行了?
答:默認(rèn)生成的當(dāng)然是不正常。
【問題8.22】老師問一下,我畫的后邊那個(gè)部分,我認(rèn)為應(yīng)該沒有數(shù)據(jù)吧?

答:不是 這個(gè)不是有沒有數(shù)據(jù)的概念 而是數(shù)據(jù)是否穩(wěn)定的概念。
【問題8.23】請(qǐng)問下有沒有針對(duì)SDC時(shí)序約束語法的講解嗎?
答:時(shí)序約束里,只講解了用到的部分。如果想看更多部分,我估計(jì)你要看這個(gè)語法的權(quán)威資料了。
【問題8.24】老師您好,我在學(xué)習(xí)時(shí)序約束視頻,看到第一個(gè)視頻這塊“流水線設(shè)計(jì)思路:乘法器可以分成加法器,然后加法器還可以分成什么,一直聽不清”
答:最后可以分成與門這些最簡單的門電路。
【問題8.25】老師請(qǐng)問紅色的是不是不滿足時(shí)序要求?

答:不是的,setup和hold時(shí)間形成一個(gè)時(shí)間窗,只要在這個(gè)時(shí)間窗里信號(hào)穩(wěn)定就餓可以了 在使用時(shí)序分析工具的時(shí)候,
字體為紅色時(shí)間提示是不滿足時(shí)序要求
【問題8.26】為什么建立時(shí)間分析的時(shí)鐘到達(dá)時(shí)間要加一個(gè)時(shí)鐘周期而保持時(shí)間分析則不用呢?
答:因?yàn)榻r(shí)間是源寄存器發(fā)出數(shù)據(jù),目的寄存器采集,也就是上一個(gè)時(shí)鐘發(fā)出來,本時(shí)鐘采集。這里有一個(gè)時(shí)鐘周期的因素,所以要加1個(gè)時(shí)鐘周期。而保持時(shí)間分析,則是“本個(gè)時(shí)鐘”發(fā)出數(shù)據(jù)后,如果延時(shí)太小,會(huì)影響“本個(gè)時(shí)鐘”對(duì)上一個(gè)數(shù)據(jù)的采集,因?yàn)椴恍枰?個(gè)時(shí)鐘周期。另外,要注意一點(diǎn),保持時(shí)間是跟時(shí)鐘周期無關(guān)的。
【問題8.27】用ila抓取信號(hào)分析,發(fā)現(xiàn)異常,而時(shí)序約束報(bào)告正常,因此可以認(rèn)為時(shí)序報(bào)告正常,而時(shí)序會(huì)有問題?
答:
1.在線邏輯分析儀是用于判斷邏輯是否出現(xiàn)問題,可以認(rèn)為是檢查時(shí)鐘節(jié)拍下的邏輯判斷。而時(shí)序約束是解決D觸發(fā)器的建立時(shí)間和保持時(shí)間問題,是一個(gè)時(shí)鐘內(nèi)的時(shí)序問題。所以,不能用ila來推導(dǎo)時(shí)序約束,這是不同層次的問題。
2.官方可以保證,用戶代碼和時(shí)序約束的生成結(jié)果是正確,即在輸入的代碼和約束,給出來的報(bào)告一定是正確的。但時(shí)序約束對(duì)不對(duì),這是客戶保證的。
3.出現(xiàn)結(jié)果不對(duì),可能性很多,不一定是時(shí)序問題,要注意“充分必要條件”。
【問題8.28】同樣的工程不做任何改動(dòng),有時(shí)編譯后下板驗(yàn)證正確,有時(shí)編譯后下板驗(yàn)證不正確,是不是時(shí)序問題呢?
答:有可能是,但又不一定是。這是時(shí)序不滿足的一種現(xiàn)象。但反過來,沒有說,出現(xiàn)這種現(xiàn)象,就一定是時(shí)序問題。
【問題8.29】設(shè)置時(shí)鐘約束時(shí),假如有虛擬時(shí)鐘的情況,虛擬時(shí)鐘是必須要設(shè)置的嗎?
答:
1.原則上所有接口有應(yīng)有約束。
2.設(shè)置虛擬時(shí)鐘,可以方便將對(duì)應(yīng)信號(hào)歸到該虛擬時(shí)鐘好,這樣方便做分析,例如看有沒有跨時(shí)鐘域等。
3.是不是一定要做,取決于項(xiàng)目老大要求,不做不一定有問題。
【問題8.30】一個(gè)always模塊下,if 、else if,,,else ,寫的太多了 ,是不是會(huì)容易造成時(shí)序問題呢?這種說法對(duì)嗎
答:這里有一個(gè)定義要搞清楚的,什么叫“多”?
1. 是3個(gè)就多,還是10個(gè)?每個(gè)人標(biāo)準(zhǔn)不同。
2. 即使是同一個(gè)人,使用不同的器件,這個(gè)“多”也是不同的。有些高級(jí)的器件,10個(gè)IF也不多,有些低端器件,3個(gè)也多。
3. 即使同一個(gè)人,同一個(gè)器件,但if里的判斷條件也有講究。如果判斷條件里一個(gè)除法器,那1個(gè)if也多,如果只是判斷0和1,那么10個(gè)也算少。
4. 最具可操作性的做法,給定時(shí)鐘約束,看時(shí)序報(bào)告。報(bào)告沒問題,那就是沒問題;否則會(huì)有時(shí)序違例的錯(cuò)誤。
【問題8.31】output latency一般設(shè)置成多少呢?pipeline 有啥用?

答:由于除法器占用資源較大,難以在一個(gè)時(shí)鐘周期內(nèi)計(jì)算完畢,需要多個(gè)時(shí)鐘才計(jì)算完,這個(gè)pipeline就是設(shè)置多少個(gè)時(shí)鐘周期的。如果您不清楚要多少個(gè),設(shè)置填一個(gè)較大的數(shù),然后看時(shí)序報(bào)告是否正確。如果正確,就沒問題。
【問題8.32】請(qǐng)問:MDY的案例中,為什么串口需要對(duì)din進(jìn)行同步化,而SCCB就不需要對(duì)sio_din進(jìn)行同步化?sio_din也是外部器件進(jìn)來的嗎?
答: 是否要對(duì)信號(hào)進(jìn)行同步化,最核心的理解是“該信號(hào)是否能夠保證滿足建立時(shí)間和保持時(shí)間要求”,也就是“該信號(hào)的變化和時(shí)鐘存在確定性相位關(guān)系”。
以串口為例,串口的輸入信號(hào)與FPGA時(shí)鐘是沒有任何聯(lián)系的,該輸入信號(hào)可以在任意時(shí)刻變化,也就有可能剛好在時(shí)鐘上升沿變化, 從而不滿足建立時(shí)間要求, 因此要做同步化處理。而SCCB案例中,由FPGA時(shí)鐘里產(chǎn)生了sio_dout、SCK等信號(hào),而sio_din在sck作用下變化,所以sio_din與FPGA時(shí)鐘是有一定關(guān)系的。可以認(rèn)真看時(shí)序圖,在FPGA對(duì)sio_din有采樣時(shí)刻,時(shí)序已經(jīng)要求sio_din要穩(wěn)定不變的,所以可以不用做同化處理。
審核編輯:湯梓紅
?
評(píng)論