.PHONY的作用
https://www.cnblogs.com/yangjiquan/p/11475638.html
https://zhuanlan.zhihu.com/p/81305878
makelist 示例1
.PHONY:com cov clean debug
OUTPUT = cpu_top
#compile command
VCS = vcs -sverilog +v2k -timescale=1ns/1ns \
-debug_all \
+notimingcheck \
+nospecify \
+vcs+flush+all \
-o ${OUTPUT} \
-l compile.log \
#simulation command
SIM = ./${OUTPUT} -l ${OUTPUT}.log
#start compile
com:
${VCS} -f file_list.f
#start simulation
sim:
${SIM}
#show the coverage
cov:
dve -covdir *vdb &
#start debug commnd
debug:
dve -vpd ${output}.vpd &
#clean some file
clean:
rm -rf ./csrc *.daidir ./csrc *.log *.vpd *.vdb simv* *.key *race.out*
file_list.f文件内容如下:
-timescale=1ns/1ns
//Macro define
//+define+INC_COUNTER
//Source file
../rtl/cpu_top.v
../rtl/rom.v
../rtl/ram.v
//Testbench
../test_bench/cpu_top_tb.v
编译时在terminal中输入:make com
仿真时输入: make sim
清理文件时输入:make clean
示例 2
#-------------------
# 用户配置区域
#-------------------
# 基础配置
TB_TOP ?= tb_top # 测试平台顶层模块名
VCS_HOME ?= /opt/synopsys/vcs/X-2023.06 # 根据实际安装路径修改
TIMESCALE ?= 1ns/1ps # 默认时间精度
# 目录结构设置
SRC_DIR := ./src # RTL源代码目录
TB_DIR := ./testbench # 测试平台目录
INC_DIR := ./include # 包含文件目录
BUILD_DIR := ./build # 编译产物目录
SIM_DIR := ./sim # 仿真输出目录
COV_DIR := $(SIM_DIR)/cov # 覆盖率目录
# 文件列表(自动搜索或手动指定)
VLOG_SRC := $(shell find $(SRC_DIR) -name '*.v' -o -name '*.sv')
TB_SRC := $(shell find $(TB_DIR) -name '*.sv')
#-------------------
# 编译选项
#-------------------
VCS_OPTS += -full64 # 强制64位模式
VCS_OPTS += -sverilog # 支持SystemVerilog
VCS_OPTS += -debug_access+all # 启用调试功能
VCS_OPTS += -timescale=$(TIMESCALE)
VCS_OPTS += +incdir+$(INC_DIR)
VCS_OPTS += -o $(BUILD_DIR)/simv # 指定输出路径
VCS_OPTS += -l $(BUILD_DIR)/compile.log # 编译日志
#-------------------
# 仿真选项
#-------------------
SIM_OPTS += -l $(SIM_DIR)/sim.log # 仿真日志
SIM_OPTS += +vcs+flush+log # 实时刷新日志
SIM_OPTS += -assert finish_maxfail=100 # 错误断言限制
#-------------------
# 主要指令
#-------------------
.PHONY: all compile sim clean help
all: compile sim # 默认目标:编译后立即运行仿真
# 编译阶段
compile: $(BUILD_DIR)/simv
$(BUILD_DIR)/simv: $(VLOG_SRC) $(TB_SRC)
mkdir -p $(BUILD_DIR) $(SIM_DIR)
vcs $(VCS_OPTS) $(VLOG_SRC) $(TB_SRC)
# 仿真运行
sim: $(BUILD_DIR)/simv
cd $(SIM_DIR) && ../$< $(SIM_OPTS)
# 清理生成文件
clean:
rm -rf $(BUILD_DIR) $(SIM_DIR)
rm -rf csrc DVEfiles ucli.key *.vpd *.vdb *.log
# 帮助信息
help:
@echo "--------------- 使用说明 ---------------"
@echo "make compile # 仅编译设计"
@echo "make sim # 运行仿真(需先编译)"
@echo "make all # 编译后立即运行仿真(默认)"
@echo "make clean # 删除所有生成文件"
@echo "make debug # 带DVE调试的编译(需GUI)"
@echo "make coverage # 生成覆盖率报告"
@echo "----------------------------------------"
#-------------------
# 高级模式
#-------------------
# 调试模式(启用DVE)
debug: VCS_OPTS += -R -gui +vcs+vcdpluson
debug: all
# 覆盖率收集
coverage: VCS_OPTS += -cm line+cond+fsm+tgl
coverage: SIM_OPTS += -cm_dir $(COV_DIR)/test_cov
coverage: clean all
urg -dir $(COV_DIR)/test_cov -report $(COV_DIR)/report
@echo "覆盖率报告生成于: $(COV_DIR)/report"
# 门级仿真支持(示例)
GATE_SIM: VCS_OPTS += +delay_mode_zero +no_notifier
GATE_SIM: SRC_DIR := ./syn/netlist
GATE_SIM: VLOG_SRC := $(shell find $(SRC_DIR) -name '*.v')
GATE_SIM: compile
自动加载文件名 修正版
#-------------------
# 用户配置区域
#-------------------
SRC_DIR := ./src # 源文件目录
FILELIST := filelist.f # 文件名列表文件
#-------------------
# 主要指令
#-------------------
.PHONY: all generate_filelist clean
all: generate_filelist # 默认目标:生成文件列表
# 生成文件列表
generate_filelist:
@echo "Generating filelist.f..."
@cd $(SRC_DIR) && ls > ../$(FILELIST)
@echo "Filelist generated at $(FILELIST)"
# 清理生成文件
clean:
rm -f $(FILELIST)
注意事项
路径问题:
cd $(SRC_DIR) 进入 SRC_DIR 目录后,ls 的输出会写入到上级目录的 filelist.f 文件中(通过 > ../$(FILELIST))。
如果希望将 filelist.f 文件直接生成在 SRC_DIR 目录中,可以修改为:
makefile
@cd $(SRC_DIR) && ls > $(FILELIST)
文件名格式:
ls 命令输出的文件名是按字母顺序排列的,且不包括隐藏文件(以 . 开头的文件)。
如果需要包含隐藏文件或递归列出子目录中的文件,可以使用 ls -a 或 find 命令。
扩展性:
如果需要支持更多文件类型(如 .sv),可以修改 ls 命令为:
makefile
@cd $(SRC_DIR) && ls *.v *.sv > ../$(FILELIST)
优化
通过 ls命令生成filelist后,里面只有文件名字 没有前面的路径。怎么再生成filelist里面文件名时都加上路径${SRC_DIR}
#-------------------
# 用户配置区域
#-------------------
SRC_DIR := ./src # 源文件目录
FILELIST := filelist.f # 文件名列表文件
#-------------------
# 主要指令
#-------------------
.PHONY: all generate_filelist clean
all: generate_filelist # 默认目标:生成文件列表
# 生成文件列表(添加路径前缀)
generate_filelist:
@echo "Generating filelist.f with paths..."
@cd $(SRC_DIR) && for file in *.v *.sv; do \
if [ -f "$$file" ]; then \
echo "$(SRC_DIR)/$$file" >> ../$(FILELIST); \
fi; \
done
@echo "Filelist generated at $(FILELIST)"
# 清理生成文件
clean:
rm -f $(FILELIST)
cd .path && ls > filename.txt 如何改进上面命令同时将路径和文件名写入filename.txt中
cd .path && ls | sed “s|^|$(realpath .path)/|” > filename.txt
cd .path && find . | sed ‘s|^./|.path/|’ > filename.txt
cd .path && find . -type f | sed “s|^./|${PATH}/|” > filename.txt