題:
HDL可以編譯/合成什麼?
Jake
2020-05-05 03:59:03 UTC
view on stackexchange narkive permalink

我是一名軟件工程師。作為一名程序員,我對編譯器為我所做的事情有所了解,因為我已經手動編寫了對其輸出內容(例如程序集)的近似文本表示形式。要詳細了解輸出內容,我可以查看ELF / COFF / MachO規範(例如,將代碼轉換為文件的文件類型,結果可能會因語言而異)。為了弄清楚指令的編碼是什麼,我可以看一下處理器的指令手冊。這給了我足夠的信息來理解編譯器正在輸出的數據類型。它也給我帶來了諸如“如何檢查ELF文件的詳細信息”之類的問題的詞彙,並且該問題的格式相對正確。我也可以問“我如何看待我的編譯器生成的程序集”,這個問題的格式將正確。最終,由ELF文件指定的字節被放入內存,並且處理器按順序運行每條指令,並且我了解了每條指令的語義。

對我來說,FPGA的等效步驟/問題完全不清楚。我不知道將Verilog或VHDL翻譯成什麼。我不知道FPGA使用的基本原語是什麼。我不知道該如何問像上面兩個格式正確的問題一樣的問題,因為我只是缺少要問的單詞。在這種情況下,可能存在等效的問題沒有任何意義,但目前我還無法知道。我所知道的是,我可以編寫一些Verilog,然後在模擬器或FPGA上運行它。

我寫了一些Verilog,然後將其合成為……某物?那是什麼東西我可以檢查的文件嗎?有沒有我可以查詢的標準格式?例如,如果我想自己編寫一個模擬器,模擬器將使用哪種格式?

然後,將合成輸出編程到FPGA上。FPGA使用什麼原語?如果這是嵌入式設備,則通常會將字節原始寫入閃存或某種存儲設備。FPGA是否具有等效功能?也許更抽象,更容易回答的問題是“在對FPGA進行編程時,寫入時會佔用多少字節?”

本來打算寫一個很長的答案,但我發現這樣做比我能解釋的要好得多。請注意,該處理流程特定於Xilins FPGA,但對於所有主要的FPGA供應商都是相似的。這3個主要步驟是:1)設計條目(編寫VHDL / Verilog代碼),2)綜合以及3)實現。其他兩個步驟是功能(邏輯)和時序仿真。時序仿真通常是最後一步。https://www.xilinx.com/support/documentation/sw_manuals/xilinx10/isehelp/ise_c_fpga_design_flow_overview.htm
通常,FPGA比特流的實際含義是FPGA製造商專有和秘密的,工程師只需擁有可以從不同級別的設計輸入中進行創建的工具,即可查看工具流程中某些早期至中期部分的輸出以及文檔關於如何使比特流進入芯片的信息。如果您想玩一個較低級別的遊戲,那麼極少數適度現代的選擇之一就是點陣iCE40,其比特流的含義已經足夠詳細地了解,從而可以使用開源工具鏈。
請注意,您可以通過將Verilog編譯到其他後端來編寫模擬器。看一下“ Verilator”,將其編譯為C。
七 答案:
The Photon
2020-05-05 04:28:39 UTC
view on stackexchange narkive permalink

就像過程編程語言要經過幾個步驟(編譯,彙編,鏈接)以生成可執行文件一樣,HDL必須經過多個過程才能生成FPGA的可用配置文件。其中包括

  • 綜合---將HDL代碼轉換為描述邏輯元素之間連接的網表。

  • 映射---將網表轉換為使用您FPGA設備上實際可用資源的更完善的網表。

  • 放置和路由---選擇設備上的哪些實際資源將用於映射器輸出中的每個必需元素,並選擇將使用哪些路由資源將它們互連。

  • 位文件生成---將場所和路線輸出轉換為實際用於對設備進行編程的格式。

因此,如果您問綜合的輸出是什麼,則表示此過程第一步的輸出是什麼,那麼它是用作映射器輸入的中間文件。如果您指的是整個過程的輸出,那是一個位文件,FPGA可以使用它來配置其所有邏輯和路由資源。

