0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FPGA設計中大位寬、高時鐘頻率時序問題調試經驗總結

FPGA之家 ? 來源:FPGA之家 ? 2023-05-06 09:31 ? 次閱讀

今天跟大家分享的內容很重要,也是我們調試FPGA經驗的總結。隨著FPGA對時序和性能的要求越來越高,高頻率、大位寬的設計越來越多。在調試這些FPGA樣機時,需要從寫代碼時就要小心謹慎,否則寫出來的代碼可能無法滿足時序要求。另外,最近跟網友聊天時,有談到公眾號壽命的問題,我覺得網絡交換FPGA公眾號應該在這方面有優(yōu)勢,作為高校里從事FPGA開發(fā)的老師,又有興趣做公眾號的維護,不會遇到其他公眾號做著做著就停更的問題,我們的公眾號也許將陪伴你十年甚至幾十年。同時,也請大家放心,我們今后每篇文章都將用心的去總結歸納,確保篇篇都是干貨!新的一年開始了,希望在新的一年里,繼續(xù)給大家分享平時遇到的FPGA調試中遇到的問題及經驗,一起進步,一起努力,加油!

時鐘信號的約束寫法

問題一:沒有對設計進行全面的約束導致綜合結果異常,比如沒有設置異步時鐘分組,綜合器對異步時鐘路徑進行靜態(tài)時序分析導致誤報時序違例。

約束文件包括三類,建議用戶應該將這三類約束文件分開寫在三個xdc/sdc文件中。

第一類是物理約束,它主要對設計頂層的輸入輸出引腳的分配約束、電平標準的約束,

如下圖所示:在quartus環(huán)境下,對pcie_rstn和pcie_refclk的電平標準和管腳進行了約束。

aa36f7e6-eb92-11ed-90ce-dac502259ad0.png

如下圖所示:在vivado環(huán)境下,對rst_n和sys_clk_PCIe_p的電平標準和管教進行了約束。

aa4d23f4-eb92-11ed-90ce-dac502259ad0.png

第二類是調試約束,用戶在使用ila調試時,Vivado會自動生成相關ila的調試約束。 如下圖所示,這是Vivado自動生成的相關ila的調試約束。

aa62dc3a-eb92-11ed-90ce-dac502259ad0.jpg

第三類是時序約束,這類約束的種類最多,它包括時鐘周期約束、輸入輸出延遲約束、跨時鐘域路徑約束、多周期路徑約束、偽路徑約束等。 時鐘周期約束:用戶需要將設計中的所有時鐘進行約束后,綜合器才能進行合理的靜態(tài)時序分析。一個設計中的時鐘主要分為兩類:主時鐘和生成時鐘。主時鐘包括由全局時鐘引腳接入的時鐘、高速收發(fā)器的輸出時鐘。生成時鐘包括由MMCM/PLL產生的時鐘、用戶邏輯分頻產生的時鐘,建議用戶不要使用后者,因為它通常是由組合邏輯或觸發(fā)器生成的時鐘,這種時鐘的歪斜、抖動、驅動能力都很差。對時鐘進行約束時,主要針對時鐘的頻率、占空比、抖動、不確定性等參數進行約束。 全局時鐘引腳接入的時鐘約束舉例: 如下圖所示,在quatus環(huán)境下,對全局時鐘引腳接入的時鐘pcie_refclk進行了約束,因為占空比是50%,抖動和不確定性也采用默認值,所以圖中只對頻率進行了約束。

aa818d1a-eb92-11ed-90ce-dac502259ad0.png

如下圖所示,在vivado環(huán)境下,對全局時鐘引腳接入的時鐘sys_clk_PCIe_p進行了約束,因為占空比是50%,抖動和不確定性也采用默認值,所以圖中只對頻率進行了約束。

aa9463b8-eb92-11ed-90ce-dac502259ad0.png

高速收發(fā)器的輸出時鐘約束舉例:由于高速收發(fā)器通常是例化IP核來使用的,所以這種約束通常是IP核自帶的。 如下圖所示,在vivado環(huán)境下,PCIE IP核中對高速收發(fā)器的輸出時鐘進行約束。

aaa0d9ea-eb92-11ed-90ce-dac502259ad0.png

