第四章:仿真工具入门:VCS/Xcelium安装与配置、编译与运行仿真、波形查看基础
说实话,很多刚入行的朋友问我:「仿真工具不就是点一下运行吗?」
嗯,我当年也是这么想的。直到第一次用VCS跑一个百万门级的SoC,编译花了两个小时,结果跑出来全是X态……
从那以后我才明白:工具链的配置和流程,才是验证效率的基石。
这一章,咱们就聊聊仿真工具怎么装、怎么配、怎么跑、怎么看波形。
我会以VCS和Xcelium为例,因为这两家是目前工业界的主流。
4.1 安装与配置:别让环境卡住你
安装工具这件事,说白了就是「配环境」。
我个人习惯先把操作系统搞定——CentOS 7或RHEL 8都行,Ubuntu也能用,但官方支持最好的是Red Hat系。
4.1.1 环境变量设置
装完工具后,第一件事就是设环境变量。
我见过太多人卡在这一步——明明装好了,一敲vcs却说命令找不到。
以VCS为例,你需要在.bashrc或.cshrc里加上:
# bash用户
export VCS_HOME=/tools/synopsys/vcs/O-2018.09
export PATH=$VCS_HOME/bin:$PATH
export LM_LICENSE_FILE=27000@license_server
# csh/tcsh用户
setenv VCS_HOME /tools/synopsys/vcs/O-2018.09
setenv PATH ${VCS_HOME}/bin:${PATH}
setenv LM_LICENSE_FILE 27000@license_server
vcs -ID 确认版本和license都正常。
Xcelium的配置类似,只是路径不同:
export XCELIUM_HOME=/tools/cadence/xcelium/20.09
export PATH=$XCELIUM_HOME/tools/bin:$PATH
export CDS_LIC_FILE=5280@license_server
4.1.2 验证安装
配好之后,怎么确认装对了?
我的做法是写一个最简单的testbench:
// hello.v
module hello;
initial begin
$display("Hello, VCS!");
#10 $finish;
end
endmodule
然后跑一下:
vcs -R hello.v
如果看到「Hello, VCS!」,恭喜你,环境通了。
.bashrc 里加一个别名:alias vcs='vcs -full64'。因为现在基本都是64位设计,省得每次都要敲 -full64。
4.2 编译与运行仿真:从代码到波形
环境配好了,接下来就是真正的仿真流程。
VCS和Xcelium的流程其实大同小异,都是三步走:
- 编译(Compile):把RTL代码转成中间表示
- 优化(Elaborate):解析设计层次,建立仿真模型
- 运行(Run):执行仿真,生成波形
4.2.1 VCS编译与运行
VCS的编译命令很直接。假设你有一个计数器模块:
// counter.v
module counter (
input clk, rst_n,
output reg [7:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 8'h00;
else
count <= count + 1;
end
endmodule
对应的testbench:
// tb_counter.v
module tb_counter;
reg clk, rst_n;
wire [7:0] count;
counter u0 (.clk(clk), .rst_n(rst_n), .count(count));
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst_n = 0;
#20 rst_n = 1;
#200 $finish;
end
initial begin
$dumpfile("wave.vcd");
$dumpvars(0, tb_counter);
end
endmodule
编译运行:
vcs -full64 -R -debug_access+all tb_counter.v counter.v
这里 -debug_access+all 是为了生成波形用的。不加这个,你后面看波形时会发现信号全是空的。
-debug_access+all,结果波形文件是空的。后来我干脆写了个Makefile,把常用选项都固化进去。
4.2.2 Xcelium编译与运行
Xcelium的流程稍微不同,它分三步走:
# 第一步:编译
xmvlog tb_counter.v counter.v
# 第二步:优化
xmelab tb_counter
# 第三步:运行
xmsim tb_counter
如果想生成波形,需要在运行前加选项:
xmsim tb_counter -gui
或者用命令行方式:
xmsim tb_counter -input "database -open waves -shm; probe -create -shm -all; run; exit"
-shm 模式生成的波形文件比VCD小很多,而且打开速度快。我建议你优先用SHM格式,除非你要跟其他工具交换数据。
4.3 波形查看基础:学会「读图」
仿真跑完了,波形也生成了。但怎么看波形,其实是有门道的。
我见过有人盯着波形看半天,愣是没看出问题——说白了,就是不知道看什么。
4.3.1 打开波形文件
VCS生成的波形默认是VCD格式,用DVE或Verdi打开:
dve -vpd wave.vcd
# 或者
verdi -ssf wave.fsdb
Xcelium生成的是SHM格式,用SimVision打开:
simvision waves.shm &
4.3.2 波形查看的基本操作
打开波形后,你通常会看到这样的界面:
- 信号列表区:左侧显示所有信号名称
- 波形显示区:右侧显示信号随时间的变化
- 时间轴:顶部显示仿真时间
常用的操作:
| 操作 | 说明 |
|---|---|
| 添加信号 | 从左侧拖拽信号到波形区 |
| 放大/缩小 | 滚轮缩放,或按 z/Z |
| 测量时间 | 按住 Ctrl 点击两个位置 |
| 查找跳变 | 按 n/N 跳转到下一个/上一个跳变沿 |
| 添加标记 | 按 m 添加书签 |
4.3.3 调试技巧:从波形中找Bug
波形不是用来看的,是用来「审问」的。
我一般会按这个顺序检查:
- 看复位:复位信号有没有正常拉高?复位后所有寄存器是不是正确清零?
- 看时钟:时钟有没有毛刺?频率对不对?
- 看关键状态:状态机有没有跳到非法状态?计数器有没有溢出?
- 看数据通路:数据有没有在正确的时间出现在正确的位置?
sda 和 scl 的极性搞反了。所以看波形时,别忘了对照协议规范,确认信号电平是否符合预期。
4.4 常见问题与解决
仿真过程中,你肯定会遇到各种报错。我列几个最常见的:
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
| License check failed | license服务器连不上或过期 | 检查 LM_LICENSE_FILE 和服务器状态 |
| Cannot find design unit | 模块名拼写错误或文件未包含 | 检查模块名和文件列表 |
| Time precision mismatch | 不同模块的timescale不一致 | 统一使用 `timescale 1ns/1ps |
| VCD file too large | 仿真时间太长或信号太多 | 只dump关键信号,或改用FSDB/SHM格式 |
4.5 小结
这一章我们聊了仿真工具的安装配置、编译运行流程,以及波形查看的基本方法。
说白了,仿真就是「写代码→编译→跑→看波形→改代码」的循环。
刚开始可能会觉得繁琐,但等你熟练了,就会发现——仿真才是验证工程师最趁手的武器。
下一章,我们会深入SystemVerilog的断言和覆盖率,那才是真正让验证「自动化」的关键。