一个vcs编译&仿真的MK脚本
摘要
该脚本由DS生成,实用性有待检验,仅供参考。
详细代码
# Makefile for VCS compilation and Verdi simulation with testcase control
# 基础配置
VCS := vcs
VERDI := verdi
TOP_MODULE ?= top_module # 默认顶层模块(可通过命令行覆盖)
TEST ?= default_test # 默认测试用例名称
SRC_DIR := src
INC_DIR := include
BUILD_DIR := build
LOG_DIR := log
WAVE_DIR := waves
TB_DIR := testbench
# 路径配置
SIMV := $(BUILD_DIR)/simv.$(TEST)
FSDB_FILE := $(WAVE_DIR)/waves_$(TEST).fsdb
COMP_LOG := $(LOG_DIR)/compile_$(TEST).log
SIM_LOG := $(LOG_DIR)/sim_$(TEST).log
# 编译选项
VCS_BASE_OPTS := -full64 -sverilog +v2k -debug_access+all -lca -kdb
VCS_EXTRA_OPTS ?= # 额外编译选项(命令行覆盖)
VCS_OPTS := $(VCS_BASE_OPTS) \
-top $(TOP_MODULE) \
+define+TESTNAME=$(TEST) \
-o $(SIMV) \
$(VCS_EXTRA_OPTS)
# 仿真选项
SIM_BASE_OPTS := +fsdb+autoflush +fsdb+parallel=on
SIM_EXTRA_OPTS ?= # 额外仿真选项(命令行覆盖)
SIM_OPTS := $(SIM_BASE_OPTS) \
+TESTNAME=$(TEST) \
+FSDB_NAME=$(FSDB_FILE) \
$(SIM_EXTRA_OPTS)
# 文件收集
SRC_FILES := $(wildcard $(SRC_DIR)/*.v $(SRC_DIR)/*.sv)
TB_FILES := $(wildcard $(TB_DIR)/*.sv)
INC_FILES := $(addprefix -I ,$(INC_DIR))
# 伪目标
.PHONY: all compile run verdi clean help
# 默认目标
all: compile run
# 编译规则
compile: $(BUILD_DIR) $(LOG_DIR)
$(VCS) $(VCS_OPTS) \
$(INC_FILES) \
$(SRC_FILES) \
$(TB_FILES) \
-l $(COMP_LOG)
@echo "Compilation log: $(COMP_LOG)"
# 运行仿真
run: $(WAVE_DIR)
$(SIMV) $(SIM_OPTS) -l $(SIM_LOG)
@echo "Simulation log: $(SIM_LOG)"
@echo "Waveform file: $(FSDB_FILE)"
# 查看波形
verdi:
$(VERDI) \
-ssf $(FSDB_FILE) \
-top $(TOP_MODULE) \
-nologo &
# 目录创建
$(BUILD_DIR) $(LOG_DIR) $(WAVE_DIR):
mkdir -p $@
# 清理
clean:
rm -rf $(BUILD_DIR) $(LOG_DIR) $(WAVE_DIR)
rm -rf csrc simv.daidir ucli.key *.fsdb *.log
# 帮助信息
help:
@echo "VCS/Verdi项目管理Makefile"
@echo "可用命令:"
@echo " make compile - 编译项目 (TEST=testname VCS_EXTRA_OPTS=...)"
@echo " make run - 运行仿真 (TEST=testname SIM_EXTRA_OPTS=...)"
@echo " make verdi - 查看波形 (TEST=testname)"
@echo " make all - 编译并运行"
@echo " make clean - 清理项目"
@echo ""
@echo "高级控制:"
@echo " TEST=test_case1 - 指定测试用例名称"
@echo " TOP_MODULE=mytop - 指定顶层模块"
@echo " VCS_EXTRA_OPTS=...- 添加额外编译选项"
@echo " SIM_EXTRA_OPTS=...- 添加额外仿真选项"
@echo ""
@echo "示例:"
@echo " make compile TEST=smoke_test VCS_EXTRA_OPTS='-timescale=1ns/1ps'"
@echo " make run TEST=smoke_test SIM_EXTRA_OPTS='+ntb_random_seed=123'"
@echo " make verdi TEST=smoke_test"