1. 创建第一个VCS仿真工程
任务目标
创建一个最小化的Verilog计数器模块,使用VCS完成编译、仿真,并生成VPD波形文件供DVE/Verdi查看,验证计数器功能正确。
环境依赖
- VCS(Synopsys VCS MX)已安装并加入PATH
- Linux环境(本文以bash为例)
设计文件:counter.v
module counter (
input wire clk,
input wire rst_n,
output reg [3:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 4'd0;
else
count <= count + 1'b1;
end
endmodule
测试平台:tb_counter.v
`timescale 1ns/1ps
module tb_counter;
reg clk;
reg rst_n;
wire [3:0] count;
counter dut (
.clk (clk),
.rst_n (rst_n),
.count (count)
);
initial begin
clk = 0;
rst_n = 0;
#20 rst_n = 1;
end
always #5 clk = ~clk;
initial begin
$vcdpluson; // 生成VPD波形
#200;
$vcdplusoff;
$finish;
end
// 自动检查:复位释放后,count应在每个时钟上升沿递增
reg [3:0] expected;
always @(posedge clk) begin
if (rst_n) begin
expected = (expected === 4'bx) ? 4'd0 : expected + 1'b1;
if (count !== expected) begin
$display("ERROR at time %0t: expected %0d, got %0d", $time, expected, count);
$finish;
end
end
end
initial begin
expected = 4'bx;
#200;
$display("Test completed successfully");
$finish;
end
endmodule
编译与仿真命令
# 编译(生成可执行文件 simv)
vcs -sverilog counter.v tb_counter.v -o simv
# 运行仿真(生成 vcdplus.vpd 波形文件)
./simv
验证方法
- 功能验证:仿真运行后,终端输出
Test completed successfully表示计数器递增逻辑正确;若输出ERROR则说明计数与预期不符。 - 波形查看:仿真结束后,当前目录下生成
vcdplus.vpd文件。使用以下命令打开波形:
dve -vpd vcdplus.vpd &
# 或使用 Verdi:
# verdi -vpd vcdplus.vpd &
在波形窗口中添加 tb_counter.clk、tb_counter.rst_n、tb_counter.count 信号,观察复位释放后 count 在每个时钟上升沿从0递增到15后回绕到0,即验证通过。
预期输出
Test completed successfully
该输出由测试平台中的自动比较逻辑产生,只要计数器行为正确即会打印此信息。
常见问题
- vcs命令找不到:确认VCS安装路径已加入
PATH,或使用完整路径调用。 - 波形文件未生成:检查测试平台中
$vcdpluson是否在仿真结束前被调用,且仿真正常执行到$finish。 - 编译报错:确认文件后缀为
.v,且VCS版本支持-sverilog选项(若使用旧版本,可去掉该选项,本设计为Verilog-2001兼容)。