TailCorr/tb/tb_s2p_2.v

131 lines
2.9 KiB
Verilog

`timescale 1ns/1ps
module TB();
initial
begin
$fsdbDumpfile("TB.fsdb");
$fsdbDumpvars(0, TB);
end
// 信号声明
reg clk;
reg rst_n;
reg [15:0] din;
reg enable;
reg [21:0] cnt;
wire [15:0] dout0;
wire [15:0] dout1;
// 实例化被测模块
s2p_2 uut (
.clk (clk),
.rst_n (rst_n),
.din (din),
.en (enable),
.dout0 (dout0),
.dout1 (dout1)
);
reg[15:0] din_r1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
din_r1 <= 0;
end
else begin
din_r1 <= din;
end
end
wire signed [15:0] diff;
assign diff = din - din_r1;
reg[15:0] dout1_r1;
reg[15:0] dout1_r2;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout1_r1 <= 0;
dout1_r2 <= 0;
end
else begin
dout1_r1 <= dout1;
dout1_r2 <= dout1_r1;
end
end
wire signed [15:0] diff12;
wire signed [15:0] diff23;
assign diff12 = dout0 - dout1_r2;
assign diff23 = dout1 - dout0;
// 复位和使能控制
initial begin
rst_n = 0;
enable = 0;
clk = 1'b0;
din = 16'h0000;
// 复位保持20 ns
#20;
rst_n = 1;
// 等待复位释放后一个时钟周期
#10;
end
// 时钟生成
always #5 clk = ~clk; // 100MHz 时钟
// 计数器,控制生成数据的周期
always @(posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
cnt <= 22'd0;
end else begin
cnt <= cnt + 22'd1;
end
end
// 随机生成使能信号和输入数据
reg [15:0] enable_cnt;
always @(posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
enable <= 0;
din <= 16'd0;
enable_cnt <= 0; // 新增计数器,用于控制 enable 的持续时间
end else begin
// 随机控制使能信号的持续时间
if (cnt < 1000) begin // 控制数据生成的时长,模拟随机数据
if (enable_cnt == 0) begin
if ($urandom % 2 == 0) begin // 随机决定是否启动 enable
enable <= 1;
enable_cnt <= $urandom % 10 + 5; // 随机决定使能信号持续时间,范围 5~14 个时钟周期
din <= $urandom; // 随机生成 16 位数据
end else begin
enable <= 0;
din <= 16'd0; // 当不使能时,确保数据为 0
end
end else begin
// 如果使能信号已启动,继续保持 enable 高电平,直到计数器到达 0
enable <= 1;
enable_cnt <= enable_cnt - 1; // 每个时钟周期减少使能计数器
din <= $urandom; // 随机生成数据
end
end else begin
enable <= 0; // 超过指定时长后关闭 enable
din <= 16'd0; // 数据归零
end
end
end
// 终止仿真,随机次数的触发条件
initial begin
wait(cnt[11] == 1); // 控制仿真进行一段时间后结束
$finish;
end
endmodule