3、Linux基础与工具链:Linux常用命令、VCS/QuestaSim等仿真工具安装与配置、Makefile基础

说实话,很多刚入行的朋友觉得验证就是写写SystemVerilog,跑跑仿真。但真到了项目里,你会发现Linux操作和工具链配置才是第一道坎。我见过不少同事,代码写得挺溜,结果连个文件权限都不会改,折腾半天。这一章,咱们就把这些基本功捋一遍。

本章核心脉络:Linux命令是日常操作的基础 → 仿真工具(VCS/QuestaSim)是吃饭的家伙 → Makefile则是把这些串起来的“胶水”。三者缺一不可。

验证环境搭建 Linux常用命令 文件操作 · 权限 · 进程 仿真工具链 VCS · QuestaSim · 配置 Makefile基础 自动化编译 · 依赖管理 三者协同:命令操作 → 工具调用 → 流程自动化

3.1 Linux常用命令——别只会cd和ls

我个人习惯把Linux命令分成几类来记,这样不容易乱。你想想看,验证工程师每天打交道最多的就是文件、进程和文本。

3.1.1 文件操作三板斧

  • ls -l:查看文件权限和详细信息。我刚开始总忘记加-l,结果啥也看不出来。
  • chmod +x:给脚本加执行权限。嗯,这个几乎每天都要用。
  • find . -name "*.v":找文件。项目大了,文件散落在各个目录,这命令能救命。

我的小技巧:用 grep -r "关键字" . 来搜索代码里的信号名或模块名。比用IDE的搜索快多了。

3.1.2 进程管理——别让仿真卡死

跑仿真的时候,有时候会卡住。我曾经遇到过仿真跑了三天没出结果,后来发现是进程僵死了。

  • ps -ef | grep vcs:查看VCS进程是否在跑。
  • kill -9 PID:强制杀掉进程。注意,-9是最后手段,先试试kill不带参数。
  • top:看CPU和内存占用。仿真吃内存,如果发现内存快满了,赶紧检查。

注意:kill -9 会直接终止进程,不会做任何清理。如果仿真正在写波形文件,可能会损坏文件。我一般先用 kill -15 试试。

3.1.3 文本处理——grep和sed是神器

说白了,验证工作一半时间在写代码,另一半时间在看log。log文件动不动就几万行,你总不能一行行翻吧?

  • grep "Error" sim.log:快速定位错误。
  • sed -i 's/old/new/g' file:批量替换文本。我经常用它来改模块实例化的名字。
  • awk '{print $1}' file:提取某一列数据。比如从波形文件里提取时间戳。

3.2 仿真工具安装与配置——VCS和QuestaSim

工具安装这事儿,说难不难,说简单也不简单。我记得第一次装VCS的时候,光环境变量就折腾了一下午。后来发现,其实就是几个关键点。

3.2.1 VCS安装要点

步骤 操作 常见坑
1. 解压安装包 tar -xvf vcs.tar.gz 磁盘空间不足,至少留10GB
2. 设置环境变量 export VCS_HOME=/tools/vcs 路径写错,导致命令找不到
3. 配置license export LM_LICENSE_FILE=port@server 端口号或服务器地址不对
4. 验证安装 vcs -version 如果报错,检查依赖库

避坑指南:我曾经因为忘记安装g++编译器,导致VCS编译报错。VCS依赖C++编译器来生成仿真可执行文件。所以装VCS之前,先确认系统有gcc和g++。

3.2.2 QuestaSim配置

QuestaSim(以前叫ModelSim)的安装和VCS类似,但有个区别:它需要配置MODEL_TECH变量指向安装目录下的bin文件夹。

# 典型的QuestaSim环境变量设置
export QUESTA_HOME=/tools/questa
export MODEL_TECH=$QUESTA_HOME/linux_x86_64
export PATH=$MODEL_TECH:$PATH
export LM_LICENSE_FILE=1702@license_server

嗯,这里要注意:linux_x86_64这个目录名可能因版本不同而不同。我建议装完后先ls一下看看实际目录名。

3.2.3 两种工具的选择

  • VCS:速度快,适合大型SoC验证。但license贵,公司一般只买几个。
  • QuestaSim:功能全,调试界面友好。个人学习用的话,有免费的Student版。

我个人习惯:项目前期用QuestaSim做单元测试,后期用VCS跑回归。这样既省钱又高效。

3.3 Makefile基础——让编译自动化

你想想看,每次修改代码都要手动敲一遍编译命令,是不是很烦?Makefile就是解决这个问题的。它帮你记住依赖关系,只重新编译修改过的文件。

3.3.1 最简单的Makefile

# 目标: 依赖文件
simv: top.sv testbench.sv
    vcs -full64 top.sv testbench.sv -o simv

# 运行仿真
run: simv
    ./simv

# 清理
clean:
    rm -rf simv csrc *.log

这个例子很简单:simv依赖于top.sv和testbench.sv。如果这两个文件没变,Make就不会重新编译。我在项目中就用这个套路,省了不少时间。

3.3.2 变量和模式规则

项目大了,文件多了,硬编码文件名就不现实了。这时候要用变量和模式规则。

# 定义变量
SRC = top.sv testbench.sv
VCS_FLAGS = -full64 -sverilog

# 模式规则:%.o 依赖 %.sv
%.o: %.sv
    vcs $(VCS_FLAGS) $< -o $@

# 伪目标
.PHONY: clean run

simv: $(SRC)
    vcs $(VCS_FLAGS) $(SRC) -o simv

run: simv
    ./simv

clean:
    rm -rf simv csrc *.log *.o

我的经验:$<表示第一个依赖文件,$@表示目标文件。这两个自动变量用熟了,写Makefile就跟玩似的。

3.3.3 实战:完整的仿真Makefile

下面这个是我在项目中常用的模板,包含了编译、运行、波形查看和清理。

# 项目配置
PROJECT = my_project
TOP = top
SRC = $(wildcard *.sv) $(wildcard *.v)
VCS_FLAGS = -full64 -sverilog -debug_all
WAVE_FILE = $(PROJECT).vcd

# 编译
compile: $(SRC)
    vcs $(VCS_FLAGS) $(SRC) -o $(PROJECT).simv

# 运行并生成波形
run: compile
    ./$(PROJECT).simv +vcd=$(WAVE_FILE)

# 查看波形
wave: run
    verdi -ssf $(PROJECT).vcd &

# 清理
clean:
    rm -rf $(PROJECT).simv csrc *.log *.vcd DVEfiles

.PHONY: compile run wave clean

注意:wildcard函数会匹配当前目录下所有.sv和.v文件。如果你的文件在子目录里,需要加上路径,比如$(wildcard src/*.sv)。

3.4 本章小结

说白了,这一章讲的就是验证工程师的“基本功”。Linux命令让你能操作环境,仿真工具让你能跑验证,Makefile让你能自动化。这三样东西,就像厨师手里的刀、锅、灶,缺一个都做不出菜来。

我个人建议:别急着学复杂的UVM或者断言,先把这些基础打牢。我见过太多人,UVM理论背得滚瓜烂熟,结果连个仿真都跑不起来,那才叫尴尬。

可可精品资料库