4. VCS中的文件列表管理
任务目标
在VCS仿真中,当RTL设计包含多个源文件时,直接在命令行逐一罗列文件会导致命令冗长且难以维护。本案例使用一个.f文件列表统一管理所有源文件,并通过通配符匹配同目录下多个文件,配合注释说明,将编译命令简化为一行。
环境准备
本案例需要VCS工具可用,并准备以下目录结构:
rtl/
counter.v
adder.v
top.v
tb/
testbench.sv
run.f
文件列表内容
创建run.f文件,内容如下:
// 编译选项
+timescale+1ns/1ps
// RTL源文件(使用通配符匹配rtl目录下所有.v文件)
../rtl/*.v
// 测试平台
../tb/testbench.sv
// 顶层模块(非必需,VCS自动识别)
// -top top
关键完整代码
为验证文件列表管理效果,提供最小可运行的RTL与测试平台代码。
// rtl/counter.v
module counter #(parameter WIDTH = 4) (
input logic clk,
input logic rst_n,
output logic [WIDTH-1:0] count
);
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) count <= '0;
else count <= count + 1'b1;
end
endmodule
// rtl/adder.v
module adder #(parameter WIDTH = 4) (
input logic [WIDTH-1:0] a,
input logic [WIDTH-1:0] b,
output logic [WIDTH-1:0] sum
);
assign sum = a + b;
endmodule
// rtl/top.v
module top (
input logic clk,
input logic rst_n,
output logic [3:0] count,
output logic [4:0] result
);
logic [3:0] count_w;
counter u_counter (.clk(clk), .rst_n(rst_n), .count(count_w));
adder u_adder (.a(count_w), .b(4'd1), .sum(result));
assign count = count_w;
endmodule
// tb/testbench.sv
module testbench;
logic clk;
logic rst_n;
logic [3:0] count;
logic [4:0] result;
top u_top (.*);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst_n = 0;
#20 rst_n = 1;
#100;
$display("count = %0d, result = %0d", count, result);
if (result == count + 1)
$display("TEST PASSED");
else
$display("TEST FAILED");
$finish;
end
endmodule
运行方式
在tb目录下执行以下命令:
vcs -f run.f -o simv
./simv
验证方法
观察仿真输出:
- 若文件列表正确解析,VCS将自动编译
rtl目录下所有.v文件及testbench.sv,无“Cannot open file”或“Module not found”错误。 - 仿真结束后打印
count = 10, result = 11(具体数值取决于仿真时长),并显示TEST PASSED。
通过条件:编译无错误,仿真输出包含TEST PASSED。若需添加新RTL文件,只需放入rtl目录即可自动被编译,无需修改命令行。