MMCM/PLL生成時鐘約束舉例: 如下圖所示,在quatus環(huán)境下,在sdc中加入以下命令,quatus會對所有PLL產生的時鐘進行了約束。因為用戶只要對PLL的輸入時鐘(通常情況下是主時鐘)進行了約束,在sdc中加入以下命令后,quatus能夠根據輸入時鐘和輸出時鐘的關系自動推斷出PLL的輸出時鐘的時鐘周期、占空比、相位關系等。

aab3bfc4-eb92-11ed-90ce-dac502259ad0.png

如下圖所示,在vivado環(huán)境下,用戶對PCIE IP核中的MMCM的輸出時鐘進行重命名,用戶只要確保對MMCM的輸入時鐘(通常情況下是主時鐘)進行了約束,Vivado會自動能夠根據輸入時鐘和輸出時鐘的關系自動推斷出PLL的輸出時鐘的時鐘周期、占空比、相位關系等。

aac6cd76-eb92-11ed-90ce-dac502259ad0.png

跨時鐘域約束:在介紹跨時鐘域之前,先介紹兩個概念:同步時鐘和異步時鐘。同步時鐘:當兩個時鐘間的相位是固定的,則可以稱這兩個時鐘為同步時鐘。一般同源,如由同一個MMCM/PLL產生的兩個時鐘可以稱為同步時鐘。異步時鐘:無法判定兩個時鐘間相位時,則可以稱這兩個時鐘為異步時鐘。兩個來自不同晶振的時鐘,一定是異步時鐘。通常情況下設計中不同的主時鐘肯定是異步時鐘。由不同的MMCM/PLL產生的兩個輸出時鐘即使頻率相同,但是由于相位關系不確定,所以也屬于異步時鐘。 用戶想要進行跨時鐘域的約束,首先需要對設計中的所有時鐘進行異步時鐘分組。若用戶沒有設置異步時鐘分組,綜合器在綜合時會認為所有的時鐘都是相關的,從而對某些源時鐘與目的時鐘屬于異步時鐘關系的路徑進行了靜態(tài)時序分析,由于源時鐘與目的時鐘的相位關系不確定,所以該路徑的建立時間或保持時間必定是存在違例的。若用戶設置了異步時鐘分組,Vivado在時序分析時,當源時鐘和目的時鐘屬于同一個時鐘組時,才會分析此時序路徑;而源時鐘和目的時鐘屬于不同時鐘組時,則會略過此時序路徑的分析。 那么如何進行時鐘的異步分組呢?首先要按照上面提到同步時鐘和異步時鐘的概念對設計中的所有時鐘進行分類,屬于異步時鐘關系的時鐘必定要劃分在不同的分組中,屬于同步時鐘關系的時鐘可以分在同一個分組也可以分在不同的分組中,如何劃分要看具體情況而定。 如下圖所示,在quatus環(huán)境下,對時鐘進行異步時鐘分組的劃分,圖中主要有3類時鐘, 由全局時鐘引腳輸入的pcie_refclk,PCIE IP核中的MMCM輸出的時鐘(圖中用通配符*表示) Flash_pll輸出的兩個不同頻率的時鐘outclk0和outclk1。首先要確定全局時鐘引腳輸入的時鐘和PCIE IP核中的MMCM輸出的時鐘以及Flash_pll輸出的兩個不同頻率的時鐘屬于異步時鐘關系,它們必須要劃分在不同的分組中。但是,F(xiàn)lash_pll輸出的兩個不同頻率的時鐘outclk0和outclk1如何進行劃分呢?首先,考慮一下設計中,outclk0和outclk1之間有沒有進行數據交互,如果沒有數據交互,那么就將這兩個時鐘劃分在同一個時鐘分組即可,圖中就屬于這種情況。如果有數據交互,可以分為以下三種方案進行操作: 1.將這兩個時鐘劃分在不同的時鐘分組,用戶在邏輯中進行了跨時鐘域處理。(推薦使用) 2.將這個時鐘劃分在相同的時鐘分組,用戶在邏輯中進行了跨時鐘域處理,在xdc/sdc中添加set_flase_path(偽路徑約束)禁止綜合器對跨時鐘域路徑(通常是雙觸發(fā)器同步的跨時鐘路徑)進行靜態(tài)時序分析。 3.將這個時鐘劃分在相同的時鐘分組,用戶邏輯中不需要進行跨時鐘域處理,由后端保證時序。

aadd970e-eb92-11ed-90ce-dac502259ad0.png

