標(biāo)題: FPGA 開發(fā)專題 | 手把手教你用 VScode 搭建輕量級(jí) Verilog 仿真環(huán)境 | 真保姆級(jí) [打印本頁]

作者: 電子愛好者沒錯(cuò)    時(shí)間: 2023-8-22 19:13
標(biāo)題: FPGA 開發(fā)專題 | 手把手教你用 VScode 搭建輕量級(jí) Verilog 仿真環(huán)境 | 真保姆級(jí)
本帖最后由 電子愛好者沒錯(cuò) 于 2023-8-22 20:31 編輯

FPGA 開發(fā)專題 | 手把手教你用 VScode 搭建輕量級(jí) Verilog 仿真環(huán)境 | 真保姆級(jí)

目錄:




圖:雷元素客晴


全文共 3360 字,閱讀大約需要 5 分鐘

只要附著雷元素力,刻晴的發(fā)簪就能化為一柄銳利無比的小刀。

刻晴的三點(diǎn)養(yǎng)成日記:刻晴這種如此可愛的角色,養(yǎng)成不易,也要搭配特殊的陣容,來發(fā)揮她的最佳效果。FPGA 的開發(fā)也是這樣,各種仿真軟件陣容過于繁復(fù),往往我的需求是寫 verilog/VHDL 代碼并仿真時(shí)序,并不想安裝各個(gè)廠家(如 Quartus,Vivado)的軟件,有沒有一種輕量、高顏值、簡(jiǎn)單好用、功能強(qiáng)大且免費(fèi)的仿真環(huán)境呢?

本篇作為保姆級(jí)教程,將會(huì)手把手帶你配置 FPGA 輕量級(jí)開發(fā)環(huán)境和使用我的腳本!該方案支持 windows 和 linux 系統(tǒng)。

本文首發(fā)于在下石同學(xué) 未經(jīng)授權(quán) 不得轉(zhuǎn)載

文 | 在下石同學(xué)




零、寫在前面


FPGA 開發(fā)離不開各種仿真,尤其是 RTL 級(jí)這種最基本的邏輯功能性仿真,對(duì) FPGA 及開發(fā)流程還不了解的童鞋請(qǐng)看我的往期文章:

往期文章鏈接






盡管現(xiàn)在許多 FPGA 廠家的軟件功能都很齊全,但是代碼編輯界面還保留著上世紀(jì)的風(fēng)格,特別是有些仿真工具入門門檻較高,安裝起來也比較麻煩,F(xiàn)PGA 開發(fā)中的大多數(shù)時(shí)間都花費(fèi)在 verilog/VHDL 代碼編寫和 RTL 仿真上,往往我的需求是寫 verilog/VHDL 代碼并仿真時(shí)序,并不想安裝各個(gè)廠家(如 Quartus,Vivado)的軟件,有沒有一種輕量、高顏值、簡(jiǎn)單好用、功能強(qiáng)大且免費(fèi)的仿真環(huán)境呢?








答案是使用 iverilog !



為什么要用 iverilog ?實(shí)際上 VHDL/Verilog 仿真多使用 Modelsim 這種專業(yè)軟件,但是 iverilog 足夠輕量,并且用作科研和開發(fā)完全不用擔(dān)心版權(quán)的問題,然而 iverilog 開發(fā)需要用戶使用一些腳本和命令行,這一點(diǎn)就勸退了大部分初學(xué)者,所以我這里就對(duì)該部分進(jìn)行封裝,確保大家只需要簡(jiǎn)單的幾條指令就可以實(shí)現(xiàn)絕大多數(shù)的 FPGA 的 RTL 級(jí)仿真工作,同時(shí)配備 Vscode 的語法高亮和代碼檢查。

授人以魚不如授人以漁,同時(shí)也帶領(lǐng)大家了解我的方案細(xì)節(jié)和底層,幫助大家更好了解 iverilog 編譯和仿真過程都經(jīng)歷了什么。





一、來瞅瞅我的實(shí)現(xiàn)方案

整個(gè)方案實(shí)現(xiàn)的過程并不復(fù)雜,可以類比我們?cè)谛W(xué)一年級(jí)就學(xué)過的 C/C++ 編譯過程,如下圖所示,VScode 作為工程組織和寫代碼的工具,通過安裝插件支持 Verilog/VHDL 的語法高亮、關(guān)鍵詞提示、語法檢查等, Verilog/VHDL  的文件都以 *.v 作為后綴。注意看圖中虛線包圍的部分,所有的 *.v 文件通過 iverilog 工具完成編譯生成 *.out 文件,再通過vvp 工具運(yùn)行*.out 文件,就可生成*.vcd 波形文件,最后使用gtkwave工具查看波形文件,至此,整個(gè)編譯到波形查看的過程就完成了,如圖中虛線部分所示。

