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目录即可自动被编译,无需修改命令行。