偽路徑約束:偽路徑約束主要用于以下情況:1.上文提到的對通過雙觸發(fā)器同步的跨時鐘域路徑設置偽路徑。2.異步復位路徑

在vivado環(huán)境下,通過以下指令將異步復位路徑sys_rst_n 設置為偽路徑

set_false_path-from [get_ports sys_rst_n]

在quatus環(huán)境下,通過以下指令將異步復位路徑pcie_rstn 設置為偽路徑

set_false_path-from [get_ports pcie_rstn] -to *

判斷條件過長問題

問題二:一個always塊的判斷條件中的部分變量或賦值語句中的部分被賦值變量是直接由組合邏輯產生的。當組合邏輯不是特別長時或FPGA的資源利用率比較低時,這種時序問題很可能會被綜合器優(yōu)化處理掉。但是當組合邏輯鏈路過長時,尤其是大位寬的寄存器進行邏輯運算生成了較長的組合邏輯鏈路時,這種代碼風格導致的時序問題就會比較明顯,最終導致always塊的輸入信號的延時變大,建立時間違例。

有時序問題的代碼如下圖所示,req_start_addr_reg信號和PC_LAST_ADDR信號屬于位寬較大的寄存器,圖中有三個典型問題需要注意。

aaf2f73e-eb92-11ed-90ce-dac502259ad0.png

第一個需要注意的問題:PC_LAST_ADDR信號是一個組合邏輯鏈路的輸出信號,該組合邏輯鏈路是由邏輯運算導致的。錯誤的地方在于PC_LAST_ADDR信號直接被當做always塊的輸入信號使用,導致always塊的輸入信號的延時變大,建立時間違例。正確的處理方式應該是將PC_LAST_ADDR信號打一拍后,再將打一拍后的輸出信號作為always塊的輸入信號使用。

第二個需要注意的問題:在always塊的第三個和第四個的判斷條件中都是先進行了邏輯運算后再進行邏輯判斷的。這個問題的本質和第一個問題相同,都是將組合邏輯的輸出信號直接作為always塊的輸入信號使用,導致always塊的輸入信號的延時變大,建立時間違例。正確的處理方式應該是將組合邏輯單獨拎出來,然后將組合邏輯的輸出結果打一拍后,再將打一拍后的輸出信號作為always塊的輸入信號使用。而且在always塊的第三個和第四個的判斷條件中使用了三段式狀態(tài)機的n_state作為了判斷條件,原因同上。正確的處理方式應該盡量使用c_state作為判斷條件。

第三個需要注意的問題:在always塊的第四個賦值語句中,將兩個信號進行邏輯運算后進行賦值操作。這個問題的本質和第一個問題相同,都是將組合邏輯的輸出信號直接作為always塊的輸入信號使用,導致always塊的輸入信號的延時變大,建立時間違例。正確的處理方式應該是將組合邏輯單獨拎出來,然后將組合邏輯的輸出結果打一拍后,再將打一拍后的輸出信號作為always塊的輸入信號使用。 修改之后的代碼如下圖所示:

ab0c0864-eb92-11ed-90ce-dac502259ad0.jpg

總結:在編寫代碼時,應該注意以下三點: 1.應該盡量保證每一個always塊的判斷條件簡潔(判斷條件中盡量只進行邏輯判斷,盡量避免邏輯運算) 2.應該盡量保證每一個always塊的判斷條件中的每一個變量都是直接來源于某個always塊輸出信號,盡量避免將組合邏輯的輸出直接作為某個always塊的判斷條件的一部分,這樣就可以保證每一個always塊的輸入信號的延時比較固定,有利于時序收斂。 3.應該盡量保證每一個always塊的賦值語句中的被賦值變量都是直接來源于某個always塊輸出信號,盡量避免將組合邏輯的輸出直接作為某個always塊的賦值語句中的一部分,這樣就可以保證每一個always塊的輸入信號的延時比較固定,有利于時序收斂。

if else嵌套層數過多

問題三:always塊中的if…else…嵌套層數過多導致綜合問題 有時序問題的代碼如下圖所示,always塊中嵌套了三層if…else…,正確的處理方式應該盡量減少always塊中if…else…的嵌套層數。

ab28f23a-eb92-11ed-90ce-dac502259ad0.png

修改之后的代碼如下圖所示,

