八、時(shí)序約束專題課




答:請注意,位置1的地方是列出的是“沒有被約束的時(shí)鐘”,如果該時(shí)鐘已經(jīng)被約束了,就不會在這里列出來了。
注意上圖中3的位置,該列說明了有2條時(shí)鐘約束。可以點(diǎn)擊這里看看,是不是已經(jīng)對時(shí)鐘進(jìn)行約束了。
為什么會有時(shí)鐘被約束了呢?因?yàn)樵摴こ桃呀?jīng)有約束文件。
【問題8.2】VIVADO/QUARTUS練習(xí)中,rst_n是否需要約束?
注意的是,該信號是輸入信號,但沒有隨路時(shí)鐘進(jìn)來。所以該信號可以認(rèn)為是無時(shí)鐘的情形,按照課程理論,應(yīng)該定義一個(gè)虛擬時(shí)鐘。
定義了虛擬時(shí)鐘后,再重新使用約束向?qū)Вs束rst_n。
【問題8.3】在VIVADO中,如何設(shè)置虛擬時(shí)鐘?
答:虛擬時(shí)鐘不能在時(shí)序約束向?qū)е刑砑樱枰谙旅娲翱谔砑?/span>

Clock name為該時(shí)鐘命一個(gè)名字,Source objects是不需要填的,因?yàn)槭翘摂M時(shí)鐘,就是沒對象了。
【問題8.4】時(shí)序約束出現(xiàn)時(shí)序違例(Slack為負(fù)數(shù)),如何處理?
答:首先指出一個(gè)誤區(qū):當(dāng)約束出現(xiàn)錯(cuò)誤時(shí),想當(dāng)然地認(rèn)為是“時(shí)序約束做得不對”,所以應(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)做了異步處理。對于數(shù)據(jù),則是通過異步FIFO來做異步處理;如果是控制信號,則要經(jīng)過打兩拍來處理。
B. 確認(rèn)做了異步處理后,仍然會報(bào)“時(shí)序違例”的。這個(gè)時(shí)候,可以該路徑設(shè)置成set false path,不用再檢查。
4. 同步電路下,具體處理如下:
A. 查看兩個(gè)寄存器點(diǎn)之間,經(jīng)過了多少加法器、乘法器、除法器等。
B. 對于除法器,要特別留意,一般是1個(gè)時(shí)鐘計(jì)算不完的。那么可以 a.想辦法不用除法;b. 通過使能信號控制獲取除法器結(jié)果的時(shí)間。
C. 對于乘法器和加法器,或者其他組合電路較多的。想辦法分隔成流水線來實(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í)等?
【問題8.6】如下圖所示,跨時(shí)鐘域打兩拍的方法,其實(shí)只是一個(gè)信號的傳遞,當(dāng)?shù)谝粋€(gè)信號出現(xiàn)不穩(wěn)之后或者錯(cuò)誤之后,后面就會把這個(gè)錯(cuò)誤的信號繼續(xù)傳遞下去,并沒有起到糾錯(cuò)的作用
答:上圖中打兩拍的方法,其本質(zhì)不是為了“糾錯(cuò)”,它的作用是為了防止“亞穩(wěn)態(tài)”。
防止亞穩(wěn)態(tài)的本質(zhì):防止中間狀態(tài)過長。之所以采用兩級觸發(fā)器的方法,是因?yàn)镈觸發(fā)器出現(xiàn)亞穩(wěn)態(tài)的可能性非常小,而兩級D觸發(fā)器出現(xiàn)亞穩(wěn)態(tài)的概率就更小了。
【問題8.7】既然打兩拍的方法不能糾錯(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知識大串講 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:采用指令信號的方法傳輸,模塊A產(chǎn)生vld信號給模塊B,模塊B對vld進(jìn)行同步化處理(打兩拍)后,檢測同步化信號的上升沿。
需要注意的,VLD的信號是讓模塊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:采用指令信號的方法傳輸,模塊A產(chǎn)生vld信號給模塊B,模塊B對vld進(jìn)行同步化處理(打兩拍)后,檢測同步化信號的上升沿。需要注意的,VLD的信號是讓模塊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:采用指令信號的方法傳輸,模塊A產(chǎn)生vld信號給模塊B,模塊B對vld進(jìn)行同步化處理(打兩拍)后,檢測同步化信號的上升沿。需要注意的,VLD的信號是讓模塊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í)鐘?
【問題12】 建立時(shí)間可以是負(fù)值嗎?
【問題13】 程序原本時(shí)序可以通過,加上singalTap節(jié)點(diǎn)之后時(shí)序不通過是什么原因
由于改變了資源,因此肯定對時(shí)序是有影響的,有可能改善了也有可能惡化了。如果時(shí)序有問題,分析路徑,如果是在線調(diào)試工具路徑,評估是否會有風(fēng)險(xiǎn),沒風(fēng)險(xiǎn)就算了
【問題8.14】時(shí)序約束什么時(shí)候要做?
2.一般時(shí)鐘大于100M的時(shí)候,我們就要做一下時(shí)序約束。
【問題8.15】時(shí)序約束建立時(shí)間和保持時(shí)間的生活案例。
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ī)場,那就會因此上一趟飛機(jī)的起飛,即違反了保持時(shí)間要求。(保持時(shí)間不滿足,影響的是上一批乘客坐飛機(jī))
7. 這個(gè)人是計(jì)劃去機(jī)場,因此他要估算幾點(diǎn)能到機(jī)場。首先他會算所有情況下的最大延遲,如剛到路口紅燈就來了、走路最慢等,在這種最慢的情況下,如果能在12點(diǎn)45分前到,說明建立時(shí)間沒問題。
然后,他會算所有情況下的最小延遲,如剛到路口綠燈,走路最快,在這種最快的情況下,如果能在12點(diǎn)10分后才,那說明保持時(shí)間沒問題。
【問題8.16】為什么建立時(shí)間分析的時(shí)鐘到達(dá)時(shí)間要加一個(gè)時(shí)鐘周期而保持時(shí)間分析則不用呢?
而保持時(shí)間分析,則是“本個(gè)時(shí)鐘”發(fā)出數(shù)據(jù)后,如果延時(shí)太小,會影響“本個(gè)時(shí)鐘”對上一個(gè)數(shù)據(jù)的采集,因?yàn)椴恍枰?個(gè)時(shí)鐘周期。
另外,要注意一點(diǎn),保持時(shí)間是跟時(shí)鐘周期無關(guān)的。
【問題8.17】一個(gè)外部的信號,經(jīng)過狀態(tài)機(jī)的“組合邏輯”,這也要做同步處理嗎?
答:需要做同步處理的。首先明白一點(diǎn),F(xiàn)PGA里的時(shí)序邏輯=組合邏輯 + D觸發(fā)器。組合邏輯的最終結(jié)果,還是要發(fā)D觸發(fā)器的。所以還要做同步化處理的。
【問題8.18】請教下,做時(shí)序約束,做到這步時(shí),這些都要勾選上嗎?
答:當(dāng)然不是,要逐個(gè)分析確認(rèn),沒有一選就全選上的道理。
【問題8.19】下面的生成時(shí)鐘約束,是否一定要勾選?
答:這應(yīng)該看生成時(shí)鐘那一節(jié)視頻,里面重點(diǎn)強(qiáng)調(diào)了“什么叫時(shí)鐘”? 上面的圖里,您應(yīng)該要搞清楚,它被識別出時(shí)鐘了,正不正常?如果是正常,那您肯定是要添加約束,定義頻率吧。如果它不應(yīng)該識別出時(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】請問下有沒有針對SDC時(shí)序約束語法的講解嗎?
答:時(shí)序約束里,只講解了用到的部分。如果想看更多部分,我估計(jì)你要看這個(gè)語法的權(quán)威資料了。
【問題8.24】老師您好,我在學(xué)習(xí)時(shí)序約束視頻,看到第一個(gè)視頻這塊“流水線設(shè)計(jì)思路:乘法器可以分成加法器,然后加法器還可以分成什么,一直聽不清”
答:最后可以分成與門這些最簡單的門電路。
【問題8.25】老師請問紅色的是不是不滿足時(shí)序要求?

答:不是的,setup和hold時(shí)間形成一個(gè)時(shí)間窗,只要在這個(gè)時(shí)間窗里信號穩(wěn)定就餓可以了 在使用時(shí)序分析工具的時(shí)候,字體為紅色時(shí)間提示是不滿足時(shí)序要求
【問題8.26】什么樣的信號會被工具判斷為時(shí)鐘?
答:一個(gè)信號被VIVADO QUARTUS判斷為時(shí)鐘,不是看名稱里是否帶有“clk”等字母。而是主要看其是否用于“時(shí)鐘”的行為中,主要有如下幾種情況。
1. 被關(guān)聯(lián)到always敏感列表里的時(shí)鐘信號。說明會被連到觸發(fā)器的時(shí)鐘端,所以會被認(rèn)為為時(shí)鐘。
2. 被連到PLL和MMCM等時(shí)鐘管理器的輸入端,這會被認(rèn)為是時(shí)鐘。
3. 被連到鎖存器的條件端,例如一個(gè)沒有補(bǔ)全的組合邏輯代碼,其條件就會被認(rèn)為時(shí)鐘。
【問題8.27】用ila抓取信號分析,發(fā)現(xiàn)異常,而時(shí)序約束報(bào)告正常,因此可以認(rèn)為時(shí)序報(bào)告正常,而時(shí)序會有問題?
答:
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í)序約束對不對,這是客戶保證的。
3.出現(xiàn)結(jié)果不對,可能性很多,不一定是時(shí)序問題,要注意“充分必要條件”。
【問題8.28】同樣的工程不做任何改動,有時(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í)鐘,可以方便將對應(yīng)信號歸到該虛擬時(shí)鐘好,這樣方便做分析,例如看有沒有跨時(shí)鐘域等。
3.是不是一定要做,取決于項(xiàng)目老大要求,不做不一定有問題。
【問題8.30】一個(gè)always模塊下,if 、else if,,,else ,寫的太多了 ,是不是會容易造成時(shí)序問題呢?這種說法對嗎?
答:這里有一個(gè)定義要搞清楚的,什么叫“多”?
1. 是3個(gè)就多,還是10個(gè)?每個(gè)人標(biāo)準(zhǔn)不同。
2. 即使是同一個(gè)人,使用不同的器件,這個(gè)“多”也是不同的。有些高級的器件,10個(gè)IF也不多,有些低端器件,3個(gè)也多。
3. 即使同一個(gè)人,同一個(gè)器件,但if里的判斷條件也有講究。如果判斷條件里一個(gè)除法器,那1個(gè)if也多,如果只是判斷0和1,那么10個(gè)也算少。
4. 最具可操作性的做法,給定時(shí)鐘約束,看時(shí)序報(bào)告。報(bào)告沒問題,那就是沒問題;否則會有時(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】請問:MDY的案例中,為什么串口需要對din進(jìn)行同步化,而SCCB就不需要對sio_din進(jìn)行同步化?sio_din也是外部器件進(jìn)來的嗎?
答: 是否要對信號進(jìn)行同步化,最核心的理解是“該信號是否能夠保證滿足建立時(shí)間和保持時(shí)間要求”,也就是“該信號的變化和時(shí)鐘存在確定性相位關(guān)系”。
以串口為例,串口的輸入信號與FPGA時(shí)鐘是沒有任何聯(lián)系的,該輸入信號可以在任意時(shí)刻變化,也就有可能剛好在時(shí)鐘上升沿變化,從而不滿足建立時(shí)間要求,
因此要做同步化處理。而SCCB案例中,由FPGA時(shí)鐘里產(chǎn)生了sio_dout、SCK等信號,而sio_din在sck作用下變化,所以sio_din與FPGA時(shí)鐘是有一定關(guān)系的。
可以認(rèn)真看時(shí)序圖,在FPGA對sio_din有采樣時(shí)刻,時(shí)序已經(jīng)要求sio_din要穩(wěn)定不變的,所以可以不用做同化處理。
【問題8.33】請問工程中使用了PLL,在做時(shí)序約束時(shí),generate clocks窗口顯示沒有PLL產(chǎn)生的時(shí)鐘,如下圖,為什么?

答:PLL、MMCM等產(chǎn)生的時(shí)鐘,默認(rèn)是由工具自動推導(dǎo)約束的,不用用戶來約束。雖然用戶沒有約束,事實(shí)上是做了分析的。例如下圖中,
可以看到c0_my_pll這個(gè)時(shí)鐘。其中,c0_my_pll是工具自動命名的。
用戶也可以自己約束PLL/MMCM產(chǎn)生的時(shí)鐘,方法如下圖。
按照方面方法,約束好,重新分析就可以了。
【問題8.34】問:如果使用的IP核內(nèi)部代碼出現(xiàn)了時(shí)序約束違例,該如何解決?
答:IP核是由官方提供的代碼,一般用戶不能修改,如果該IP核出現(xiàn)違例,可以從以下方向入手:
1. 一般IP核是有指定的頻率范圍,可以從數(shù)據(jù)手冊找到,請看是否滿足了數(shù)據(jù)手冊要求。
2. 如果頻率正確,還會出現(xiàn)報(bào)錯(cuò),可以檢查時(shí)鐘和復(fù)位管腳有沒有正確使用,根據(jù)經(jīng)驗(yàn),這通常是引起問題的原因。
3. 嘗試修改編譯策略,重新綜合看看。
【問題8.35】問:請問時(shí)序約束只是針對FPGA輸入與輸出端進(jìn)行約束,而不是針對FPGA內(nèi)部模塊之間或者模塊里面。這樣理解是否正確?
答:不是的,內(nèi)部肯定也跟約束有關(guān)。
【問題8.36】問:老師,想問下時(shí)序約束,DDR4的uiclk需要時(shí)鐘約束嗎?(時(shí)序約束)
答:需要的,設(shè)置好時(shí)鐘頻率,周期就可以了,就是需要create clock就好了
【問題8.37】問:關(guān)于input delay的抖動解釋。(時(shí)序約束)
答:需要理解的抖動,不是指一個(gè)波形的結(jié)果,是多個(gè)波形疊加的結(jié)果。假設(shè)說一個(gè)PWM波形,周期為10ns,理想情況下變高為2.5ns,變低在7.5ns。由于存在不確定延時(shí)情況,所以有時(shí)候變高在2.6ns,變低在7.6ns。有時(shí)候變高在2.4ns,變低在7.4ns。有時(shí)變高在2.3ns,變低在7.3ns。數(shù)個(gè)波形疊加,就看到了抖動的現(xiàn)象。