可以看到,編譯的過程稍微有些許繁瑣,為了簡(jiǎn)化這個(gè)過程,我使用了make工具,通過編寫makefile文件來控制整個(gè)編譯的過程,熟悉 linux 下 C/C++ 開發(fā)的同學(xué)對(duì)make 應(yīng)該非常熟悉,不熟悉的同學(xué)可以自行搜索,文末我也會(huì)放置相關(guān)的參考鏈接。通過make來實(shí)現(xiàn)虛線框的過程,這樣用戶再也不用考慮編譯過程的細(xì)節(jié)了,一條指令搞定所有!

D:\Xzhao\Documents\OfficialAccounts\Article\2023.07.01\photos\Snipaste_2023-07-02_14-24-23.png

圖:FPGA 開發(fā)輕量級(jí)環(huán)境搭建

二、代碼高亮和語法檢查——環(huán)境準(zhǔn)備 2.1 VScode 及相關(guān)插件安裝

首先安裝 VScode (Visual Studio Code) ,安裝具體可參考官網(wǎng)Visual Studio Code - Code Editing. Redefined

點(diǎn)擊插件擴(kuò)展,快捷鍵Ctrl+Shift+X,在目錄欄里搜索,即可找到對(duì)應(yīng)的插件,點(diǎn)擊插件上的install即可完成安裝,如下圖所示:

VScode 下幾款插件推薦安裝:

我們點(diǎn)擊每一個(gè)插件,可以在頁面下看到關(guān)于使用及詳細(xì)介紹,如下圖:

2.2 iverilog/make 安裝

這里我們需要安裝三個(gè)軟件(所有的安裝鏈接附在文末)

linux 操作系統(tǒng)下安裝 iverilog/make:

# 安裝 iverilog/make
$sudo apt-get install iverilog
$sudo apt-get install gtkwave
$sudo apt-get install make

# 驗(yàn)證安裝:打印版本信息
$iverilog -v
$make -v

windows 系統(tǒng)安裝  iverilog/make:

到 iverilog 官網(wǎng)下載安裝包,http://bleyer.org/icarus/,根據(jù)自己電腦系統(tǒng),我這里選 x64:

安裝的時(shí)候記住自己的安裝路徑,安裝完畢,我們將安裝路徑里的bin和gtkwave\bin添加到環(huán)境變量 path 中:

需要測(cè)試一下 iverilog 環(huán)境變量有沒有添加成功,我們按下 WIN+R按鍵,調(diào)出運(yùn)行窗口,輸入cmd,打開命令行:

在命令行里,我們輸入 iverilog -v,輸出如下:

可以看到 iverilog 打印的版本信息,表明安裝成功了!

windows 安裝 make 工具稍微麻煩一點(diǎn),需要先安裝 mingw。

下載 mingw 并安裝:https://sourceforge.net/projects ... wnload?source=files

添加MinGW\bin到系統(tǒng)的環(huán)境變量 path 中:

打開MinGW\bin路徑,找到mingw32-make.exe,將該文件復(fù)制一份,同時(shí)改名為make.exe:

同樣的,我們?cè)诿钚休斎?make -v,看到打印的版本信息,也說明安裝成功。

至此,軟件安裝及環(huán)境配置完畢,接下來是如何建立功能并完成編譯和時(shí)序仿真,讓我們?cè)倩氐降谝还?jié),復(fù)習(xí)一下下面這張圖:

這個(gè)過程雖然比較麻煩,但是別擔(dān)心,我們用一個(gè)makefile腳本搞定全過程,只需要三條指令哦!

三、一個(gè)腳本搞定一切!編譯、RTL 時(shí)序仿真全過程! 3.1 腳本實(shí)現(xiàn)原理

用戶只需要編寫makefile文件來組織工程文件的相互依賴關(guān)系和編譯過程,最后使用make工具即可實(shí)現(xiàn)編譯和運(yùn)行,下面貼出我的makefile:

# ------------------------------------------------
# Generic Makefile (based on iverilog)
# @Author : sudo
# ChangeLog :
# 2023-03-22 - creat this project
#   2023-03-22 - first version
# ------------------------------------------------

######################################
# target
######################################
TARGET = vout

#######################################
# paths
#######################################
# Build path
BUILD_DIR = build

######################################
# source
######################################
# V sources
V_SOURCES =  \
./full_adder_tb.v \
./full_adder.v \
./half_adder.v

# # V includes
# V_INCLUDES =  \
# -Itest/full_adder

#######################################
# binaries
#######################################
PREFIX =
# The iverilog compiler bin path can be either defined in make command via VCC_PATH variable (> make VCC_PATH=xxx)
# either it can be added to the PATH environment variable.

ifdef VCC_PATH
CC = $(VCC)/$(PREFIX)iverilog
VP = $(VCC)/$(PREFIX)vvp
else
CC = $(PREFIX)iverilog
VP = $(PREFIX)vvp
endif

# default action: build all
all:wave.vcd

wave.vcd:$(BUILD_DIR)/$(TARGET).out | $(BUILD_DIR)
@$(VP) -n $^
@echo ---------------------------------------
@echo build finished...
@echo "use <make plot> for plot the waveform"
@echo "use <make clean> for clean"
@echo "use <make> for build again"