ab47d556-eb92-11ed-90ce-dac502259ad0.png

總結:在編寫代碼時,應該盡量減少always塊中的if…else…嵌套層數.

邏輯信號扇出過大

問題四:部分用戶邏輯信號扇出過大,導致驅動能力不足。

有時序問題的代碼如下圖所示,圖中三個always塊產生了一組RAM的寫信號,這組信號作為55個always塊的輸入信號,也就是說該信號驅動了55個always塊,普通的信號的扇出能力一般在15-20左右。這組信號作為普通的用戶邏輯,如果采用加BUFG的方式來增加驅動能力,這樣不僅浪費BUFG的資源,而且BUFG會給信號加入極大的延時,這種延時對于有些高速設計來說也許是不可接受的,一般只有全局復位信號才會使用BUFG增加驅動能力。所以對于這種用戶邏輯信號,推薦采用復制寄存器的方式解決驅動能力不夠的問題。

ab65b580-eb92-11ed-90ce-dac502259ad0.png

修改之后的代碼如下圖所示:將原來的一組信號,復制了兩份,總共三組信號,且三組信號的邏輯相同,每組信號驅動的always塊的個數變成了原來的1/3。但是同時需要注意的問題是,這種復制的寄存器有極大的可能會被綜合器當作等效寄存器優(yōu)化掉,為了防止綜合器多管閑事,在quatus下需要在聲明被復制的寄存器前面加上(* noprune *)告知綜合器此寄存器不需要優(yōu)化,在vivado下需要在聲明被復制的寄存器前面加上(* keep =“true”*)告知綜合器此寄存器不需要優(yōu)化。

ab75987e-eb92-11ed-90ce-dac502259ad0.png

總結:在編寫代碼時,需要注意信號驅動能力與扇出的問題,對扇出大的用戶邏輯信號進行寄存器復制解決驅動能力不足的問題。對于全局復位信號,使用加BUFG解決驅動能力不足的問題。

數據選擇器過大

問題五:用戶需要使用大型的數據選擇器(8選1以上的選擇器)時,如果直接使用組合邏輯的case語句實現(xiàn)大型數據選擇器,可能會導致以下問題:綜合器綜合速度變慢,邏輯資源占用率變大,數據選擇器的相關信號時序違例會很大,數據選擇器的輸出結果也會極不穩(wěn)定。

有時序問題的部分代碼如下圖所示:用戶需要一個128選1的數據選擇器,圖中直接使用了一個組合邏輯的case語句實現(xiàn)了128選1。正確的處理方式應該是將一個128選1的選擇器,分為3級,第一級使用了16個8選1,第二級使用了2個8選1,第三級使用了1個2選1,總共消耗3個時鐘,選出最終的輸出結果,注意每一級的輸出結果都需要打一拍后再輸入到下一級進行選擇。

ab84d44c-eb92-11ed-90ce-dac502259ad0.jpg

修改之后的部分代碼如下圖所示,

aba1e1b8-eb92-11ed-90ce-dac502259ad0.png

abba3434-eb92-11ed-90ce-dac502259ad0.png

abcafb48-eb92-11ed-90ce-dac502259ad0.png

總結:大型數據選擇器不能直接使用組合邏輯的case語句實現(xiàn),在對選擇器的延時要求不是很高的情況下,最好將大型數據選擇器進行分級選擇的處理。

大位寬RAM數據總線約束

問題六:高速設計中,RAM的輸出或寄存器的位寬太寬時(64bit以上),可能會出現(xiàn)在某個時鐘的上升沿時,寄存器的某些bit由于布線導致路徑時延不一致,不能與其他bit的數據在同一個時鐘上升沿到達,導致用戶采樣到數據出現(xiàn)錯誤或者采樣到亞穩(wěn)態(tài)。所以,用戶要使用某個數據位寬很寬的寄存器時,無論這個寄存器數據來源于FIFO還是來源于用戶邏輯,建議先將該寄存器打拍,然后使用打拍后的數據,這樣更有利于時序收斂。 但如果從RAM里面輸出的大位寬的數據總線經過打拍后仍然不穩(wěn)定又該怎么辦呢?筆者在實際調試過程中發(fā)現(xiàn),采用對使用大位寬總線RAM的時鐘信號進行約束的方法非常有效。具體實現(xiàn)跟FPGA外圍管腳時鐘信號約束的方法一樣,比如下圖中在vivado工具中可以對設計中內部某個用到大位寬的RAM的時鐘進行創(chuàng)建即可。

