FPGA設計的用戶約束
文章目錄
- FPGA設計的用戶約束
- FPGA設計的用戶約束
- 綜合約束
- 管腳約束
- 位置約束
- 時序約束
- 小總結
FPGA設計的用戶約束
至此,HDL到門級網表的轉化已經完成,對于編譯器來說,下一步的任務就是要將門級網表轉換并映射到具體的FPGA硬件資源中去。不過在編譯器開始這一項任務之前,我們必須得提出一些我們對FPGA設計的要求,因為畢竟編譯器跟我們是沒有什么心靈感應的,所以有些事你不說編譯器怎么知道呢?
簡單地說,我們將我們的想法寫入到一個文件當中,然后把這個文件交給編譯器,這樣編譯器就可以參考我們的需求來實現最終的FPGA設計了,而這個文件就叫用戶約束文件。注意,編譯器僅僅是參考我們的需求,并不會保證最終的結果一定達到我們的預期,這主要有兩方面原因:
- 編譯器向來是量力而行的;
- 我們的需求有些時候可能不太現實。
因此,如果最終的結果并不能讓人滿意,通常的做法是返回到FPGA設計方案的制定或FPGA功能代碼的編寫環節進行修改,而不是去加大編譯器在布局布線時的努力程度。
綜合約束
其實這一工作應該是在FPGA功能代碼編寫與FPGA頂層模塊的門級仿真環節之間完成的,放在這里講是為了避免章節過于分散。綜合約束的作用顧名思義是用來指導編譯器如何將HDL代碼轉換為門級網表的,它有三種主要表現形式:
- 編譯器的綜合工具配置選項;
- 嵌入代碼中的約束語句;
- 專門的綜合約束文件。
通常來說,編譯器已經預先設置好了一套默認的綜合工具配置選項,幾乎能夠應對絕大多數綜合任務。當然了,如果有特殊需要,可以進行一些調整。而嵌入代碼中的約束語句使用起來更加靈活、方便,對于綜合的約束性更加得細節和具體,例如可以針對代碼中某一個變量進行約束,不像綜合選項的作用域是整個FPGA設計。如果覺得嵌入代碼中的約束語句過于凌亂,不好管理和維護,那么也可以將這些語句集中寫在一個約束文件中,只不過此時需要指明被約束對象的層次化絕對路徑。
管腳約束
不和外界交互的FPGA設計是沒有任何存在意義的,因此,我們必須要為FPGA設計指定好具體的管腳約束信息。管腳約束主要完成兩件事情:
- 將FPGA設計中的輸入、輸出以及雙向端口和FPGA芯片的物理I/O管腳之間建立好一一對應的連接關系。通常情況下,FPGA設計中的端口數不能大于FPGA芯片所提供的物理I/O管腳數,否則無法分配成功。
- 為每一個已分配的物理I/O管腳指定特定的接口電平,從而使得設計能夠正確地跟外圍電路進行電信號交互通信,例如LVTTL、LVCMOS、LVDS等接口電平形式。
位置約束
位置約束主要影響的是編譯器如何將轉換后的資源網表布局到實際的FPGA芯片中。由于FPGA中有非常多的邏輯資源塊、BLOCK RAM、DSP核等等,并且這些資源是均勻分布在整個FPGA芯片當中的,如果我們對這些資源的使用有特殊的要求,例如某個邏輯必須使用FPGA芯片中最左上角的邏輯資源塊來實現,那么就需要編寫相應的位置約束。當然,位置約束的功能并不僅限于此。
時序約束
時序約束是我們對FPGA設計在時間性能指標上的期望,例如時鐘頻率要求、時間差要求以及各類時間參數指標要求等。當編譯器將資源網表布局到FPGA芯片當中并完成連線操作的時候,如果我們為其制定了時序約束,那么編譯器就會考慮到我們的需求來進行布局布線,這是因為布局布線會影響到線延遲的時間參數。因此,時序約束雖然不直接指明對布局布線的要求,但是它卻間接地對布局布線產生重大的影響。
以上四類約束中,除了綜合約束外,其余三個統稱為布局布線約束,因為它們都直接或間接地影響到同一個FPGA設計在FPGA芯片中的布局布線形式。也正是因為如此,布局布線約束方面的工作都是在門級網表生成后且后續轉換尚未開始前完成的。
小總結
- 用戶約束文件是將設計要求傳達給編譯器的重要工具,但編譯器僅會參考這些要求,最終結果可能因編譯器能力和需求合理性而有所不同。
- 綜合約束、管腳約束、位置約束和時序約束是FPGA設計中常見的約束類型,其中綜合約束主要影響HDL代碼到門級網表的轉換,而其他三種約束則屬于布局布線約束,直接影響FPGA芯片的布局布線。
- 布局布線約束的工作通常在門級網表生成后進行,以確保設計能夠在FPGA硬件上正確實現。