`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