2026年4月29日 星期三

在Windows下使用Visual Studio Code編輯Verilog HDL與QuestaSim模擬波形,並使用Makefile進行編譯與模擬流程

1. 設定專案前確認電腦的Windows安裝與設定。

       a. 安裝Visual Studio Code,並設定好支援Verilog語法插件。

       b. 安裝編譯與模擬波形的QuestaSim。

       c. 下載Mingw-w64與設定環境變數。

        Mingw-w64設定步驟

2. 設定專案資料夾,如下圖所示。


3. 專案資料夾"Sample"下,sim下增加wave.do的Tcl script,src下為自己設計的RTL code,tb下為testbench,Makefile放在專案資料夾下,如下圖所示。

4. 開啟Visual Studio Code編輯程序。

########Test.v########

module Test(a, b, c, d, En, Sel, f);

input  a, b, c, d, En, Sel;

output f;


wire   f;

wire   g, h, i, j;


assign g = a | b;

assign i = g & En;

assign h = c | d;

assign j = h & En;

assign f = (Sel==1'b0) ? i : j;


endmodule


########testbench.v########
`timescale 1ns / 1ns
module testbench;

reg a, b, c, d, En, Sel;

wire f;

Test UUT(
  .a(a),
  .b(b),
  .c(c),
  .d(d),
  .En(En),
  .Sel(Sel),
  .f(f) );

initial

begin
 a   = 1'b0; // Time = 0
 b   = 1'b1;
 c   = 1'b0;
 d   = 1'b1;
 En  = 1'b0;
 Sel = 1'b0;

 #20;    // Time = 20
 a  = 1'b1;
 #10;    // Time = 30
 b  = 1'b0;
 c  = 1'b1;
 #10;    // Time = 40
 a  = 1'b0;
 #10;    // Time = 50
 En = 1'b1;
 #10;    // Time = 60
 c  = 1'b0;
 #10;    // Time = 70
 a  = 1'b1;
 d  = 1'b0;
 #20;    // Time = 90
 c  = 1'b1;
 #20;    // Time = 110
 a  = 1'b0;
 #10;    // Time = 120
 a  = 1'b1;
 #10;    // Time = 130
 c  = 1'b0;
 Sel= 1'b1;
 #10;    // Time = 140
 a  = 1'b0;
 #30;    // Time = 170
 a  = 1'b1;
 #10;    // Time = 180
 c  = 1'b1;
 #20;    // Time = 200
 a  = 1'b0;
end

endmodule


########wave.do########
#QuestaSim's Tcl script

view wave
log -r /*
#add wave -r /*
#add wave -group "IO"  sim:/testbench/*
add wave -group "INPUTS"  sim:/testbench/UUT/a
add wave -group "INPUTS"  sim:/testbench/UUT/b
add wave -group "INPUTS"  sim:/testbench/UUT/c
add wave -group "INPUTS"  sim:/testbench/UUT/d
add wave -group "INPUTS"  sim:/testbench/UUT/En
add wave -group "INPUTS"  sim:/testbench/UUT/Sel
add wave -group "OUTPUTS"  sim:/testbench/UUT/f

run -all


########Makefile########
# ========= Project Configuration =========
TOP = testbench

SRC_DIR = src
TB_DIR  = tb
SIM_DIR = sim
LOG_DIR = log

LIB = work

# Automatically collect Verilog files
SRC = $(wildcard $(SRC_DIR)/*.v)
TB  = $(wildcard $(TB_DIR)/*.v)

# ========= QuestaSim Path =========
QUESTA_HOME = C:/questasim64_10.6c/win64

VLIB = $(QUESTA_HOME)/vlib
VMAP = $(QUESTA_HOME)/vmap
VLOG = $(QUESTA_HOME)/vlog
VSIM = $(QUESTA_HOME)/vsim

# Log files
VLOG_LOG = $(LOG_DIR)/compile.log
VSIM_LOG = $(LOG_DIR)/sim.log

# ========= Default Target =========
.PHONY: build run wave debug rebuild clean
.DEFAULT_GOAL := build

# ========= Create log directory =========
$(LOG_DIR):
@if not exist $(LOG_DIR) mkdir $(LOG_DIR)

# ========= Compile =========
build: $(LOG_DIR)
@echo [INFO] Compiling design...
@if exist $(LIB) rmdir /s /q $(LIB)
$(VLIB) $(LIB)
$(VMAP) $(LIB) $(LIB)
$(VLOG) $(SRC) $(TB) > $(VLOG_LOG)

# ========= Run (CLI) =========
run: build
@echo [INFO] Running simulation (CLI)...
$(VSIM) -c $(TOP) -do "run -all; quit -f" > $(VSIM_LOG)

# ========= GUI + Wave =========
wave: build
$(VSIM) -gui -voptargs="+acc +fsmdebug" -debugDB $(TOP) -do "$(SIM_DIR)/wave.do"

# ========= Debug =========
debug: rebuild wave

# ========= Rebuild =========
rebuild: clean build

# ========= Clean =========
clean:
@echo [INFO] Cleaning project...
@if exist $(LIB) rmdir /s /q $(LIB)
@if exist transcript del /q transcript
@if exist vsim.wlf del /q vsim.wlf
@if exist *.dbg del /q *.dbg
@if exist vsim_stacktrace.vstf del /q vsim_stacktrace.vstf
@if exist modelsim.ini del /q modelsim.ini
@if exist $(LOG_DIR) rmdir /s /q $(LOG_DIR)

5. 輸入完成,在Visual Studio Code開啟Terminal如步驟4圖示,輸入"make debug",顯示波形如下圖所示。



Quartus使用QuestaSim進行模擬設定

1. 確認電腦上都安裝了Quartus與QuestaSim。

2. 點選"Tools" > "Options..."。


3. 點選"EDA Tool Options",在QuestaSim欄位輸入QuestaSim安裝的路徑,我這裡輸入"C:\questasim64_10.6c\win64",輸入完成按"OK"。

4. 這一步設定需要在專案中設定,當專案設定好且RTL code與testbench都轉寫好了,準備開始進行模擬,點選"Assignments" > "Settings..."。

5. 點選"Simulation",在"Tool name:"欄位中選擇"QuestaSim","Compile test bench:"欄位加入專案的testbench.v檔。

6. 設定完成開始模擬之後的結果如下圖所示,改用QuestaSim模擬。


Visual Studio Code支援Verilog語法離線安裝

 1. 先將可以上網的電腦安裝Visual Studio Code,再依據下圖步驟下載支援Verilog語法的VSIX檔案。



2. 將支援Verilog語法的VSIX檔案複製到離線的電腦上,依據下圖步驟安裝支援Verilog語法的VSIX檔案。


3. 選擇支援Verilog語法的VSIX檔案,按"Install"開始安裝。

4. 安裝完成後,在Visual Studio Code加入Verilog硬體描述語言,就可以看到關鍵字的色彩差異。

5. 至"https://github.com/universal-ctags/ctags-win32/releases"下載"ctags",這裡選擇"ctags-p6.2.20260426.0-x64.zip"版本下載。

6. 解壓縮後將檔案複製到離線電腦的"C:\Program Files"路徑下。

7. 開啟"環境變數"設定。

8. 點選使用者變數的"編輯"。

9. 點選"新增",將步驟6的ctags路徑輸入之後按"確定"。

10. 安裝完成後,可以測試看看是否有自動補全的功能。



2026年1月17日 星期六

Windows下執行makefile - Mingw-w64

1. 至Mingw-w64的網站下載執行檔,下載網址: https://www.mingw-w64.org/downloads/

2. 點選MinGW-W64-builds欄位。


3. 點選MinGW-W64-builds欄位下的GitHub。


4. 選擇下載版本,我這裡選擇"x86_64-15.2.0-release-posix-seh-ucrt-rt_v13-rev0"。

x86_64: 代表64-bit x86架構

15.2.0: GCC 15版本

release: 正式發布版本

posix: 使用POSIX threads API,在Windows上透過MinGW-W64實作,適合Linux/Windows跨平台程式

seh: Structured Exception Handling,Windows原生例外處理機制,僅支援x86_64,效能好

ucrt: 使用Universal C Runtime,微軟現代CRT(Windows 10+內建),與MSVC相容性高。

5. 下載至"C:\Program Files"並解壓縮。

6. 至"C:\Program Files\x86_64-15.2.0-release-posix-seh-ucrt-rt_v13-rev0\mingw64\bin"路徑下,點選"mingw32-make"。

7. 修改名稱為"make"。

8. 至"系統內容" > "環境變數"。

9. 點選"系統變數" > "Path" 後按"編輯"。

10. 按下"新增",增加"C:\Program Files\x86_64-15.2.0-release-posix-seh-ucrt-rt_v13-rev0\mingw64\bin"路徑後按"確定"。

11. 在搜尋欄位中輸入"cmd",開啟"命令提示字元"。

12. 輸入"make -v",顯示GNU Make的版本就表示設定成功。


**注意: 上述步驟不包含C語言所需要的函示庫,如要包含C語言函示庫+MinGW-W64請至"WinLibs.com"網頁下載。

13. 至下載網址:"https://winlibs.com/"

14. 點選下載連結。

15. 設定流程與步驟5相同。