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如步驟3圖示,輸入"make debug",顯示波形如下圖所示。



沒有留言:

張貼留言