是否在某處使用了bitefile格式的解釋?就像我有一塊木板一樣,我怎麼知道什麼應該是位文件格式?
FPGA製造商的工程團隊必須在某處擁有此類文檔。但是AFAIK並不普遍與客戶共享。如果要對其進行逆向工程,則可以使用低級設計編輯器(至少使用Xilinx提供了這樣的工具)並對設計進行少量更改,然後查看它如何影響位文件。
我在檔案中的某個位置具有某些早期Xilinx器件(2000、3000系列)的位文件定義。但是它可能在5-1 / 4英寸的軟盤上。
-1
Spartan-6或de10的希望是什麼?
@Jake,如果您要編寫模擬器,則可能寧願看一下位置和路線輸出文件,也不願看位文件。
對於xilinx 7系列,它在其中一個使用指南的第5章中進行了詳細說明:https://www.xilinx.com/support/documentation/user_guides/ug470_7Series_Config.pdf看來該位文件只是一個寫入序列它可以控制FPGA配置寫控制器的寄存器。
其中包括Spartan 7,Spartan 6的相應文檔為:https://www.xilinx.com/support/documentation/user_guides/ug380.pdf
但是,這些等效於ELF規範。告訴您如何將內容加載到內存中,而不告訴您所加載數據的含義。
有一種標準(JEDEC)位文件格式(文件擴展名為.jed),儘管它最初出現在80年代http:// www,但仍在小型(通常是基於eeprom /閃存的基於)可編程設備(例如電源定序器)中普遍使用。.pldtool.com / pdf / jesd3c_jedecfmt.pdf
真棒的信息大家!這真的為我清除了一切。由於我在這裡只想做同樣的事情之前,所用軟件的開源性質。多麼不同的世界!
@Jake正在進行反向工程位流格式的各種工作,例如http://www.clifford.at/icestorm/(包括底部附近其他項目的鏈接)。icestorm特別具有易於閱讀的文檔,並且是“較簡單”的FPGA系列之一,因此相對容易掌握。
謝謝,這對我的理解很有幫助!這讓我想起了XOrg,並嘗試對NVidia GPU進行逆向工程。
MarkU
2020-05-05 07:34:06 UTC
view on stackexchange narkive permalink

Register傳輸邏輯(RTL)是第一個轉換階段的結果,它映射到特定於供應商的資源之前,這些資源在供應商之間甚至在同一供應商的不同FPGA之間都不可移植。本質上,RTL同時顯示組合邏輯和同步寄存器(D觸發器),因此狀態機是可識別的。 Altera和Xilinx之間的RTL非常一致,並且可能是最有趣和有用的檢查階段。綜合問題首先在RTL階段變得可見,並且設計仍然可以識別。一旦轉到了特定於供應商的映射,它就會被切碎和打亂。嘗試解碼特定於芯片的比特流是高成本,低收益的,並且當您轉移到同一系列中的不同供應商或什至大小不同的FPGA時將無用。您可以在RTL級別上看到所需的內容。

始終最好的做法是通過在測試平台或簡單的頂層模塊中實例化新開發的Verilog或VHDL代碼並檢查RTL代碼。 Xilinx ISE非常適合作為示意圖檢查RTL(儘管有時會遺漏一些東西)。最常見的問題是:

  • 用於總線的1位網絡
  • 優化器意外刪除了
  • 大量邏輯...類似於簡單的自旋鎖延遲循環被代碼優化靜默刪除的方式。
  • 由於程序方法而不是真值表方法,
  • 輸出未完全指定。如果工具認為輸出最終始終為0或始終為1,它將丟棄生成該結果的所有邏輯。
  • 修剪了
  • 模塊邏輯,因為其中一個子模塊已優化為始終為0或始終為1;可以一路攀升到最高水平

除非您使模塊小而簡單,否則此RTL檢查非常麻煩。使用測試平台是重要的工具。

