
`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