$(BUILD_DIR)/$(TARGET).out:$(V_SOURCES) | $(BUILD_DIR)
@$(CC) -o $@ $(V_SOURCES)

$(BUILD_DIR):
@mkdir $@

.PHONY:plot
.PHONY:clean

# windows
clean:
@del wave.vcd
@rmdir /Q /S $(BUILD_DIR)

# linux & mac
#clean:
# rm Rf wave.vcd $(BUILD_DIR)/*.out

plot:
@gtkwave wave.vcd


用戶指令只有三條:

整個(gè)makefile的內(nèi)容大家可以根據(jù)自己的興趣研究,不懂也完全沒有關(guān)系,以后寫代碼的時(shí)候,只需要把我這個(gè)文件放在工程目錄的頂層,只需要記住這三條指令,我們就可以愉快的玩耍了!


3.2 項(xiàng)目演示:帶你實(shí)現(xiàn)一個(gè)全加器

這里通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的全加器,來演示整個(gè)環(huán)境如何使用。

首先新建一個(gè)文件夾full_adder,使用 VScode 打開,在該文件夾中新建三個(gè)文件half_adder.v、full_adder.v、full_adder_tb.v:

half_adder.v文件內(nèi)容:


編寫test_bench tb_full_adder.v文件內(nèi)容:


`timescale 1ns/1nsmodule full_adder_tb();reg in1,in2,cin;wire cout,sum;initial begin    in1=1'b0;    in2=1'b0;    cin=1'b0;endalways #10 in1={$random}%2;always #10 in2={$random}%2;always #10 cin={$random}%2;initial begin    forever begin        #10;        if($time>1000)$finish;    endendinitial begin    $display("hello, 在下石同學(xué)!");    $display("hello, 在下石同學(xué)!");    $display("hello, 在下石同學(xué)!");    // $dumpfile("wave.lxt"); // 指定用作dumpfile的文件    $dumpfile("wave.vcd"); // 指定用作dumpfile的文件    $dumpvars; // dump all varsendfull_adder u_full_adder(    .in1 ( in1 ),    .in2 ( in2 ),    .cin ( cin ),    .sum ( sum ),    .cout  ( cout  ));endmodule

全加器是一個(gè)比較簡(jiǎn)單的例子,但是我依舊按照一般工程采用自頂向下的設(shè)計(jì)方法,將一個(gè)全加器的實(shí)現(xiàn)分成兩個(gè) module,full_adder作為頂層模塊調(diào)用half_adder,畢竟這樣更具有普適性。


在tb_full_adder.v中,使用 $dumpfile("wave.vcd")指定仿真波形文件類型,同時(shí)向控制臺(tái)打印hello, 在下石同學(xué)!字符串。

我們編寫*.v代碼文件后,把makefile文件放在目錄頂層,然后打開該文件,找到文中V_SOURCES,在后面添加你編寫的所有*.v文件的相對(duì)路徑,本示例編寫了三個(gè)文件:full_adder_tb.v、full_adder.v、half_adder.v,將這三個(gè)文件路徑添加進(jìn)去,\符號(hào)代表換行符,最后一行不需要添加,如下所示:


# V sources
V_SOURCES =  \
./full_adder_tb.v \
./full_adder.v \
./half_adder.v


每次編寫完自己的 verilog/HDL 代碼后,只需要在makefile中添加V_SOURCES就可以了,其他地方不用動(dòng),然后在makefile所在的路徑打開命令行,輸入指令make:

我們可以看到,代碼編譯成功,并且成功運(yùn)行 full_adder_tb.v文件中的 $display("hello, 在下石同學(xué)!");語句,向控制臺(tái)打印hello, 在下石同學(xué)!這一串字符。

同時(shí),我們查看發(fā)現(xiàn)項(xiàng)目多了一個(gè)build文件夾和名為wave.vcd的波形文件,這都是編譯過程生成的文件。

項(xiàng)目編譯就完成了,要查看 RTL仿真波形圖,我們只需要接著在命令行輸入指令make plot:

屏幕中立刻彈出 RTL 仿真波形圖,我們可以點(diǎn)擊查看:

我們?cè)诿钚休斎胫噶頼ake clean,可將編譯生成的文件全部刪除掉,方便下一次重新編譯。

我們記住用戶的三條指令:

  • make:完成整個(gè)編譯過程并生成波形圖文件
  • make clean:清理所有的編譯生成文件
  • make plot:繪制波形圖

**到此為止,我們就可以愉快的進(jìn)行 verilog/VHDL 代碼仿真啦! **

該項(xiàng)目源碼我已經(jīng)上傳到我的 github 倉庫上面啦,大家可以直接下載:

github URL:https://github.com/nezhajun/full_adder

安裝了git的小伙伴也可以使用git clone下載:

$git clone https://github.com/nezhajun/full_adder.git

文中涉及相關(guān)軟件工具下載鏈接和參考:









歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1