我也首先來自嵌入式系統編程,其次來自verilog,對於像我們這樣的人,學習HDL編碼時最大的危險是看起來像是一種過程編程語言,並且 類似於過程編程語言(在仿真過程中),但是當您嘗試合成工作代碼時,一切都會崩潰。您確實必須考慮硬件的外觀,並確保RTL代碼包含所需的所有硬件。

除了Verilog / VHDL涉及在計算機文件中鍵入一些源代碼這一事實之外,它與傳統的C / C ++ / etc並沒有太多相似之處。您的編程經驗很少會轉移。專注於將大問題分解為小問題,詳細記錄所有內容,並編寫測試平台。如果您還沒有一個數字採樣示波器,也要投資。看一下opencores.org上發布的一些示例代碼,就像使用C / C ++一樣,您可以通過閱讀其他人的代碼來學習很多技巧(無論好壞)。

讓我對FPGA開發產生誤解的一件事是,源代碼控制並不是工具鏈供應商認為重要的功能。 Xilinx Vivado在這方面特別糟糕,他們的建議似乎是在進行新的簽出時從頭開始重新生成項目文件。嘗試使用100Mb +的zip文件進行項目交接令人生畏。

令我震驚的是FPGA開發的另一件事是Quartus / ISE / Vivado工具實際上沒有令人滿意的方式來消除大量的警告消息。當我編寫C / C ++程序時,我希望能夠單獨處理每條警告消息並加以修復或批准,以便最終獲得零警告的干淨編譯。從未真正見過有人在FPGA開發中實現這一目標。其他FPGA開發人員(比我更聰明)似乎只是接受一個正常的項目,其中包含許多診斷消息,而他們通常只是忽略這些診斷消息,而把它留給了實驗工作並在真實的硬件上進行了驗證。

如果您要開發自己的FPGA板(我不建議這樣做),請確保將未使用的I / O引腳引到某個位置的標頭中-您可以管理的盡可能多-因為這將是當您必須調試FPGA代碼或實施一些第11個小時的補丁程序時,您將成為生命線。

您提到使用彙編語言進行編程是一種對計算機的運行進行精確控制的方法,並且可以通過使用非便攜式,特定於供應商的原語對FPGA代碼進行類似的精確控制。對於每個供應商和每個FPGA,這都是不同的,就像不同的CPU的彙編語言是不同的一樣。對於Xilinx,您將編寫一個約束文件(與ISE工具鍊或Vivado工具鏈不同)。約束文件將調出特定的實例或特定的網絡,並指定時序要求。通常,低級CLB / LUT / whateverUnits排列在網格中,因此您可以固定特定的低級基元以位於特定的X,Y網格位置。查找Spartan 3系列的舊Xilinx“ FPGA編輯器”,他們曾經鼓勵人們以這種方式使用它。我認為不支持較新的Series 7和Zynq芯片。像組裝一樣,它對技術非常特定,因此是一種易變的技能。

類似於彙編,除了瑣碎的“家庭作業”練習外,您真的想最大程度地減少編寫的彙編數量。請使用C / C ++進行98%-99%的操作,而只對性能敏感的1%進行彙編。例如,如果您有一個FPGA設計需要一些子過程以200MHz運行,那麼就值得深入研究低級映射以了解工具的作用。優化的最佳回報是可以消除不必要的工作階段。只有在將熱點元素削減到最低限度之後,才值得開始手動路由哪些IOB屬於哪個網格位置。讓機器完成大部分工作,以便您可以集中精力。

DKNguyen
2020-05-05 04:16:09 UTC
view on stackexchange narkive permalink

FPGA的物理原語是可配置邏輯塊(CLB)。

每個邏輯塊在存儲器(即所謂的配置存儲器)中都有一個專用位置,該位置決定了它的配置方式和連接位置。

HDL最終以一堆一和零結束,這就是放置在此配置存儲器中的所謂比特流。

大多數FPGA沒有板載非易失性配置存儲器。相反,配置位流存儲在外部配置FLASH ROM中,並且在加電時,FPGA將該位流從外部非易失性存儲器加載到其內部配置SRAM中,後者直接連接到CLB並對其進行控制。

與軟件不同,該位流不是“運行”的。它只是被加載,之後它只是“是”。它不像正在執行的指令,而更像包含設置的寄存器。

