|Testbench 简单仿真代码

Testbench 简单仿真代码

作者: 石志超更新于: 2026/2/27

TB 只用于仿真,不可综合

Vivado 中:新建 TB 文件(tb_top.v),右键 TB 文件 → Set as Top → Run Behavioral Simulation

`timescale 1ns / 1ps  // 时间单位 1ns,精度 1ps

module tb_top;  // TB 模块没有端口!

// 声明激励信号(用 reg,因为 TB 主动驱动)
reg  clk, rst_n;
wire [3:0] led;        // 输出用 wire 接收

// 实例化被测模块(DUT = Device Under Test)
top u_dut (
    .sys_clk   (clk),    // .被测端口名 (TB信号名)
    .sys_rst_n (rst_n),
    .led       (led)
);

// 生成 50MHz 时钟:每 10ns 翻转 = 周期 20ns
initial clk = 0;
always #10 clk = ~clk;  // #10 = 延迟 10ns

// 测试激励序列
initial begin
    rst_n = 0;       // 一开始拉低复位
    #200;            // 等待 200ns(让复位生效)
    rst_n = 1;       // 释放复位,电路开始工作
    #1_000_000;      // 运行 1ms 观察波形
    $finish;         // 结束仿真
end

endmodule

本次使用的 top.v 经过修改以适应本次仿真:

module top (
    input        sys_clk,
    input        sys_rst_n,
    output [3:0] led
);

parameter CNT_MAX = 5 - 1;  // ★ 仿真用!5 clk 翻转 → 周期 10 clk

reg [24:0] cnt;
reg        led_r;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
        cnt   <= 0;
        led_r <= 1'b0;
    end else if (cnt >= CNT_MAX) begin
        cnt   <= 0;
        led_r <= ~led_r;
    end else
        cnt <= cnt + 1;
end

assign led = ~{4{led_r}};

endmodule