72 lines
1.3 KiB
Verilog
72 lines
1.3 KiB
Verilog
`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 |