它是一個文件,例如* .bit。沒有標準格式。我不確定當模擬器附帶FPGA開發工具時為什麼要自己編寫模擬器。付出了很多努力,他們比其他人更了解自己的設備,因為與軟件不同,位流中指定的每個原語必須物理上位於FPGA裸片上的某個位置,並且平面圖可以製定或破壞某些設計。

我相信CLB一詞專門針對Xilinx產品。Microsemi(以前稱為Actel)使用的術語包括寄存器單元(r單元)和組合單元(c單元)。
@SteveSh是的,各地都有不同的用語。如果他們甚至不同意他們所說的話,他們將無法就標準雙流格式達成一致。
我的意思是,它們使用不同的術語,因為它們使用不同的體系結構。我認為,即使元素比標準的4-LUT更複雜,查找表還是一個更好的物理原始示例(以及為什麼主要品牌通常會列出LUT等效項)。
Graham
2020-05-05 15:07:06 UTC
view on stackexchange narkive permalink

在對FPGA進行編程時,寫操作會佔用多少字節?

這通常是 less ,因為它是100%特定於製造商和特定於設備的。一些製造商為此發布了數據表。其他製造商認為這是“商業秘密”,因此您需要簽署保密協議才能找到答案。

無論如何,使用C(或任何其他語言)編譯器,原始字節不是最基本的部分。最基本的部分是實現程序的一系列處理器指令,原始字節只是您如何告訴處理器這些指令是什麼。這些指令使處理器使用其各種硬件功能(例如加法器,乘法器等)執行操作,並將數據存儲或檢索到寄存器和存儲器中。

這在FPGA中非常相似,除了您從較低級別開始。您沒有列出要運行的指令,而是列出了FPGA中每個門應如何互連的列表。大多數FPGA還包含有關RAM和其他功能的專門部分,您的程序還將包括如何將它們連接起來。

最後得到的是一個 netlist ,就像您要設計一百萬個邏輯芯片的PCB一樣。從概念上講,這是您的FPGA編譯器最基本的輸出,以告訴您它在做什麼,就像彙編列表在概念上是C編譯器的最基本的輸出,以告訴您處理器在做什麼。

當然,然後編譯器繼續生成一個二進製文件,該文件將使用該網表對FPGA進行編程,就像C編譯器繼續生成一個二進製文件,該二進製文件使用該彙編器對您的micro進行編程。

SteveSh
2020-05-05 04:27:30 UTC
view on stackexchange narkive permalink

“在對FPGA進行編程時,寫入時會佔用多少字節?”

簡單地說,這些字節包含以下信息:

1)配置FPGA邏輯& I / O塊(您要將此塊用作寄存器,多路復用器,通用查找表),以及

2)在FPGA上配置互連,以使邏輯模塊相互連接,然後與外界連接。

old_timer
2020-05-05 20:41:56 UTC
view on stackexchange narkive permalink

這麼多的答案我都沒看完,因為坐在圍欄兩側的人,硬件和軟件....

因此,在所有方面,它都是一種編程語言,可以理想地編譯為其他語言(從C到asm或機器代碼,從JAVA到字節碼或其他語言或彙編或機器代碼等)。除了isa以外,還有很多步驟,目標也要比isa多得多,因為它們不同:add,mov,jne,push,pop等。

fpgas或asics的機器代碼不僅是分立的晶體管,而且是一個東西庫。對於特定鑄造廠和工藝的asics,有一個或多個單元庫可用,它們將具有簡單的和/或門,也可能具有更大和更複雜的內容,為什麼當庫的作者可以將一些通用尺寸的組件構建成鎖存器時,並以有效(房地產)方式打包。因此,與任何編譯器或高級作者一樣,您要遍歷選項列表並選擇一些選項。包括一長串各種寬度和深度的sram。對於FPGA,是LUT或某種固定的通用模塊,它們可以充當比簡單的“或”門或“異或”門更為複雜的各種模塊。