abd9c268-eb92-11ed-90ce-dac502259ad0.jpg

總結:大位寬的數據總線需要保持數據傳輸過程中時延的一致性,盡可能的多采用時序邏輯,同時對于大位寬RAM的時鐘要進行約束。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1624

    文章

    21538

    瀏覽量

    600475
  • 收發(fā)器
    +關注

    關注

    10

    文章

    3350

    瀏覽量

    105730
  • Vivado
    +關注

    關注

    19

    文章

    799

    瀏覽量

    66129
收藏 人收藏

    評論

    相關推薦

    fpga時序分析案例 調試FPGA經驗總結

    今天跟大家分享的內容很重要,也是調試FPGA經驗總結。隨著FPGA時序和性能的要求越來越高,
    的頭像 發(fā)表于 08-01 09:18 ?1591次閱讀
    <b class='flag-5'>fpga</b><b class='flag-5'>時序</b>分析案例 <b class='flag-5'>調試</b><b class='flag-5'>FPGA</b><b class='flag-5'>經驗總結</b>

    msp430學習經驗總結

    最高段頻率,此時不能用MODx作為頻率調整。2、BCSCTL1:基礎時鐘系統(tǒng)控制寄存器1學習經驗總結】" alt="[轉載]【msp430 學習經驗
    發(fā)表于 08-08 18:04

    調試FRAM經驗總結

    調試FRAM經驗總結:1、跑完FRAM讀寫代碼之后,邏分儀發(fā)現(xiàn)總線上只有簡單、短暫的電平變化,明顯不是SPI的通信數據。(經提醒發(fā)現(xiàn)連片選拉高拉低都沒有執(zhí)行到位)后來發(fā)現(xiàn)是因為片選引腳沒有初始化
    發(fā)表于 03-02 06:51

    SOPC Builder/Nios 學習經驗總結

    SOPC Builder/Nios 學習經驗總結
    發(fā)表于 07-22 15:32 ?0次下載
    SOPC Builder/Nios 學習<b class='flag-5'>經驗總結</b>

    空調維修的經驗總結

    空調維修的經驗總結 一、空調信號(控制)變壓器損壞后會引起整機不工作。 志柜式空調器,采用220V供電,插上電源后,電源指
    發(fā)表于 10-19 09:18 ?3257次閱讀

    線圈天線設計經驗總結

    線圈天線設計經驗總結
    發(fā)表于 09-12 17:21 ?224次下載

    做四軸飛行器的經驗總結

    做四軸飛行器的經驗總結,請各位大神共同學習,里面是一位大神做四軸飛行器的經驗總結
    發(fā)表于 11-11 16:52 ?0次下載

    開關電源測量的經驗總結

    開關電源測量的經驗總結,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 17:34 ?0次下載

    模擬電路設計經驗總結

    模擬電子的相關知識學習教材資料——模擬電路設計經驗總結
    發(fā)表于 09-27 15:19 ?0次下載

    指針經驗總結

    指針經驗總結
    發(fā)表于 10-27 15:44 ?19次下載
    指針<b class='flag-5'>經驗總結</b>

    TD-LTE網絡優(yōu)化經驗總結解析

    TD-LTE網絡優(yōu)化經驗總結解析說明。
    發(fā)表于 04-27 10:30 ?23次下載

    電路設計的一些經驗總結

    電路設計的一些經驗總結
    發(fā)表于 12-02 13:57 ?42次下載

    EMI整改經驗總結

    EMI整改經驗總結
    發(fā)表于 12-20 15:55 ?45次下載

    FPGA時鐘頻率時序問題調試經驗總結

    隨著FPGA時序和性能的要求越來越高,高頻率大位的設計越來越多。在調試這些
    發(fā)表于 05-06 09:33 ?942次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>時鐘</b><b class='flag-5'>頻率</b><b class='flag-5'>時序</b>問題<b class='flag-5'>調試</b><b class='flag-5'>經驗總結</b>

    選擇燒結銀的經驗總結

    選擇燒結銀的經驗總結
    的頭像 發(fā)表于 12-17 15:46 ?1198次閱讀
    選擇燒結銀的<b class='flag-5'>經驗總結</b>