【FPGA】Robei EDA常見問題解決 (4)——— 包含include文件和quartus綜合的問題

#懸崖的花,越芬芳越無償

每次用Robei EDA出問題的時候,我都會懷疑一下到底是我腦子傻了還是EDA腦殘了;但是每次等我解決了這個問題,我又覺得是我學傻了纔會有這種問題。妙~
————————————正文的分割線——————————————
在robei EDA 裏添加了.v文件後,進行系統的 綜合,robei 自動生成的代碼裏,是不包含我們平常在Verilog代碼裏的include格式。

·include''sdram_para.v''

robei 自動生成的代碼不會有這個語句,如果直接拿robei生成的.v文件在quartus 上進行綜合的話,就會出現錯誤,告知缺少 include 包含的文件。(這就很狗)
後來詢問了工程師,被工程師告知,直接生成的代碼文件是不會自動生成include這個代碼的。Robei通過另一種方式包含了這個代碼。

在Robei綜合文件的時候,生成了一個叫做fpgafiles.vf的文件,這個文件裏通過include將所有的文件包含了起來,包括用於“define” 的sdram_para。按Robei工程師的講法是隻用導入這一個文件就可以進行綜合了。 BUT!我和一位來自廣華的同學,都發現了綜合出現了問題,而且還挺麻煩的。
問題是:
1、只導入fpgafiles這個文件進行編譯,Quartus會報錯說找不到頂層文件。
2、如果把Robei 生成的所以的Verilog代碼和這個fpgafiles導入到工程中,Quartus會報錯說找不到這個sdram_para.v文件,一共會產生44個錯誤,這點經過我和廣華那位姐妹的認證。
我們彼此在同一個星期的不同時間段出現了這個問題,並獲得了對方的嘲諷(噗嗤)
在這裏插入圖片描述
在這裏插入圖片描述
(對方的問題都一樣,不僅錯誤相同,連出錯的點都一樣)

這個問題後來是怎麼解決的呢?
(在此聲明,Robei工程師說的未必就是錯的,但是我們這樣確實沒法整,只能自己用自己的辦法解決,僅做參考)

操作流程如下

  1. 新建Quartus工程
  2. 在添加文件的時候,先僅添加 sdram_para.v 一個文件,系統所有的文件都不要添加。
  3. 對這個只有一個文件的工程編譯(一定會報錯的,這個不用說)
  4. 報錯完之後,把剩下的所有系統的Verilog代碼文件添加進這個工程文件裏,並設置自己的系統頂層文件。(拿我自己的工程舉例子,大概是這樣,這個sdram_para.v在最頂上)
    在這裏插入圖片描述
  5. 重新編譯這個添加過系統文件的工程,如果不出什麼別的編譯錯誤,那麼你的工程大約也成功了,然後就配置管腳或者燒錄啥的就OK啦。

————————————————————————————————————————————
提一個醒,我在寫代碼的時候注意到了一個比較麻煩的問題,Robei 的Verilog代碼編譯使用的編譯器是一個叫做:Icarus Verilog 的編譯器。(如圖)
在這裏插入圖片描述
這個編譯器我不知道是新是舊(相對於Quartus裏的Verilog編譯器來說),但是我在Robei裏寫的一些代碼,Robei本身不報錯,但是在Quartus裏編譯錯誤,這個就有點尷尬,但是我也沒有能力去評判它具體是一個怎樣的情況。不過在這裏告知一下我出現過的情況,方便大家查看。

  1. for循環裏的語法。C語言寫多了,很容易把自增寫成i++,但是在Quartus裏這個會報錯的,Robei不會。
  2. 一個信號被重複賦值。我在做攝像頭調試的時候,給了一個圖像輸出數據信號有好幾種賦值,每次想測試的時候就註釋掉不需要的。這個在Robei模塊綜合的時候並沒有被我刪掉,但是Robei裏用連線代替了例化,就導致了一個變量我既直接輸出給高層模塊,又通過assign 賦了一次值 ,於是我在Quartus裏的綜合就出錯了。
  3. 信號線例化時忘了接。因爲robei EDA在例化模塊的時候,採用的是直接接線和通過Connect來連接內部信號,有時候就稍不注意就連少了線,就不容易發現。但是Robei在編譯的時候,並不會對不連信號線而保錯,反而是用Warning 用的多一些。這些warning在Quartus裏就會變成error,其實robei幾乎所有的warning都是實際必須改正的錯誤。Quartus裏的warning大部分都是那根信號線沒用,哪個變量定義了卻沒有使用這樣無關痛癢的問題(相對而言),Robei是把除了基礎語法以外的錯誤都算成error,這樣其實不太好,因爲出了是很容易讓人忽略以外,還有個問題就是,不容易養成良好的代碼規範。

對於Verilog來說,編程規範其實是比任何一門語言都嚴格的,因爲 Verilog HDL相對其他語言來說,它並不是真的拿來編程的,它是拿來做硬件電路描述的。每一句Verilog代碼在FPGA中都會對應成實際的數字電路,它會真的因爲寫法的不同,用法的不同而對實際的應用造成非常大的影響,在入門之初就意識到如何規範的描述硬件電路的重要性。
這是我的學長給我講的道理,從流水燈開始就應該有意識的去設計硬件電路,比如信號的優先級,並行模塊之間的優先級,如何通過寄存器來延時時鐘,如何通過if-else 來減少毛刺,如何使用好狀態機,保證電路狀態穩定。
所以說,想學Verilog太簡單了,想學好Verilog太困難了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章