FPGA世界喜歡把東西放在胸前,而且他們試圖比ASIC工具更便宜,每年數万美元而不是數百萬美元。就像任何其他集成環境一樣,您有時會購買或獲得許可的各種供應商,並且將工具粘合在一起(通常不是很漂亮)。

其他人提到的所有步驟都發生了。它比軟件更重要,並且文件格式是非常專有的,並且不會被記錄或支持,因此每個版本都可能會更改。同樣,這些人似乎具有競爭性和秘密性(如果他們要開放,我們可以擁有更好的工具,他們可以出售更多的產品IMO,但可能會減少支持資金,這也許是他們依靠笨拙的工具所賴以生存的) 。

當人們說網表時,verilog被編譯成網表,我所見的那些也以verilog或vhdl出現,因為這些語言涵蓋了這一點。最終,您將針對特定的東西,如fpga,cpld,asic等。fpga是已經接線/固定的目標,如果需要的話,最終會得到一系列保險絲或開關,並採用通用接頭並將其連接至通過在龐大的網格物體中打開和關閉連接來輸入和輸入。最終得到的是一些簡單的清單。而且我認為可能有一個jedec標準,但通常被稱為比特流,至少我們使用比特流播放器進行加載。

通常,CPLD在零件本身中編程此信息,因為它是板載閃存,然後在打開電源時打開/關閉東西,和/或內部的非易失性存儲器通過連接的物品打開電源。

FPGA通常具有一個外部閃存,並在打開電源時連接信息,然後再使用該設置加載其餘部分。據我所知,您在通電時可以將這些信息加載到零件中並進行所有連接,但是當零件斷電時,該信息會丟失。因此,根據您的設計,您可能有其他解決方案而不使用閃光燈。 Flash格式可能是專有的,我個人沒有看過,當您通過編程接口進入該接口時,該接口通過fpga到Flash,因此可以按原樣使用,也可以將其轉換為其他格式。

在這個時候和地點使用esp軟件,我們習慣於打開很多東西,許多人都在使用一些不錯的免費工具。這也意味著文件格式已被記錄並在某種程度上是常見的,其中一些在.com和.exes之前具有歷史記錄,而另一些在當時的其他操作系統中具有歷史記錄。但是同樣,軟件世界比您理想地針對機器代碼或字節碼的目標更為普遍。使用邏輯,您會從較高的層次過渡到較低的層次,但是在某種程度上使用相同的語言。然後,您可能要針對一個模擬器,該模擬器具有自己的模塊庫或帶有庫的fpga n或帶有庫的fpga m,依此類推。這些人非常保護信息。

Clifford和IceStorm IMO項目是正確的方法,這是迄今為止我唯一一次為fpga構建簡單,有效的東西,沒有軟件人員經常喜歡的警告或錯誤。我花了無數的夜晚試圖從所有主要供應商那裡得到最簡單的東西來構建fpga,而不會發出警告……並且會永遠放棄。從Verilog到編程的部分,至少是三個獨立的項目,這意味著雙方都需要支持中間文件,因此文件格式就在那裡。但應該是特定於項目的,而不必像被廣泛用於多個用例的elf文件一樣。

了解包括fpgas在內的芯片世界非常昂貴,因此它是金錢驅動的,這通常意味著出售工具,最重要的是要簽訂年度支持合同。這意味著不公開的來源,不公開的信息,而不是公開記錄的文件格式。

Brian Drummond
2020-05-06 18:59:28 UTC
view on stackexchange narkive permalink

在進行綜合之前,您可以在仿真中驗證設計。在這種情況下,您的設計將被視為軟件-對於至少一個模擬器(開源GHDL,對於VHDL而言並不奇怪),編譯器可以使用gcc或LLVM後端生成普通的可執行文件。

通常,您將實際設計嵌入“測試台”(也用VHDL編寫)中,該測試台生成輸入信號並報告輸出的正確性-通過控制台(通過Assert / Report語句)或使用驗證和日誌記錄工具像OSVVM,在單元測試框架(VUnit)下。

如果其他所有方法均失敗,則可以在GUI中轉儲並檢查波形。

一旦一切正常,請按照其他答案中的說明進行綜合。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...