`timescale 1ns/1ps module tb_counter8; // ---- 参数 ---- parameter CLK_PERIOD = 10; // 100MHz 时钟,周期 10ns // ---- 信号声明 ---- reg clk; reg rst_n; reg en; wire [7:0] count; wire overflow; // ---- 被测模块例化 ---- counter8 uut ( .clk (clk), .rst_n (rst_n), .en (en), .count (count), .overflow (overflow) ); // ---- 时钟生成 ---- initial clk = 0; always #(CLK_PERIOD/2) clk = ~clk; // ---- VCD 波形记录 ---- initial begin $dumpfile("tb_counter8.vcd"); $dumpvars(0, tb_counter8); end // ---- 复位与激励 ---- initial begin // 初始化 rst_n = 0; en = 0; // 复位保持 5 个时钟周期 repeat(5) @(posedge clk); rst_n = 1; // 使能计数,连续计数 200 个周期 @(posedge clk); en = 1; repeat(200) @(posedge clk); // 暂停使能,观察保持行为 en = 0; repeat(10) @(posedge clk); // 重新使能,再计数 60 个周期(观察溢出行为) en = 1; repeat(60) @(posedge clk); // 再次复位 rst_n = 0; repeat(3) @(posedge clk); rst_n = 1; repeat(5) @(posedge clk); $finish; end // ---- 监控关键事件 ---- always @(posedge clk) begin if (overflow) $display("[%0t ns] 溢出! count = %0d", $time, count); end endmodule