VCS-Makefile

本文介绍了Makefile中的.PHONY目标的作用,它用于指示Make命令即使目标文件存在也不跳过编译。文章还详细展示了如何配置和使用VCS进行编译和仿真,包括编译命令、仿真命令、覆盖率检查和调试步骤。通过输入特定指令,如'make com'进行编译,'make sim'进行仿真,以及'make clean'清理文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.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

参考
VCS查看代码覆盖率
makeflie脚本
VCS查看覆盖率,并使用dve查看

### 解决方案 当遇到 `vcs-mx` 报错 `'Cannot find VCS compiler'` 的问题时,通常是因为编译器路径未正确配置或者缺少必要的环境变量。以下是可能的原因以及解决方案: #### 可能原因分析 1. **环境变量缺失** 如果系统的 PATH 或其他相关环境变量中未包含 VCS 编译器的安装路径,则会触发此错误。 2. **C 编译器选项冲突** 使用 `-override-cflags` 参数可以阻止 VCS 将其默认选项传递给 C 编译器[^1]。如果存在不兼容的标志或参数设置不当,也可能引发该问题。 3. **VCS 安装损坏或不完整** 若 VCS 工具本身未正确安装,可能导致无法找到所需的编译器组件。 --- #### 配置与排查方法 ##### 1. 检查并修复环境变量 确认系统中的环境变量已正确定义 VCS 和 GCC/G++ 路径。可以通过以下命令验证: ```bash echo $PATH which vcs-mx ``` 如果没有返回有效的路径,需手动添加到 `.bashrc` 或 `.cshrc` 文件中: ```bash export PATH=/path/to/vcs/bin:$PATH ``` ##### 2. 设置正确的 CFLAGS 通过指定自定义的 C 编译器标志来覆盖默认行为。例如,在运行脚本前加入如下内容: ```bash export CFLAGS="-std=c99 -O2" export CPPFLAGS="-I/path/to/include" export LDFLAGS="-L/path/to/lib" ``` 这一步有助于避免因默认选项引起的潜在冲突。 ##### 3. 明确调用特定版本的编译器 有时,默认使用的 GCC 版本可能不符合需求。尝试显式指明所需版本号: ```bash CC=gcc-8 CXX=g++-8 ./run_vcs.sh ``` ##### 4. 更新许可证文件 确保当前用户的许可密钥有效,并指向最新版的服务端地址。对于某些企业级部署场景来说尤为重要。 ##### 5. 测试最小化实例 创建简单的测试项目以排除复杂工程结构带来的干扰因素。比如编写一个基础 Verilog 文件后执行下面指令观察效果如何变化: ```tcl vlog test.v vsim work.testbench ``` --- ### 示例代码片段 假设我们有一个名为 `test_module.sv` 的 SystemVerilog 文件,可按如下方式启动仿真流程而无需遭遇上述异常情况: ```makefile # Makefile Example VCS_FLAGS += -R -debug_all $(EXTRA_ARGS) all: compile run compile: vcs-mx +acc -sverilog -timescale=1ns/1ps \ $(VCS_FLAGS) test_module.sv -o simv run: ./simv |& tee transcript.log ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值