八、時序約束專題課
【問題8.1】 VIVADO的時鐘約束向?qū)?,常無法找到時鐘,如下圖所示,位置1中應(yīng)該要識別出時鐘。
答:請注意,位置1的地方是列出的是“沒有被約束的時鐘”,如果該時鐘已經(jīng)被約束了,就不會在這里列出來了。
注意上圖中3的位置,該列說明了有2條時鐘約束??梢渣c(diǎn)擊這里看看,是不是已經(jīng)對時鐘進(jìn) 行約束了。
為什么會有時鐘被約束了呢?因?yàn)樵摴こ桃呀?jīng)有約束文件。
【問題8.2】VIVADO/QUARTUS練習(xí)中,rst_n是否需要約束?
答:一個完整的約束,其基本要求是:所有的路徑都覆蓋,包括所有的輸入管腳和輸出管腳。所以,rst_n需要約束。
注意的是,該信號是輸入信號,但沒有隨路時鐘進(jìn)來。所以該信號可以認(rèn)為是無時鐘的情形,按照課程理論,應(yīng)該定義一個虛擬時鐘。
定義了虛擬時鐘后,再重新使用約束向?qū)Вs束rst_n。
【問題8.3】在VIVADO中,如何設(shè)置虛擬時鐘?
答:虛擬時鐘不能在時序約束向?qū)е刑砑?,需要在下面窗口添?/p>
在Edit Timing Constraints中點(diǎn)擊,然后在creat clock窗口中,雙擊“Double click to create a Create Clock Constrtaint”。
在彈出的窗口中
Clock name為該時鐘命一個名字,Source objects是不需要填的,因?yàn)槭翘摂M時鐘,就是沒對象了。
【問題8.4】時序約束出現(xiàn)時序違例(Slack為負(fù)數(shù)),如何處理?
答:首先指出一個誤區(qū):當(dāng)約束出現(xiàn)錯誤時,想當(dāng)然地認(rèn)為是“時序約束做得不對”,所以應(yīng)該怎么去改“時序約束”,從而讓這些錯誤消失,這是一 個錯誤的觀念。
時序約束的作用:在于檢查“設(shè)計(jì)是否滿足時序要求”,它是用來審視自己設(shè)計(jì)的,很多情況是,要改設(shè)計(jì)代碼來滿足時序要求。
當(dāng)時序約束提示有錯誤時,應(yīng)該閱讀“時序報告”,從報告中分析時序路徑(數(shù)據(jù)到達(dá)時間、時鐘到達(dá)時間和數(shù)據(jù)要求時間等),根據(jù)報告分析錯誤 的原因,并根據(jù)原因來實(shí)行不同的方法。以建立時間違例,說明具體方法如下
1. 時序報告中,找到提示錯誤的路徑,即目的寄存器,以及源寄存器。注意,這是兩個寄存器的點(diǎn)。
2. 首先判斷,源寄存器的時鐘,與目的寄存器的時鐘,是否相同。如果不同,可以認(rèn)為是異步時序,見步驟3;如果是相同,則看步驟4。
3. 如果是異步電路,那么處理方法如下:
A. 確認(rèn)做了異步處理。對于數(shù)據(jù),則是通過異步FIFO來做異步處理;如果是控制信號,則要經(jīng)過打兩拍來處理。
B. 確認(rèn)做了異步處理后,仍然會報“時序違例”的。這個時候,可以該路徑設(shè)置成set false path,不用再檢查。
4. 同步電路下,具體處理如下.
A. 查看兩個寄存器點(diǎn)之間,經(jīng)過了多少加法器、乘法器、除法器等。
B. 對于除法器,要特別留意,一般是1個時鐘計(jì)算不完的。那么可以 a.想辦法不用除法;b. 通過使能信號控制獲取除法器結(jié)果的時間。
C. 對于乘法器和加法器,或者其他組合電路較多的。想辦法分隔成流水線來實(shí)現(xiàn)。可以參考MDY 流水線的內(nèi)容。
5. 如果是IP核的違例,檢查是否時鐘不滿足IP核的要求。如果沒問題,就不用管。
6. 如果是ILA等在線調(diào)試工具路線的違例,則一般不用處理.
7. 如果是線延時太長的,可以嘗試打一拍處理。即A->B的線太長,可以打一拍,變成A->C->B,這樣線延時就小了。
【問題8.5】VIVADO中,如何查詢未約束的時鐘、未約束的輸入延時和輸出延時等?
答:如下圖,在VIVADO的時序約束界面中,在下面欄目可顯示未約束的地方。
【問題8.6】如下圖所示,跨時鐘域打兩拍的方法,其實(shí)只是一個信號的傳遞,當(dāng)?shù)谝粋€信號出現(xiàn)不穩(wěn)之后或者錯誤之后,
后面就會把這個錯誤的信號繼續(xù)傳遞下去,并沒有起到糾錯的作用
答:上圖中打兩拍的方法,其本質(zhì)不是為了“糾錯”,它的作用是為了防止“亞穩(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】既然打兩拍的方法不能糾錯,那“打兩拍”還有什么意義?
答:錯誤有很多種,有些錯誤是1次性錯誤,而有些是系統(tǒng)性錯誤。
傳輸過程中,如果發(fā)了0,如果全部接收模塊都認(rèn)為是1,這并不是問題,這是可以預(yù)防和可控的(例如檢測多幾次就行了)。 但是亞穩(wěn)態(tài)的時候,如果發(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的時鐘clka為100MHz,模塊B的時鐘clkb為300MHz?,F(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個時鐘的vld給模塊B即可。
【問題8.9】模塊A的時鐘clka為300MHz,模塊B的時鐘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個時鐘的vld給模塊B。
【問題8.10】一塊電路板上,有兩個芯片,芯片A的時鐘clka為100MHz,芯片B的時鐘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,但他們不是同一個晶振產(chǎn)生的,因此都是異步時鐘。為了滿足以上要求,所以模塊A要產(chǎn)生3個時鐘的vld給模塊B。
【問題8.11】A, B時鐘都是50M,但是他們不相關(guān),為了防止編譯器把他們默認(rèn)為同一個時鐘,是不是要用一個異步時鐘組約束,
來告訴編譯器他們是不同的兩個時鐘?
答:一般分別產(chǎn)生A和B的時鐘約束即可。
【問題12】 建立時間可以是負(fù)值嗎?
答:建立時間當(dāng)然可以是負(fù)數(shù)了。負(fù)數(shù)表示,可以在時鐘上升沿后數(shù)據(jù)才變化。(建立時間是器件的屬性,至于怎么器件怎么做到的,
那就要問器件工程師了)
【問題13】 程序原本時序可以通過,加上singalTap節(jié)點(diǎn)之后時序不通過是什么原因
答:增加signaltap ILA等在線調(diào)試工具時,需要使用到內(nèi)部的資源,例如RAM、選擇器、寄存器等,增加后再去綜合和布局布線。
由于改變了資源,因此肯定對時序是有影響的,有可能改善了也有可能惡化了。如果時序有問題,分析路徑,如果是在線調(diào)試工具路徑,
評估是否會有風(fēng)險,沒風(fēng)險就算了
【問題8.14】時序約束什么時候要做?
答: 1.在需要的時鐘頻率下,如果邏輯功能不穩(wěn)定,那么就需要時序約束。
2.一般時鐘大于100M的時候,我們就要做一下時序約束。
【問題8.15】時序約束建立時間和保持時間的生活案例。
答:可以想象,有一個人從家里出發(fā)去機(jī)場,搭乘13點(diǎn)的飛機(jī)。
1. 13點(diǎn)起飛,起飛前15分鐘要到機(jī)場,這個15分鐘,就類似于建立時間要求。
2. 機(jī)場每小時有要飛一趟飛機(jī),每個小時表示的是時鐘周期。
3. 飛機(jī)起飛后,機(jī)場要保持10分鐘,之后才能來下一批乘客,這個10分鐘就是保持時間。
4. 這個人出發(fā)去搭13點(diǎn)的飛機(jī),因此他要在12點(diǎn)45分之前到機(jī)場,并且是12點(diǎn)10分之后到機(jī)場。既不能早到,也不能晚到機(jī)場。
5. 如果這個人12點(diǎn)45分之后才到機(jī)場,那就搭不上本趟飛機(jī),即違反了建立時間要求。(建立時間影響的是自己坐飛機(jī))
6. 如果這個人12點(diǎn)10分前就到了機(jī)場,那就會因此上一趟飛機(jī)的起飛,即違反了保持時間要求。(保持時間不滿足,影響的是上一批乘客坐飛機(jī))
7. 這個人是計(jì)劃去機(jī)場,因此他要估算幾點(diǎn)能到機(jī)場。首先他會算所有情況下的最大延遲,如剛到路口紅燈就來了、走路最慢等,在這種最慢的情況 下,如果能在12點(diǎn)45分前到,說明建立時間沒問題。然 后,他會算所有情況下的最小延遲,如剛到路口綠燈,走路最快,
在這種最快的情況下,如果能在12點(diǎn)10分后才,那說明保持時間沒問題。
【問題8.16】為什么建立時間分析的時鐘到達(dá)時間要加一個時鐘周期而保持時間分析則不用呢?
答: 因?yàn)榻r間是源寄存器發(fā)出數(shù)據(jù),目的寄存器采集,也就是上一個時鐘發(fā)出來,本時鐘采集。這里有一個時鐘周期的因素,
所以要加1個時鐘周期。而保持時間分析,則是“本個時鐘”發(fā)出數(shù)據(jù)后,如果延時太小,會影響“本個時鐘”對上一個數(shù)據(jù)的采集,
因?yàn)椴恍枰?個時鐘周期。另外,要注意一點(diǎn),保持時間是跟時鐘周期無關(guān)的。
【問題8.17】一個外部的信號,經(jīng)過狀態(tài)機(jī)的“組合邏輯”,這也要做同步處理嗎?
答:需要做同步處理的。首先明白一點(diǎn),F(xiàn)PGA里的時序邏輯=組合邏輯 + D觸發(fā)器。組合邏輯的最終結(jié)果,還是要發(fā)D觸發(fā)器的。所以還要做同步化處理的。
【問題8.18】請教下,做時序約束,做到這步時,這些都要勾選上嗎?
答:當(dāng)然不是,要逐個分析確認(rèn),沒有一選就全選上的道理。
【問題8.19】下面的生成時鐘約束,是否一定要勾選?
答:這應(yīng)該看生成時鐘那一節(jié)視頻,里面重點(diǎn)強(qiáng)調(diào)了“什么叫時鐘”? 上面的圖里,您應(yīng)該要搞清楚,它被識別出時鐘了,正不正常.
如果是正常,那您肯定是要添加約束,定義頻率吧。如果它不應(yīng)該識別出時鐘了,那您應(yīng)該檢查您的代碼,看是不是代碼不規(guī)范引起,或者有沒有潛在的問題。注意一下:約束不是目的,約束是為了查看報告,看設(shè)計(jì)有沒有問題的。
【問題8.20】系統(tǒng)同步只可能是單沿采集?沒法像DDR那樣雙沿采集?
答:系統(tǒng)同步也是可以是雙沿采集的,但比較少。課程里,只是介紹了部分情形。 如果想看所有情形有哪些,可以打開VIVADO的時序約束向?qū)?,可以設(shè)置INPUT DELAY窗口查看。
【問題8.21】QUARTUS生成SDC時,默認(rèn)出現(xiàn)的那條時鐘約束是正常的么?我自己刪掉就行了?
答:默認(rèn)生成的當(dāng)然是不正常。
【問題8.22】老師問一下,我畫的后邊那個部分,我認(rèn)為應(yīng)該沒有數(shù)據(jù)吧?
答:不是 這個不是有沒有數(shù)據(jù)的概念 而是數(shù)據(jù)是否穩(wěn)定的概念。
【問題8.23】請問下有沒有針對SDC時序約束語法的講解嗎?
答:時序約束里,只講解了用到的部分。如果想看更多部分,我估計(jì)你要看這個語法的權(quán)威資料了。
【問題8.24】老師您好,我在學(xué)習(xí)時序約束視頻,看到第一個視頻這塊“流水線設(shè)計(jì)思路:乘法器可以分成加法器,然后加法器還可以分成什么,一直聽不清”
答:最后可以分成與門這些最簡單的門電路。
【問題8.25】老師請問紅色的是不是不滿足時序要求?
答:不是的,setup和hold時間形成一個時間窗,只要在這個時間窗里信號穩(wěn)定就餓可以了 在使用時序分析工具的時候,
字體為紅色時間提示是不滿足時序要求
【問題8.26】為什么建立時間分析的時鐘到達(dá)時間要加一個時鐘周期而保持時間分析則不用呢?
答:因?yàn)榻r間是源寄存器發(fā)出數(shù)據(jù),目的寄存器采集,也就是上一個時鐘發(fā)出來,本時鐘采集。這里有一個時鐘周期的因素,所以要加1個時鐘周期。而保持時間分析,則是“本個時鐘”發(fā)出數(shù)據(jù)后,如果延時太小,會影響“本個時鐘”對上一個數(shù)據(jù)的采集,因?yàn)椴恍枰?個時鐘周期。另外,要注意一點(diǎn),保持時間是跟時鐘周期無關(guān)的。
【問題8.27】用ila抓取信號分析,發(fā)現(xiàn)異常,而時序約束報告正常,因此可以認(rèn)為時序報告正常,而時序會有問題?
答:
1.在線邏輯分析儀是用于判斷邏輯是否出現(xiàn)問題,可以認(rèn)為是檢查時鐘節(jié)拍下的邏輯判斷。而時序約束是解決D觸發(fā)器的建立時間和保持時間問題,是一個時鐘內(nèi)的時序問題。所以,不能用ila來推導(dǎo)時序約束,這是不同層次的問題。
2.官方可以保證,用戶代碼和時序約束的生成結(jié)果是正確,即在輸入的代碼和約束,給出來的報告一定是正確的。但時序約束對不對,這是客戶保證的。
3.出現(xiàn)結(jié)果不對,可能性很多,不一定是時序問題,要注意“充分必要條件”。
【問題8.28】同樣的工程不做任何改動,有時編譯后下板驗(yàn)證正確,有時編譯后下板驗(yàn)證不正確,是不是時序問題呢?
答:有可能是,但又不一定是。這是時序不滿足的一種現(xiàn)象。但反過來,沒有說,出現(xiàn)這種現(xiàn)象,就一定是時序問題。
【問題8.29】設(shè)置時鐘約束時,假如有虛擬時鐘的情況,虛擬時鐘是必須要設(shè)置的嗎?
答:
1.原則上所有接口有應(yīng)有約束。
2.設(shè)置虛擬時鐘,可以方便將對應(yīng)信號歸到該虛擬時鐘好,這樣方便做分析,例如看有沒有跨時鐘域等。
3.是不是一定要做,取決于項(xiàng)目老大要求,不做不一定有問題。
【問題8.30】一個always模塊下,if 、else if,,,else ,寫的太多了 ,是不是會容易造成時序問題呢?這種說法對嗎
答:這里有一個定義要搞清楚的,什么叫“多”?
1. 是3個就多,還是10個?每個人標(biāo)準(zhǔn)不同。
2. 即使是同一個人,使用不同的器件,這個“多”也是不同的。有些高級的器件,10個IF也不多,有些低端器件,3個也多。
3. 即使同一個人,同一個器件,但if里的判斷條件也有講究。如果判斷條件里一個除法器,那1個if也多,如果只是判斷0和1,那么10個也算少。
4. 最具可操作性的做法,給定時鐘約束,看時序報告。報告沒問題,那就是沒問題;否則會有時序違例的錯誤。
【問題8.31】output latency一般設(shè)置成多少呢?pipeline 有啥用?
答:由于除法器占用資源較大,難以在一個時鐘周期內(nèi)計(jì)算完畢,需要多個時鐘才計(jì)算完,這個pipeline就是設(shè)置多少個時鐘周期的。如果您不清楚要多少個,設(shè)置填一個較大的數(shù),然后看時序報告是否正確。如果正確,就沒問題。
【問題8.32】請問:MDY的案例中,為什么串口需要對din進(jìn)行同步化,而SCCB就不需要對sio_din進(jìn)行同步化?sio_din也是外部器件進(jìn)來的嗎?
答: 是否要對信號進(jìn)行同步化,最核心的理解是“該信號是否能夠保證滿足建立時間和保持時間要求”,也就是“該信號的變化和時鐘存在確定性相位關(guān)系”。
以串口為例,串口的輸入信號與FPGA時鐘是沒有任何聯(lián)系的,該輸入信號可以在任意時刻變化,也就有可能剛好在時鐘上升沿變化, 從而不滿足建立時間要求, 因此要做同步化處理。而SCCB案例中,由FPGA時鐘里產(chǎn)生了sio_dout、SCK等信號,而sio_din在sck作用下變化,所以sio_din與FPGA時鐘是有一定關(guān)系的。可以認(rèn)真看時序圖,在FPGA對sio_din有采樣時刻,時序已經(jīng)要求sio_din要穩(wěn)定不變的,所以可以不用做同化處理。
審核編輯:湯梓紅
?
評論
查看更多