一个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"
posted @ 2025-03-01 00:09  MKYC  阅读(119)  评论(0)    收藏  举报