前言
? ? ? ? 由于Quartus寫代碼比較費勁,雖然新版已經有了代碼補全,但體驗上還有所欠缺。于是使用VS Code開發,效果如下所示,代碼樣式和基本的代碼補全已經可以滿足開發,其余工作則交由Quartus完成
????????但VS Code的自帶的git功能,說實話并不好用,只能查看更改的,需要手動展開才能瀏覽全局代碼。而合并過程,辨識度并不是很高,容易造成重復代碼
????????分支方面并不清晰,雖然提供了多種視圖
????????基于此,打算使用CLion試試。在官網上恰好看到了對應的插件,那么也就意味著此法可行。不過官方這個插件似乎還不支持所安裝的CLion
一、安裝插件
? ? ? ? 于是打算換成IntelliJ IDEA。下圖中的第一個插件與VS Code下的差不多,有基本的代碼補全功能,可以滿足基本的Verilog開發。第三個插件有不少Verilog相關的代碼檢查等功能。
????????需要注意的是,后者與其他Verilog插件可能不兼容,所以需要作出取舍。此處使用后者,前者需要禁用,否則工程目錄會一直處在正在加載
????????這個牛掰的插件,同時也是開源項目。
教程文檔:Scaleda:將 IntelliJ IDEA 打造為 FPGA 開發工具 — Scaleda v0.2.1 文檔
手冊:快速開始 — Scaleda v0.2.1 文檔
二、創建新項目
1,創建工程
新建項目,指定好路徑,路徑不能有中文。下圖這個Scaleda圖標表明插件不兼容
圖標實際應為
創建后會自動生成下面文件
2,新建文件
①新建Verilog文件
新建后,會自動生成對應框架
先寫一個簡單的計數器模塊,在強大的代碼補全和代碼提示下,很輕松地完成了
module demo ( input clk, input reset, output reg [7:0] count ); always @(posedge clk) beginif (reset)count <= 8'h00;elsecount <= count + 1; endendmodule
②新建Testbench文件
先簡單寫一個測試激勵文件
`timescale 1ns / 1psmodule demo_tb;// 信號聲明reg clk;reg reset;wire [7:0] count;// 實例化被測模塊demo dut (.clk (clk),.reset(reset),.count(count));// 時鐘生成(50MHz)initial beginclk = 0;forever #10 clk = ~clk; // 10ns半周期end// 測試流程控制initial beginreset = 1'b1; // 初始復位#100; // 保持100nsreset = 1'b0; // 釋放復位// 監控信號變化$monitor("Time=%0t: count=%d", $time, count);// 運行16個時鐘周期repeat (16) @(posedge clk);// 驗證最終值(預期255+16會溢出) // if (count !== 8'd15) begin // $error("Final count mismatch! Expected 15, got %d", count); // end$finish;end// 這段語句會自動生成,所以不用加 // // VCD波形記錄 // initial begin // $dumpfile("demo_tb_waveform.vcd"); // $dumpvars; // 記錄測試臺頂層信號 // end endmodule
③格式化文件
? ? ? ? 從上圖可以看出,有很多警告表示應用Tab代替空格。
可以先按Ctrl + A全選,然后再按Ctrl + Alt + L 格式化代碼
④代碼檢查
? ? ? ? 代碼出現問題,不僅會有報錯提示,還有對應的解決措施,成功地把編寫代碼的難度降低一大截
3,基本功能
①語言服務器
? ? ? ? 在設置中可以找到該插件的相關配置,首先是如圖的語言服務器(LSP),提供代碼檢查等功能
????????Verible是檢測Verilog的,svls則是檢測System Verilog
? ? ? ? 手冊中亦有記載
②代碼樣式
③配色方案
4,添加工具鏈
①Intel Quartus
? ? ? ? 由于本人使用的是Quartus,所以添加的是Quartus的工具鏈,Vivado等在手冊中有相關配置教程
點擊添加,會有多個工具鏈模板,選擇最后一個Intel Quartus
在Quartus的安裝路徑中找到bin64這個路徑即可
②Icarus Verilog
????????Intel Quartus是FPGA的綜合和實現工具,而Icarus Verilog是開源仿真器,主要用于驗證HDL代碼
下載
? ? ? ? ?? ? ? ? 進入網址Icarus Verilog for Windows,然后選擇對應版本下載,比如最新版
安裝
? ? ? ? 選擇合適的目錄即可
????????可以選擇添加環境變量,環境變量若想生效,需要重啟(此時可以不重啟)
安裝完成后就可以添加該工具鏈了,由于已經包含了所需的三個程序,故路徑非常簡單。但要注意,此時需要指向程序,而非目錄
5,添加仿真配置
①添加目標平臺
? ? ? ? 點擊右上角的任務視圖
????????再點擊編輯任務
? ? ? ? 然后點擊“+”,會出現一個目標平臺,選擇對應的目標名稱、工具鏈和頂層模塊
????????頂層模塊,這里應添demo,而非demo_tb。約束文件暫時不管
②添加仿真任務
????????點擊目標平臺后,再點擊這個目標平臺,然后點擊“+”來添加仿真項目。注意!是仿真任務,所以使用的工具鏈是Icarus Verilog這個開源工具鏈
③刷新
? ? ? ? 回到任務視圖,點擊刷新
可以看到對應配置都刷新出來了,這里方括號的顯示與前面不一致,應該是個小bug
6,運行
? ? ? ? 雙擊運行可以看到有正確的輸出提示
????????尷尬的是,沒有產生手冊中的波形圖
設置波形
????????回到設置里咱去看看怎么個事。可以看到前面兩個選項勾選很正常,但波形處理這塊應該沒有生效
點開后,可以看到三個選項,其中gtkwave我們在iverilog的目錄里看到過,那么就選擇它吧
gtkwave
? ? ? ? 雙擊任務視圖里的仿真任務,或者點擊上面的運行,效果相同
????????此時,會彈出一個新窗口(老窗口)
點擊SST欄里的demo_tb,可以將其展開,其下方欄也會有相應信息
點擊這些信號,Signals那一欄就會出現相應信號,Waves下則出現對應波形
縮放一下,有那么一點韻味了
Surfer
? ? ? ? 與前面相同,在設置里選擇即可,點擊運行后,可以彈出這樣一個窗口。不得不說,這個背景色調相當有吸引力
Rvcd(未解決)
? ? ? ? 雖然插件里提到,Rvcd和Surfer是內置的,不過實際運行仿真任務時Rvcd卻沒有任何窗口,可能是我姿勢不對?
? ? ? ? 應該是插件錯誤導致的
7、曲線救Rvcd(失敗)
? ? ? ? 找到Rvcd項目(非常棒的項目),Scaleda/rvcd: VCD viewer in Rust, running on ANY platform
? ? ? ? 不過,我們并不需要下載Rust編譯器。到設置里,我們可以看到LSP的可執行路徑,那么我們就前往這個路徑
在bin這里,可以找到我們想要的文件
雙擊運行
找到我們項目下的仿真波形文件
然后什么都沒發生,疑似程序崩潰。那么根據README提示,使用命令行來完成操作(路徑需自行替換).\rvcd -i "E:\Program\Embedded\FPGA\demo\.sim\demo-iverilog-sim\demo_tb_waveform.vcd"
????????剛才當我沒說,Rust編譯器還是得下,下載是基本功,這里不啰嗦了。下載Rvcd源碼壓縮包后,執行下面命令進行編譯# run rvcd cargo run # compile to release executable cargo build --release
三、綜合Quartus項目
1,遷移
?把前面工程下的scaleda.yml復制到Quartus的舊工程里
然后右鍵工程文件夾,使用IDEA打開
????????接著修改配置即可,如果配置不生效,那么就重啟IDEA。可以選擇在任務視圖里修改,也就是圖形化操作
????????該插件對System Verilog的支持有限,建議文件后綴名為.v,使用Verilog2,原理
? ? ? ? 接下來是對項目進行綜合,不知道為什么,這個插件Quartus的綜合項目時只會卡著,什么反應都沒有
????????不過綜合這一步終歸是利用Quartus的工具,自己手動配置也沒多麻煩。于是在Quartus里運行一下,進行綜合。
????????然后再根據輸出信息框篩選出命令,可以看到它執行了下面的五條命令,我們只需要把這些命令添加到外部工具即可
????????打開設置,找到外部工具,點擊“+”添加外部工具
可以輸入下面信息
????????這些信息怎么來的呢?前面在輸出信息框里,我們先找第一條命令
Info: Command: quartus_map --read_settings_files=on --write_settings_files=off Firefly -c Firefly
????????“Command:”后面的內容其實就是終端里執行的命令,quartus_map就是可執行程序,后面則是它需要的參數,也就是實參
? ? ? ? 而這個程序在哪呢?它在Quartus安裝目錄下的quartus/bin64目錄,此目錄就是Intel Quartus的工具鏈路徑。因此程序一欄添該程序的完整執行路徑即可
? ? ? ? 我們需要編譯(綜合)本工程,那么工作目錄自然是當前目錄(項目根目錄)
????????
????????剩下的外部工具皆是如此配置,幸運的是工作目錄和實參都差不多,只有程序名稱不同。不過這種方法有些劣質,如果是不同的工程,那么工作目錄就需要重新改了
2,powershell目標
? ? ? ? 為此,干脆寫一個powershell腳本,創建一個powershell目標,進行一鍵綜合。
????????點擊添加目標,選擇Shell Script
? ? ? ? 接下來找一個目錄存放腳本
? ? ? ? 可根據自己的情況更改
# 設置程序路徑 $QUARTUS_BIN = "E:\Tools\Develop\Embedded\intelFPGA\quartus\bin64" # 設置項目名 $PROJECT_NAME = "Firefly" # 設置工作目錄 $WORK_DIR = "E:/Program/Embedded/FPGA/Firefly"# 初始化環境 $env:PATH = "$QUARTUS_BIN;$env:PATH" Set-Location $WORK_DIR# 執行流程 $commands = @("quartus_map --read_settings_files=on --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME","quartus_fit --read_settings_files=off --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME","quartus_asm --read_settings_files=off --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME","quartus_sta $PROJECT_NAME -c $PROJECT_NAME","quartus_eda --read_settings_files=off --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME" )foreach ($cmd in $commands) {Write-Host "Run: $cmd" -ForegroundColor CyanInvoke-Expression $cmdif ($LASTEXITCODE -ne 0) {Write-Host "[Error] $LASTEXITCODE" -ForegroundColor Redexit $LASTEXITCODE} }
此時在目標里填上腳本路徑,把解釋器路徑清空
執行目標后,輸出結果與Quartus相同,除了最后一條總結外
這里只是提供了一種可行性的方案,進行綜合還是要到Quartus里。至于燒錄等操作,則同理
3,編寫項目(重要)
? ? ? ? 如果以前有項目時要非常注意,該插件對System Verilog的支持有些問題。試過許多次,最后發現,代碼里不能出現中文等非ASCII字符,否則打開即崩。但它對V文件相當寬容
? ? ? ? 這就有些難辦了,既想使用System Verilog,又不能寫中文注釋
[Crash] Verible LSP fails to open .sv files with non-ASCII characters (e.g. Chinese comments) in IntelliJ IDEA
????????考慮到Verilog下的代碼提示和代碼樣式明顯更好,Verilog就Verilog吧
4,仿真
? ? ? ? 該插件對仿真的支持可謂差的一塌糊涂,主要是無法對sv文件進行仿真,如$sin、real、break等常見特性根本用不了。這個有空看看有沒有平替或者次替
ModelSim(GUI)
? ? ? ? 與前面綜合一致,仿真時,在Quartus的輸出信息框里找命令。可以看到在打開ModelSim后,輸出框里有這樣一條信息
而括號內的就是我們需要的命令
quartus_sh -t "e:/tools/develop/embedded/intelfpga/quartus/common/tcl/internal/nativelink/qnativesim.tcl" --rtl_sim "Firefly" "Firefly"
由于命令比較簡單,改為腳本文本,同時加上quartus_sh的路徑
E:\Tools\Develop\Embedded\intelFPGA\quartus\bin64\quartus_sh -t "e:/tools/develop/embedded/intelfpga/quartus/common/tcl/internal/nativelink/qnativesim.tcl" --rtl_sim "Firefly" "Firefly"
運行后會自動啟動ModelSim,與前面執行仿真任務Surfer差不多,唯一的區別就是,它的仿真是根據Quartus自帶的tcl腳本實現的
而內置的tcl腳本與qsf文件有關,換句話說,打開qsf文件,我們可以看到相關的約束命令
qsf的仿真解析
? ? ? ? 在qsf文件中,搜索test,右邊藍色區域可以就是所有涉及到測試激勵(仿真)的地方
? ? ? ? 這三句對應的是圖形后操作后保存的信息
這幾條是仿真器的配置
這條是正在仿真的文件
這幾條就是把測試激勵模塊與實際文件對應起來,用的是相對路徑
????????知道這些信息后,可以很輕松地手動修改。事實上,測試激勵文件的相關操作在配置文件里修改要比圖形化添加要方便一些。
? ? ? ? 需要注意的是ModelSim仿真前,需要進行綜合,也就是前面那個目標
ModelSim(命令行)
? ? ? ? 前面的ModelSim的GUI有些簡陋,那么接下來我們就可以使用命令行模式下的ModelSim,運行結束后讓其再執行Surfer。
? ? ? ? 首先我們可以在simulation/modelsim這個目錄里找到Quartus自動生成的do腳本,該腳本用于vsim(也就是ModelSim的boss?可以這么說的話)。前面不是提到過Quartus運行RTL仿真時,其實是讓quartus_sh執行了tcl腳本,該腳本自動生成了do腳本,并讓vsim運行該腳本
腳本的內容很簡單,都是些配置和啟動命令
????????因此我們可以讓vsim來執行該腳本,并且以命令行的模式(需要帶上參數-c),vsim的可執行路徑需要自行去找(沒有安裝ModelSim是沒有的,可以搜索“Quartus ModelSim”,會有一堆安裝教程)
E:\Tools\Develop\Embedded\intelFPGA\ModelSim\modelsim_ase\win32aloem\vsim -c -do "do E:\\Program\\Embedded\\FPGA\\Firefly\\simulation\\modelsim\\Firefly_run_msim_rtl_verilog.do"
可以看到,腳本很順利地執行下去了,執行后,可能會停留在vism界面(按Ctrl+C可退出)
我們可以在自動生成的do腳本里加上下面這句,即可讓其仿真結束后自動退出
????????那么也就意味著,我們把前面vsim執行do腳本的命令寫入到ps1腳本或者bat腳本,再在后面補充上Surfer的命令。那么就可以讓其仿真后,自動打開Surfer顯示波形了,與之前雙擊Scaleda的仿真任務無異了
? ? ? ? 為了進一步簡化流程,可以寫一個腳本先讀取qsf中的頂層文件,再到test目錄里去找有沒有對應的測試激勵文件,然后再生成對應的do腳本,接著讓vsim執行仿真,在控制臺輸出信息,輸出完之后,再自動打開Surfer,最后就可以優雅地欣賞波形了
? ? ? ? ? ? ? ? 【未完待續】
5、波形顯示
? ? ? ? 由于心心念念的Rvcd不能使用,只得另辟蹊徑來查看“波形”而非“波形數據”(也就是模擬波形)。在VS Code里可以找到這樣的兩個插件,完美代替了Rvcd和Surfe
? ? ? ? 安裝插件后,點擊生成的vcd文件即可。如果兩個插件都安裝的話,可以在上方自行切換,二者擇其一即可
WaveTrace
? ? ? ? 點擊左下角的添加信息,雙擊你要顯示的信號即可
點擊左邊的信號后,上面會有三個顯示類型,分別是數字、數字量化和模擬
Digital IDE
? ? ? ? 此插件功能更豐富,但若想使用還需安裝Vivado
? ? ? ? 如此看來,除了內置git外,IDEA在Verilog方面能做到的VS Code都能做到,且某些方面更強
6、分工考慮
? ? ? ? 編寫一些基本模塊的話,使用Verilog就足夠了,Scaleda中的Verible可以提供非常好的語言支持。此外,git方面,IntelliJ IDEA能提供更好的體驗。
????????仿真的話,僅使用Verilog既冗余、晦澀難懂,又不能很好地達到效果,比如Verilog里沒有real、$sin和break等,想要模擬ADC數據采集有些麻煩。而使用System Verilog的話,Scaleda的支持非常差,近乎不能使用,包括里面的仿真任務。此時只能依賴VS Code的hdl_checker插件了,對System Verilog有基本的支持(代碼檢查)。
? ? ? ? 如果要對System Verilog進行仿真,那么iverilog就無能為力了,只能使用ModelSim等支持的仿真器。在測試激勵文件里可以加上下面這句,以生成波形文件。然后可以在ModelSim仿真后再啟動Surfer觀察波形(可選項)。
initial begin$dumpfile("xxx.vcd");$dumpvars; end
? ? ? ? 綜合起來,編寫模塊和仿真測試使用IntelliJ IDEA,仿真代碼編寫方面使用VS Code,資源消耗方面使用Quartus。Scaleda的任務目標由于目前其缺陷性,不太適合使用。
????????verilator????????questasim
四、展望
? ? ? ? 目前來說,想要一站式開發,得需要使用VS Code。IntelliJ IDEA與VS Code關于Verilog的插件并不互通,比如Digtal IDE只在VS Code有,Scaleda只在IntelliJ IDEA上有。兩者都是非常優秀的工具,可根據自身開發體驗自行選擇。
? ? ? ? IntelliJ IDEA界面可能更為簡介優美,且運行目標由于有現成的框架,想要運行腳本更方便。VS Code更為輕量且插件功能更為豐富,適合一站式開發,但想要達到更好的配置還需著重學習json等,學習難度較大。
????????VS Code下開發FPGA——FPGA開發體驗提升__下-CSDN博客