FPGA之道(18)FPGA設計的編譯過程(FPGA編譯步驟)

      網友投稿 2359 2025-03-31

      文章目錄

      前言

      FPGA設計的實現過程

      編譯概述

      編譯流程之綜合

      綜合的輸入

      HDL代碼

      綜合設置

      綜合的輸出

      綜合的工具

      編譯流程之翻譯融合

      翻譯融合的輸入

      翻譯融合的輸出

      翻譯融合工具

      編譯流程之映射

      映射的輸入

      映射的輸出

      映射工具

      編譯流程之布局布線

      布局布線的輸入

      布局布線的輸出

      布局布線工具

      編譯流程之配置生成

      配置生成的輸入

      配置生成的輸出

      配置生成工具

      前言

      這里所謂的FPGA設計的實現過程不是說等價于Implementation,而是整個FPGA設計從設計的描述、編譯到最終配置文件形成的一整套過程。

      下面根據《FPGA之道》的描述來看這個過程。

      FPGA設計的實現過程

      在FPGA頂層模塊的門級仿真環節之前,甚至更早,編譯器就介入到了FPGA項目的開發工作之中。前面介紹的所有環節,主要是為了保證HDL代碼以及約束文件的正確性、可行性,但是將HDL代碼和約束文件轉換為FPGA芯片上實際的數字電路,即FPGA設計的實現這一工作,都是由編譯器默默來完成。由此可見,FPGA項目的開發其實是人與編譯器協同作戰的一個過程。人常說,“不怕狼一樣的敵人,只怕豬一樣的隊友”,既然我們和編譯器是戰友,那么就要好好進行配合,可是不了解戰友的特點和脾性該怎么配合呢?之前,我們主要從自身的角度出發,來介紹FPGA項目的基本開發流程,那么現在通過本章節的學習,讓我們來好好認識一下我們的這位戰友——編譯器,從而為今后長期的協同作戰打好基礎。

      編譯概述

      雖說編譯器的主要工作就是將HDL代碼和約束文件轉換為FPGA芯片上的實際數字電路,但是這種轉換可不是一蹴而就的,事實上這是一個非常復雜且繁瑣的過程。憑心而論,在一個FPGA項目的開發中,編譯器的工作量遠比人類要大得多,如果按照編譯流程的先后順序來看,編譯器所做的工作大致可以概括為五大方面:綜合、翻譯融合、映射、布局布線和配置文件生成, 具體的工作內容我們將在接下來的小節中進行較為詳細的介紹。

      雖然編譯器在FPGA設計的開發過程中功不可沒,可是編譯器歸根到底也是軟件,而軟件都是人編寫的,人又總是會犯錯的,因此即使經歷了N多個版本的升級,“小強”的生命力仍然相當的頑強,因此編譯器軟件中都多多少少會有一些BUG存在。除此以外,編譯器有時也是比較懶惰、比較笨的,有些時候,它做一定次數的嘗試后就會放棄,有時候它給出的結果也并不優秀(雖然它在不斷地對設計進行優化)。因此,為了能夠讓編譯器發揮更好的作用,我們能做的就是要盡量編寫規范的代碼,設計合理的結構等等,這就好比你寫的代碼像劉翔一樣出色,那么即使沒有一雙好的跑鞋,拿到亞洲冠軍也易如反掌。總之作為FPGA開發者來說,能做多好就做多好,這樣可以盡可能降低編譯器的工作難度,如果再適時地給編譯器一些恰當的指導和建議(通過約束),就可以打造出優秀的FPGA設計。

      編譯流程之綜合

      綜合是編譯流程中的第一個環節,編譯器在這一環節將我們的FPGA設計轉換為門級網表。

      綜合的輸入主要包括HDL代碼、綜合設置、器件型號等,分別介紹如下:

      HDL代碼基本上就是全部的待轉化的FPGA設計,當然FPGA設計也可以包含一些圖形化的文件。說“基本上”,是因為對于一些使用了IP核的FPGA設計來說,如果這些IP核是硬核或者固核,那么它們本身就是門級網表或者資源網表,所以是不會也不需要被綜合的。而如果這些IP核是軟核,那么它們的表現形式可能也是HDL代碼,因此也是綜合輸入的一部分。

      綜合設置是編譯器綜合FPGA設計時的指導信息,這對整個綜合過程是必不可少的。編譯器通常會采用默認的綜合設置來進行綜合,但有時候我們需要編譯器在綜合的時候能考慮一下FPGA設計的特點以及一些現實情況,這時就需要人工的去修改綜合設置,下面就介紹幾種人工干預綜合的方法。

      修改編譯策略

      一般來說,可選的編譯策略包括:speed、area、power optimization、minimum runtime、balance等,我們可以根據項目實際需要來做出選擇。各種策略介紹如下:

      speed:速度優先策略。表示在綜合的時候優先考慮FPGA設計的速度性能,選擇該策略可以保證綜合出來的門級網表在最終實現為電路的時候更容易工作在較高的時鐘頻率下。一般在時序分析環節發現最大時鐘頻率小于需求的時候,可以通過選擇該綜合策略進行嘗試。

      area:面積優先策略。表示在綜合的時候優先考慮用最少的資源辦最大的事情,選擇該策略可以保證綜合出來的門級網表在最終實現為電路的時候更容易占用較少的硬件資源。一般當發現FPGA設計占用的資源已經超出了所選FPGA芯片的資源數量時,可以通過選擇該綜合策略進行嘗試。

      power optimization:功耗最優策略。表示在綜合的時候優先考慮減少FPGA芯片的功耗,選擇該策略可以保證綜合出來的門級網表在最終實現為電路的時候更容易產生較少的熱量。一般當發現FPGA芯片在工作中溫度過高的時候,可以通過選擇該綜合策略進行嘗試。

      minimum runtime:最短時間策略。表示編譯器在綜合的時候花費最少的時間。編譯流程中的任一環節都是需要消耗時間的,我們可以推測,當選用這一策略時,編譯器處于最懶的狀態。通常如果你的電腦不是太古董的話,不建議選擇這一策略。

      balance:折中綜合策略。表示在綜合的時候兼顧考慮速度、面積、功耗等等各面因素,這也是編譯器通常默認的綜合策略,不過按照這個策略綜合出來的門級網表在速度、面積、功耗等幾方面都只能做到馬馬虎虎的水平。尤其是面積和速度這一對水火不容的指標,更是“魚與熊掌不可兼得”.

      修改一般綜合選項

      一般綜合選項有很多,相比于編譯策略,這是稍微細節一些的綜合設置,這里列舉幾個有代表性的綜合選項供大家參考:

      keep hierarchy:保留層級選項。在編寫HDL代碼的時候,為了功能強大、思路清晰、便于理解和修改等等原因,我們推薦大家使用層次化、模塊化的設計思想來編寫HDL,可是FPGA芯片上面的資源并不會按照HDL中的層級結構來進行組織,所以綜合后的門級網表也沒有必要保留這種層級結構。不過,有些時候,出于一些特殊的目的,我們希望綜合出來的網表保留HDL代碼中的層級結構,這時候就需要勾選該綜合選項。

      read core:讀核選項。該選項主要是針對IP核的,如果不選中,則把IP當做黑盒來處理,否則在綜合的時候可以提取IP核中的一些時間、資源等信息。

      synthesis constraints file:綜合約束文件選項。無論是綜合策略還是綜合選項,都太過概括,因為它們都針對全局。有些時候我們需要更具體一點、更靈活一點的綜合設置,這時候就可以使用綜合約束文件,來自行進行綜合約束信息編寫。需要注意,除了利用綜合約束文件之外,我們還可以通過在HDL代碼中嵌入綜合約束信息來達到約束綜合的效果。

      修改HDL綜合選項

      由于HDL代碼是FPGA設計的主要載體,因此專門針對HDL代碼的綜合就有很多的配置選項。這里選擇一些比較有代表性的介紹如下:

      狀態機的相關選項:包括狀態機中狀態的編碼方式選擇,例如auto、one-hot、gray等等,默認一般是auto;是否實現安全的狀態機,即當出現錯誤狀態時是否會自動跳回到正常狀態,默認是no,因為這部分功能需要消耗更多的資源;狀態的實現方式,RAM或LUT;等等。

      存儲器相關選項:包括是否可以通過HDL代碼推斷并提取出RAM或ROM;用什么資源方式來實現RAM或ROM功能,block或distribute;等等。

      復用器相關選項:包括是否可以通過HDL代碼推斷并提取出MUX;用什么復用器資源來實現MUX;等等。

      解碼器相關選項:包括是否可以通過HDL代碼推斷并提取出解碼器;是否提取優先級解碼器;等等。

      寄存器相關選項:包括是否可以通過HDL代碼推斷并提取出移位寄存器;是否提取邏輯移位寄存器;等等。

      其他選項:是否合并級聯異或門;是否允許資源共享;是否允許使用DSP單元;等等。

      修改特殊綜合選項

      綜合過程中,還有一些比較特殊的綜合選項。例如:

      是否允許在門級網表中添加I/O Buffer,默認是允許的,因為一般來說所綜合的代碼就是最終需要在FPGA芯片上實現的設計,所以肯定需要借助I/O Buffer來和外界交互,但是如果僅僅是想將當前設計做成一個類似IP核的網表結構,那么肯定是不希望引入I/O Buffer的。

      信號的最大扇出控制,即允許內部的一個輸出信號所能直接驅動的接收源的個數。對于FPGA芯片來說,可能由于工藝上等等的原因,一般一個內部輸出信號的驅動能力是有限的,因此驅動的接收源越多,可能延遲就越大,且由于對地電阻并聯的效果,還可能會減弱驅動能力,而通過設置最大扇出的數量,如果FPGA內部有超過這個數量限制的接收源,那么就必須通過內插緩沖器的方法來滿足接收源的需要,這樣也就間接提高了內部輸出信號的驅動能力。

      是否允許寄存器復制,等效寄存器合并。這是兩個完全相反的操作,但是各有用處,其中,寄存器的復制,對于提高設計的速度以及增強寄存器輸出的驅動能力都很有好處;而寄存器的合并,能夠有效的幫助我們優化FPGA設計的資源占用量,尤其是當HDL代碼中的冗余度比較高時,該選項能夠有效的節省FPGA資源。因此默認情況下,這兩個選項都是打開的。

      寄存器平衡選項。這是一個很強大的功能,它在完全不改變FPGA設計整體功能的前提下,通過重新分配寄存器前后的組合邏輯規模,使設計達到更高的時鐘運行速度。寄存器平衡功能又叫retiming,默認情況下為關閉,因為開啟該功能會導致編譯器工作量急劇增大,從而急劇的增加了綜合所消耗的時間。

      以上介紹的還只是綜合設置的一部分,我們可以看出其中有一部分就是純粹用于對FPGA設計進行優化的,例如我們剛剛介紹的寄存器平衡功能。其實只要我們根據時序分析的結果對HDL代碼進行正確的修改也可以達到近似的效果,這樣不僅我們的HDL代碼更加完善了,也極大的減輕了編譯器的工作量,豈不是一舉兩得?這就是為什么在【編譯概述】小節勸大家不要過分依賴編譯器,自己能做多好就做多好。

      器件型號

      器件型號其實是個不太重要的輸入,因為綜合階段是實現無關的,還不需要了解太多所使用的FPGA芯片的相關信息。不過在對設計的資源進行評估的時候,倒是需要根據所選器件初步估計出資源的占用率等。

      綜合的輸出主要包括兩大部分:RTL門級網表和綜合報告,分別介紹如下:

      1

      RTL門級網表

      RTL是Register Transfer Level的簡稱,因此RTL門級網表又叫寄存器傳輸級網表。這里的RTL門級網表就是FPGA基本開發流程中FPGA頂層模塊的門級仿真環節用到的那個門級網表,它就是FPGA設計對應的與、或、非等門電路單元的表達,由此我們可以推斷,如果在編寫HDL代碼的時候僅僅通過調用最基本的與、或、非等門電路來實現FPGA設計,那么就基本相當于人工的完成了綜合的工作。其實事實也基本如此,如果用HDL代碼來表示門級網表的話,那么其就相當于只有基本門電路例化語句的HDL代碼。

      例如,如果我們在HDL代碼中描述了一個與邏輯:輸出c等于輸入a和輸入b的邏輯與,那么綜合出來的門級網表對應的數字電路形式大致如下:

      當然了由于FPGA主要是基于查找表而非邏輯門的,因此從工藝上來說,該門級網表的形式最終可能如下:

      其中LUT2_8的意思是指這是一個兩輸入的查找表,查找表中存儲的數值為“8”,用4位二進制形式來表示,即為“1000”,正好符合兩輸入與門的真值表。

      綜合報告

      綜合報告中包含了綜合過程中輸出的一些關鍵信息,而其中最主要的內容包括錯誤信息、警告信息和資源占用量信息。分別介紹如下:

      錯誤信息

      出現了錯誤信息,表明綜合過程失敗,比較常見的原因是HDL代碼中一些語法類的錯誤。為了繼續FPGA的編譯過程,我們必須根據報告內容將它們清除干凈。

      警告信息

      出現了警告信息,表明編譯器碰到一些不太確定的情況,或者編譯器在未經我們允許的情況下進行了一些處理。雖然警告信息并不會導致綜合的失敗,但是請一定不要忽視,建議的做法是逐條進行確認,看這些警告是否反映了一些設計的隱患。例如,警告信息會給出代碼中敏感量表信號缺失的補齊建議,如果不補全敏感量表,那么功能仿真的時候可就痛苦了。

      資源占用量信息

      資源占用量信息反映了綜合后門級網表大概需要使用當前FPGA芯片中多少硬件資源,雖然這和最終的資源占用量有稍許差距,但是足以用來作為設計參考,進行設計質量評估。一般來說,當資源占用率小于70%的時候,編譯器能比較輕松的將門級網表成功的轉換為最終的FPGA數字電路。因此,盡量在綜合環節就利用綜合報告的資源占用信息來優化FPGA設計的資源占用量,從而為后續編譯環節提供便利。

      編譯器在完成綜合工作的時候需要使用綜合工具。通常各大FPGA廠商都會在自己的FPGA軟件集成開發環境中集成一個綜合工具,例如Xilinx公司的XST。還是那句話,樣樣行不一定樣樣精,業內有一些專門的公司從事綜合工具的開發,例如,Synplicity公司的synplify/synplifyPro、Synopsis公司的FPGA Compiler、MentorGraphic公司的Leonardo Spectrum等。一般說來,對于同樣的HDL代碼,這些專業的綜合工具綜合出的門級網表更加的高效,能夠使用較少的資源實現較好的速度性能。由于各個綜合工具的能力和側重點有所不同,如果HDL代碼書寫不規范、結構不合理,很可能導致代碼對編譯器有所選擇,即有的編譯器綜合出來的門級網表不能正常工作。因此還是那句話,為了減弱HDL代碼對編譯器的依賴性,在編寫HDL代碼的時候能做多好就做多好!

      編譯流程之翻譯融合

      翻譯融合是編譯流程中的第二個環節,編譯器在這一環節將輸入的門級網表和約束信息轉換為后續作業工具所能識別的邏輯連接。除此以外,編譯器在這一環節還將給出FPGA設計的頂層門級網表,因此,位置約束、時序約束等FPGA設計中的用戶約束都必須在翻譯融合環節之后才能進行設置。

      翻譯融合的輸入主要包括RTL門級網表、翻譯融合設置、器件型號等等,分別介紹如下:

      1

      RTL門級網表

      翻譯融合環節中,使用到的RTL門級網表可以有兩個來源,即綜合后門級網表和IP核門級網表,一般來說,FPGA設計中會同時包括這兩種門級網表,分別介紹如下:

      綜合后門級網表

      綜合后門級網表是綜合環節的直接輸出,例如,如果我們是用HDL代碼來進行FPGA設計,那么綜合后門級網表就是編譯器將HDL代碼綜合后的產物。如果該門級網表還伴隨有相應的約束文件,也需要一并進行處理。

      IP核門級網表

      我們在進行FPGA設計的時候,不一定、不太可能、也沒有必要完全自己用HDL代碼實現所有的功能部分,因為各個相關廠商都會或多或少的提供一些通用或專用、收費或免費的IP核,例如我們最常用FIFO其實就是一個IP核。當我們使用的IP核是硬核或者固核的時候(詳細信息請參閱【知己知彼篇->IP核介紹->IP核概述】小節),由于IP核提供的不是HDL代碼,而是RTL門級網表和相關約束信息,因此綜合環節不會也無法對這類IP核進行任何處理,相關的工作將交由翻譯融合環節來完成。通常來說,IP核的門級網表還常常伴有相關的約束文件存在,甚至它們本身就是合二為一的,這個也需要交由翻譯融合環節來進行處理。

      翻譯融合設置

      翻譯融合設置是編譯器對FPGA設計進行翻譯融合時的指導信息,這對整個翻譯融合過程來說是必不可少的。在翻譯融合環節,編譯器通常會采用默認的翻譯融合設置來進行作業,并且會繼承綜合環節中所確定的編譯策略,不過有時候我們需要編譯器在翻譯融合的時候能考慮一些實際的情況,這時就需要人工的去修改翻譯融合設置,下面就簡單介紹幾種翻譯融合設置選項供大家了解。

      Macro Search Path:參考路徑設置選項。該選項為編譯器添加或指定了網表文件的查找路徑,一般當描述IP核功能的網表文件不在工程目錄下的時候需要進行手動指定。

      Allow Unmatched LOC Constants:允許不匹配引腳約束選項。該選項指定是否允許輸入的門級網表的端口名與用戶管腳約束中的名稱出現不一致。默認情況下該選項是false,如果編譯器在翻譯融合發現有不一致的情況,將會報告錯誤從而停止整個編譯工作,但是當我們只完成了工程的一部分時,如果想通過后續的一些流程對已完成的工作進行一些測試或調試時,就需要將該選項設置為true。

      器件型號

      器件型號其實是個不太重要的輸入,因為翻譯融合階段也基本上是實現無關的,還不需要了解太多所使用的FPGA芯片的相關信息。需要注意的是,器件型號的輸入可以直接從綜合環節進行繼承,當然了,如果有綜合環節的話,之所以這么講,是因為在某些直接調用門級網表開始進行設計實現的工程中是沒有綜合環節的。

      翻譯融合的輸出主要包括頂層可識別門級網表、翻譯融合報告等等,分別介紹如下:

      1

      頂層可識別門級網表

      雖然仍然是門級網表,但是翻譯融合環節輸出的門級網表具有兩個關鍵字——“頂層”和“可識別”,分別解釋如下:

      “頂層”關鍵字是為了突出門級網表文件的覆蓋范圍,即翻譯融合環節輸出的門級網表承載的一定是整個FPGA設計的功能。這點可以通過和綜合環節的對比來看出,例如,當FPGA設計中使用到了硬核或固核的IP核時,綜合環節輸出的門級網表是不包括相應IP核的功能的,這個時候,就需要翻譯融合環節來將綜合后門級網表與IP核門級網表進行融合,從而形成一個能代表整個FPGA設計功能的門級網表,這也是翻譯融合環節名稱中關鍵字“融合”的由來。

      “可識別”關鍵字是相對于對FPGA廠商來說的,因為經過綜合后的門級網表其實是一個比較通用的門級網表,但是各個FPGA芯片的生產廠商之間誰也不服誰,各有各的想法。這就好比你有一本《如來神掌》,可是想學的人中有的講日語,有的講韓語,有的講印度語,還有一些講俄語,這可怎么辦?那么你只有高薪聘請幾個位于牛A與牛C之間的翻譯,將這本《如來神掌》分別翻譯為《如來雅滅掌》、《如來思密達掌》、《阿三來神掌》以及《如來司機神掌》才行。例如對于Xilinx的編譯器,綜合后的門級網表中兩輸入查找表名為LUT2,但是為了讓后續流程能夠讀懂,翻譯融合環節將其翻譯為X_LUT2,這是一個Xilinx可以識別的基本邏輯單元,這也是為什么綜合后仿真模型與翻譯融合后仿真模型的門級網表代碼中所基于的庫是不一樣的。上述原因也是翻譯融合環節名稱中關鍵字“翻譯”的由來。

      翻譯融合報告

      翻譯融合環節也會輸出一份報告,其中包括了對FPGA設計進行翻譯融合過程中的一些詳細信息,其中也包括錯誤信息和警告信息,當出現這兩種信息的時候,需要認真處理。

      由于翻譯融合環節是針對具體的FPGA芯片生產廠商的,因此一般來說,用哪個公司的芯片,就用哪個公司的翻譯融合工具。通常各個FPGA廠商推出的軟件集成開發環境中都會自動集成這樣一個工具。

      1

      編譯流程之映射

      映射是編譯流程中的第三個環節,編譯器在這一環節將我們的FPGA設計用具體的FPGA芯片中的各種資源來表示。

      1

      映射的輸入主要包括頂層門級網表、映射設置、器件型號、位置約束、時序約束、管腳約束等,分別介紹如下:

      1

      頂層可識別門級網表

      頂層可識別門級網表是翻譯融合環節的直接輸出,它是映射環節的主體輸入,包含了FPGA設計的全部功能信息與基本邏輯實現。

      映射設置

      映射設置是編譯器映射FPGA設計時的指導信息,這對整個映射過程是必不可少的。在映射環節,編譯器通常會采用默認的映射設置來進行作業,并且會繼承綜合環節中所確定的編譯策略,不過有時候我們需要編譯器在映射的時候能考慮一些實際的情況,這時就需要人工的去修改映射設置,下面就簡單介紹幾種映射設置選項供大家了解。

      Ignore User Timing Constrains:忽略用戶時序約束選項。該選項是指定在映射過程中是否可以忽略用戶輸入的時序約束信息,一般來說是不應該忽略的,但有時候我們想看一下FPGA設計大致占用芯片中多少資源時,忽略用戶的時序約束信息可以加速映射的過程,節約一定的時間。

      Trim Unconnected Signals:刪除無連接信號選項。一般來說,縱使你在HDL代碼中把某一功能描述的多么風起云涌、神乎其神,只要該功能不直接或間接影響任何FPGA物理端口的輸出,那么這就是一個無意義的功能,編譯器一般會將該功能的所有電路全部刪除掉。通常這種做法是非常正確的,但有時候設計只完成了一部分,如果此時想看一下映射后的資源占用情況,為了防止很多功能由于沒有連接到輸出端口而被優化掉, 就可以通過將該選項設置為false即可。

      Generate Detailed Map Report:產生詳細映射報告選項。由于映射過程中的細節非常之多,一般編譯器只是篩選出其中比較重要的一些信息來組成映射報告,如果需要了解更多、更詳細的信息,請選中該選項。

      Pack I/O Registers/Latchs into IOB:使用接口資源中的寄存器選項。默認情況下是fasle,如果對接口的時序要求比較高,那么可以設置該選項為true,這樣就可以保證從寄存器到FPGA物理管腳之間的延時最短。為了做到更加細節、更加有針對性的這類約束,更為通常的做法是在HDL代碼中嵌入相關的約束信息。具體的做法請參閱【程序設計篇->編程思路->代碼中的約束信息->HDL中的常用約束示例->寄存器的相關約束】小節。

      器件型號

      映射環節是與具體的FPGA芯片型號息息相關的,因為它需要利用具體的FPGA芯片中的各種資源來實現頂層可識別門級網表的功能。通常來說,映射環節直接繼承前面流程中的器件型號,并根據這個具體的型號完成對FPGA設計的映射工作并給出相關資源占用率報告。

      位置約束

      在映射的過程中,編譯器其實也順便完成了對FPGA芯片的布局工作,因此位置約束必須在映射開始前就輸入。不過這個布局不一定就是最終的布局,但是由于結合了編譯策略和相關約束選項,因此布局的效果已經不錯了。

      時序約束

      時序約束主要是針對布局布線環節的,但在映射環節中就必須輸入它,因為對于映射環節來說它也有兩個不可小視的作用,分別介紹如下:

      一、指導映射過程。為什么時序約束會影響到映射工作的行為呢,這又要從三個方面來講:第一,不同的資源時間延遲參數不一樣,例如用DSP實現乘法器就要比用查找表等資源實現的乘法器在速度要快得多,當我們沒有強制指定某一個乘法器的實現思路時,編譯器就會根據時序約束信息來做出這種實現選擇。第二,由于FPGA芯片內部不同的資源所處的位置有所不同,因此你將一個存儲功能模塊映射為BLOCK RAM還是LUT,也或多或少的限定了最終的布局,從而或多或少的受時序約束的影響。第三,映射的結果本來就跟布局工作息息相關,并且事實上還會順便完成一次布局工作,而時序約束則是布局過程的一個指導。

      二、產生映射后時序分析報告。在【本篇->FPGA設計的時序分析】章節中,我們介紹過時序分析的分類,其中有一類叫做映射后時序分析,如果希望自己的FPGA設計能夠順利通過這類時序分析,必須通過時序約束來約束映射的行為。同時,如果使用編譯器自帶的時序分析工具,時序約束也是轉換為時序要求的依據。

      管腳約束

      管腳約束是將FPGA設計中的端口對應到FPGA芯片物理管腳的約束,我們可以在編譯的最開始就對設計進行管腳約束設置,不過對于綜合、翻譯融合環節來說管腳約束只是一個可選項,因為這兩個環節的工作并不涉及到任何關于具體FPGA芯片的細節,之所以可以在此之前就做管腳約束設置,是因為從HDL代碼到各環節門級網表,FPGA設計端口的數目和形式并不會發生改變(名稱可能會有略微改變)。

      管腳約束主要還是針對映射和布局布線環節的,由于映射環節也會順便完成一次布局工作,因此使用哪些FPGA的物理管腳對資源布局的位置非常重要,尤其是跟輸入輸出管腳相關的那些資源。除此以外,不同資源距離物理管腳的距離遠近是不同的,例如IOB中的寄存器到FPGA物理管腳的距離遠比內部邏輯資源塊中的寄存器到FPGA物理管腳的距離要近得多。因此映射的不同會影響到一些資源與FPGA物理管腳間的時間延遲信息,尤其是跟輸入輸出相關的那些資源。

      映射的輸出主要包括三大部分:頂層資源位置門級網表、門延時文件和映射報告,分別介紹如下:

      1

      頂層資源位置門級網表

      同樣是門級網表,但這里的關鍵字是“頂層”、“資源”和“位置”。“頂層”的意思與頂層可識別門級網表中的“頂層”一樣,這里就不再贅述,下面主要討論一下“資源”和“位置”這兩個關鍵字。

      對于FPGA芯片來說“資源”是什么?如果忘了請復習【知己知彼篇->FPGA內部資源介紹】章節。而對于不同的FPGA芯片來說,這些資源的具體形式也不一樣。例如有些FPGA芯片中的查找表是3輸入的,而另一些是4輸入、5輸入甚至6輸入的。那么針對當前項目所基于的這款具體的FPGA芯片,我們需要將頂層可識別門級網表中的那些功能用FPGA芯片中能夠提供的資源形式來表示,這一過程就是映射的過程,而輸出即為頂層資源門級網表。例如,針對Xilinx公司的Virtex5系列中的LX110子系列FPGA芯片,頂層可識別門級網表中的X_LUT2被映射成為一個X_LUT6,因為該系列的芯片中沒有2輸入的查找表資源,只有用一個6輸入的查找表資源來自降身價實現了。

      接下來來看一下“位置”關鍵字。前面說過,映射的過程順便完成了一次不錯的布局工作(前提是我們提供了比較完備的時序約束),那么布局后的位置信息是如何體現出來的呢?是直接在門級網表中體現的。例如,如果將上例中的X_LUT6在門級網表中描述翻譯成HDL代碼的話,以VHDL為例,類似如下所示:

      c1 : X_LUT6

      generic map(

      LOC => “SLICE_X46Y99”,

      INIT => X"FFFF000000000000"

      )

      FPGA之道(18)FPGA設計的編譯過程(FPGA編譯步驟)

      port map (

      ADR0 => VCC,

      ADR1 => VCC,

      ADR2 => VCC,

      ADR3 => VCC,

      ADR4 => a_INBUF_B,

      ADR5 => b_INBUF_B,

      O => c_OBUF_14

      );

      可以看到,其中第三行的LOC關鍵字就是對該資源的位置約束,也即布局信息。

      門延時文件

      既然映射環節輸出了頂層資源位置門級網表,那么這些具體的資源門單元的延時信息就可以得到,而這些延時信息的聚類就是映射后時序信息文件,由于映射并不涉及到具體的布線操作,因此該文件也叫門延時文件。可見無論是映射后的時序分析還是時序仿真工作,都是離不開這個門延時文件。需要說明一點,門延時文件中的內容跟FPGA芯片的具體型號息息相關,即使型號相同,也會由于芯片的速度等級不同而不同,具體信息可參閱【知己知彼篇->FPGA產品介紹->FPGA產品的速度等級簡介】小節。

      映射報告

      映射報告中包含了映射過程中輸出的一些關鍵信息,而其中最主要的內容包括錯誤信息、警告信息和資源占用量等信息,一定要注意閱讀。

      與翻譯融合工具類似,映射是完全針對具體的FPGA芯片所做,所以一般來說,用哪個公司的芯片,就用哪個公司的映射工具。通常各個FPGA廠商推出的軟件集成開發環境中都會自動集成這樣一個工具。

      1

      編譯流程之布局布線

      布局布線是編譯流程中的第四個環節,編譯器在這一環節將我們的FPGA設計完全轉化為FPGA芯片上的具體數字電路實現。

      布局布線的輸入主要包括頂層資源位置門級網表、布局布線設置、器件型號、管腳約束、時序約束等,分別介紹如下:

      頂層資源位置門級網表

      頂層資源位置門級網表是映射環節的直接輸出,它是布局布線環節的主體輸入,包含了FPGA設計的全部功能信息、基本邏輯實現與初步資源布局信息。

      布局布線設置

      布局布線設置是編譯器布局布線FPGA設計時的指導信息,這對整個布局布線過程是必不可少的。在布局布線環節,編譯器通常會采用默認的布局布線設置來進行作業,并且會繼承綜合環節中所確定的編譯策略,不過有時候我們需要編譯器在布局布線的時候能考慮一些實際的情況,這時就需要人工的去修改布局布線設置,下面就簡單介紹一些布局布線設置選項供大家參考。

      Place And Route Mode:布局布線模式選項。共有Route Only、Reentry Route、Multi Pass Place And Route三種模式。默認為Route Only模式,表示認為映射環節所做的布局已經可以接受了,因此在布局布線環節只進行布線工作;Reentry Route模式,表示可重入布線模式,即在自動布線開始后可以打斷布線器的工作,進行若干手動布線操作,然后再對剩下的部分重新進行自動布線。而Multi Pass Place And Route模式,表示多次布局布線嘗試模式,即,如果在當前的布局和設置下無法布出滿足時序等指標的連線,則可以嘗試重新調整布局后再次布線,其中嘗試次數可以由別的選項進行設置。

      Place And Route Effort Level:布局布線努力程度選項。共有Standard、Medium、High三個選項,默認為Standard,努力程度最低,如果選擇更高級別的努力程度,最終布局布線后的設計能達到時序等約束的要求的可能性就更大,但是布局布線工作所消耗的時間就越長。

      Ignore User Timing Constraints:忽略用戶約束選項。與在映射中的作用類似,該選項是指定在布局布線過程中是否可以忽略用戶輸入的時序約束信息。一般來說是不應該忽略的,但有時候我們想看一下FPGA設計大致占用芯片中多少資源時,忽略用戶的時序約束信息可以加速布局布線的過程,節約一定的時間。與映射環節相比,布局布線環節得到的資源占用情況更接近或者等于實際情況。

      Use Bonded I/Os:使用閑置I/O資源選項。該選項指定是否可以使用閑置的I/O資源來完成某些布局或布線工作,默認為不可以。

      Generate Asynchronous Delay Report:產生異步延時報告選項。該選項表示是否在布局布線報告中添加異步延時的分析信息,默認為不產生。

      Generate Clock Region Report:產生時鐘域報告選項。該選項表示是否在布局布線報告中添加時鐘域的分析信息,默認為不產生。

      Generate Post-Place And Route Static Timing Report:產生布局布線后時序分析報告選項。該選項表示是否在布局布線報告中添加布局布線后的靜態時序分析信息,默認為產生。

      Generate Post-Place And Route Simulation Model:產生布局布線后仿真模型選項。該選項表示是否生成布局布線后的仿真模型,默認為不產生。

      Number Of Place And Route Iterations:布局布線器嘗試次數選項。該選項針對布局布線模式中的Multi Pass Place And Route模式,表示嘗試次數。

      Number Of Results To Save:保存結果的次數選項。每次布局布線成功后都會產生一個結果文件,如果今后修改了設計,重新布局布線后則會產生一個新的結果文件,而本選項就是允許編譯器保存之前編譯成功結果的個數。例如該選項為3,則表示編譯器最多可以保存最近三次成功的布局布線結果。

      Power Reduction:功耗優化選項。該選項表示在布局布線的時候需要考慮減少最終電路的功耗,不過所謂“魚與熊掌不可兼得也”,這會對布局布線有不利影響,因此默認不選中。

      器件型號

      布局布線環節是與具體的FPGA芯片型號息息相關的,因為它需要利用具體的FPGA芯片中的各種資源(包括布線資源)來實現頂層資源門級網表的功能。通常來說,布局布線環節直接繼承前面流程中的器件型號,并根據這個具體的型號完成對FPGA設計的布局布線工作并給出最終的資源占用率等報告。

      管腳約束

      管腳約束就是一種布局信息,而布局信息又直接影響布線操作,因此管腳約束對于布局布線的工作來說非常重要。

      時序約束

      時序約束是主要針對布局布線環節的,因為布局從宏觀上決定時間延遲參數(離得遠的連線延遲肯定大),而布線則從細節上確定時間延遲參數(離得近的連線延遲不一定小)。我們可以用示波器的粗調與微調旋鈕來類比布局與布線對時間延遲參數的影響(雖然并不完全一樣),從而更加形象的理解布局布線與時間延遲的關系。

      最后多說一句,雖然時序約束對于映射與布局布線環節的工作非常重要,但是它并不是一個不可或缺的輸入選項,通常建議務必為每個FPGA設計編寫完備的時序約束,因為沒有時序約束就相當于時序約束極限松,因此布局器和布線器隨便怎么操作都能滿足要求,試問這么隨意得到的FPGA片上電路,其性能怎么能夠保證?

      布局布線的輸出主要包括四個方面:最終資源位置門級網表、布線信息、延遲文件和布局布線報告,分別介紹如下:

      最終資源位置門級網表

      同樣是門級網表,但這里的關鍵字是“最終”、“資源”和“位置”。“資源”和“位置”的意思與頂層資源位置門級網表中的“資源”、“位置”關鍵字一樣,這里就不再贅述,下面主要討論一下“最終”這個關鍵字。

      “最終”的必然是“頂層”的,因為如果不是“頂層”的,那么說明FPGA設計并沒有實現完畢,也就不可能是“最終”的。但是頂層資源位置門級網表僅僅是映射環節的輸出,由于在布局布線環節可能重新修改布局(當處于Multi Pass Place And Route模式),因此頂層資源位置門級網表中的位置信息未必等于布局布線后的門級網表中的位置信息。而經歷了布局布線環節后,FPGA芯片中的電路就完全固定了,因此該環節的輸出叫做最終資源位置門級網表。

      布線信息

      門級網表只能描述各個FPGA內部資源之間的連接關系,并不能反映出具體布線的方式與方法。這就好比畫電路板時,分為原理圖繪制和PCB繪制兩個環節,最終資源位置門級網表相當于具有位置信息的電路板原理圖,布線信息相當于沒有電子器件的電路板PCB。因此要想完好表述FPGA片上電路,最終資源位置門級網表與布線信息缺一不可。

      延時文件

      既然布局布線環節輸出了最終資源門級網表和布線信息,那么門延遲和線延遲的信息我們就都得到了,而這些信息的的聚類就是延時文件。延時文件是對FPGA設計進行布局布線后時序分析與時序仿真的前提條件,它與映射環節輸出的門延時文件一樣,內容跟FPGA芯片的具體型號息息相關,即使型號相同,也會由于芯片的速度等級不同而不同。

      布局布線報告

      布局布線報告中包含了布局布線過程中輸出的一些關鍵信息,而其中最主要的內容包括錯誤信息、警告信息、時序分析信息和資源占用量等信息,一定要注意閱讀和分析。

      與翻譯融合工具類似,布局布線是完全針對具體的FPGA芯片所做,所以一般來說,用哪個公司的芯片,就用哪個公司的布局布線工具。通常各個FPGA廠商推出的軟件集成開發環境中都會自動集成這樣一個工具。布局布線工具又可細分為布局器和布線器,其中布局器可用于映射與布局布線環節,而布線器主要用于布局布線環節。

      編譯流程之配置生成

      配置生成是編譯流程中的第五個環節,也是最后一個環節,編譯器在這一環節將我們的FPGA設計轉化FPGA芯片的配置文件。

      配置生成的輸入主要包括最終資源位置門級網表、布線信息、配置生成設置、器件型號等,分別介紹如下:

      最終資源位置門級網表

      最終資源位置門級網表是布局布線環節的直接輸出,主要包含了FPGA設計的資源信息以及資源位置信息。

      布線信息

      布線信息也是布局布線環節的直接輸出,主要包含了最終資源位置門級網表中各個資源之間的具體連線關系與方式。

      配置生成設置

      配置生成設置是編譯器生成FPGA配置文件時的指導信息,這對整個配置生成過程是必不可少的。在配置生成環節,建議采用默認的配置生成設置來進行作業,當然了,如果僅僅是想添加或刪除產生配置文件的種類,可以通過簡單勾選或去除一些配置生成的選項來實現,而對于一些像配置引腳的電阻上拉或下拉特性來說,還是不要輕易修改。

      器件型號

      配置生成環節是與具體的FPGA芯片型號息息相關的,因為通過載入配置文件就可以在FPGA芯片內部還原出布局布線環節給出的電路結構,從而實現FPGA設計對應的功能。通常來說,配置生成環節直接繼承前面流程中的器件型號,并根據這個具體的型號完成對FPGA設計的配置生成工作。

      配置生成的輸出主要包括兩大部分:配置文件和配置生成報告,分別介紹入下:

      配置文件

      同一個FPGA設計的配置文件一般不止一種,這是由FPGA芯片配置方法的多樣化而決定的,這其中包括配置接口的多樣化與配置方法的多樣化。例如:Altera公司的FPGA產品,使用JTAG接口進行配置的時候使用的是后綴名為*.sof的配置文件,而使用外部配置芯片的時候使用后綴名為*.pof的配置文件;Xilinx公司的FPGA產品,使用FLASH作為配置芯片時,使用后綴名為*.bit的配置文件,而使用PROM作為配置芯片的時候,使用后綴名為*.mcs的配置文件,等等。

      需要說明的一點是,對于某個固定的FPGA芯片型號來說,它的同一種配置文件的大小是固定的,無論FPGA設計的功能復雜還是簡單。這是因為我們可以將FPGA內部的所有資源信息(例如LUT的初始狀態)和布線信息看做是一個個不同的開關,我們可以通過控制開關的通斷來讓FPGA中的資源實現不同的功能或結構,因此,無論FPGA設計的功能如何,FPGA芯片中的開關總數是不會改變的,而配置文件就是用來描述各個開關的通斷狀態的,所以配置文件的大小僅僅跟FPGA芯片的型號有關,而與FPGA設計本身無關。之所以不同配置方法或配置接口的配置文件大小不一樣,是因為它們需要通過不同的表現形式讓使用它們的不同接口或通信協議能夠理解它們,這就和同樣的功能用VHDL描述和用Verilog描述最終的文件大小是不同的一樣。類似的例子還有《如來思密達掌》、《阿三來神掌》都是《如來神掌》的譯本,可是題目的字數卻不一樣。

      配置生成報告

      配置生成報告中包含了配置生成過程中輸出的一些信息,例如都生成了哪些類型的配置文件。通常來說能夠順利通過布局布線環節的FPGA設計不會在這一步出現錯誤和警告信息,因此該報告的重要性沒有前幾個環節報告的重要性大。

      與翻譯融合工具類似,配置生成是完全針對具體的FPGA芯片所做,所以一般來說,用哪個公司的芯片,就用哪個公司的配置生成工具。通常各個FPGA廠商推出的軟件集成開發環境中都會自動集成這樣一個工具。

      FPGA 硬件開發

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:輸入的數值全部變成圖形形狀(excel輸入數字變成圖形)
      下一篇:我12月份怎么找不到了(我去年12月)
      相關文章
      亚洲欧美日韩一区二区三区 | 亚洲日本VA午夜在线影院| 亚洲AV无码日韩AV无码导航| 亚洲国产成人九九综合| 亚洲乱码中文字幕综合234| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲风情亚Aⅴ在线发布| 久久精品国产亚洲av高清漫画| 亚洲精品无码av天堂| mm1313亚洲精品国产| 亚洲国产成人久久| 亚洲春色另类小说| 亚洲人成在线观看| 伊人久久大香线蕉亚洲五月天| 久久亚洲国产最新网站| 亚洲国产第一站精品蜜芽| 国产99久久亚洲综合精品| 亚洲国产高清视频在线观看| 亚洲国产夜色在线观看| 亚洲av无码片区一区二区三区| 精品亚洲成a人片在线观看| 99久久亚洲精品无码毛片| 亚洲精品第五页中文字幕| 久久精品7亚洲午夜a| 亚洲熟女一区二区三区| 亚洲人成网站在线观看青青| 亚洲av最新在线观看网址| 亚洲1区1区3区4区产品乱码芒果| 亚洲一区二区视频在线观看| 国产亚洲情侣一区二区无码AV| 狠狠综合久久综合88亚洲| 亚洲精品国精品久久99热一| 亚洲国产综合精品中文字幕| 久久国产成人亚洲精品影院| 亚洲国产成人乱码精品女人久久久不卡| 亚洲日韩精品无码专区加勒比☆| 亚洲另类无码专区首页| 国产一区二区三区亚洲综合| 国产亚洲av人片在线观看| 亚洲AV日韩AV永久无码绿巨人| 亚洲的天堂av无码|