2025-02-26 15:50:49 +08:00
|
|
|
|
|
|
|
`timescale 1ns/1ps
|
|
|
|
|
|
|
|
module TB();
|
|
|
|
|
|
|
|
initial
|
|
|
|
begin
|
|
|
|
$fsdbDumpfile("TB.fsdb");
|
|
|
|
$fsdbDumpvars(0, TB);
|
|
|
|
end
|
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
reg clk;
|
|
|
|
reg rst_n;
|
|
|
|
reg [15:0] din;
|
|
|
|
reg enable;
|
|
|
|
reg [21:0] cnt;
|
|
|
|
wire [15:0] dout0;
|
|
|
|
wire [15:0] dout1;
|
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
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;
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
initial begin
|
|
|
|
rst_n = 0;
|
|
|
|
enable = 0;
|
|
|
|
clk = 1'b0;
|
|
|
|
din = 16'h0000;
|
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
#20;
|
|
|
|
rst_n = 1;
|
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
#10;
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
|
|
|
always #5 clk = ~clk;
|
2025-02-26 15:50:49 +08:00
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
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
|
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
reg [15:0] enable_cnt;
|
|
|
|
|
|
|
|
always @(posedge clk or negedge rst_n) begin
|
|
|
|
if (rst_n == 1'b0) begin
|
|
|
|
enable <= 0;
|
|
|
|
din <= 16'd0;
|
2025-03-03 18:10:00 +08:00
|
|
|
enable_cnt <= 0;
|
2025-02-26 15:50:49 +08:00
|
|
|
end else begin
|
2025-03-03 18:10:00 +08:00
|
|
|
|
|
|
|
if (cnt < 1000) begin
|
2025-02-26 15:50:49 +08:00
|
|
|
if (enable_cnt == 0) begin
|
2025-03-03 18:10:00 +08:00
|
|
|
if ($urandom % 2 == 0) begin
|
2025-02-26 15:50:49 +08:00
|
|
|
enable <= 1;
|
2025-03-03 18:10:00 +08:00
|
|
|
enable_cnt <= $urandom % 10 + 5;
|
|
|
|
din <= $urandom;
|
2025-02-26 15:50:49 +08:00
|
|
|
end else begin
|
|
|
|
enable <= 0;
|
2025-03-03 18:10:00 +08:00
|
|
|
din <= 16'd0;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
end else begin
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
enable <= 1;
|
2025-03-03 18:10:00 +08:00
|
|
|
enable_cnt <= enable_cnt - 1;
|
|
|
|
din <= $urandom;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
end else begin
|
2025-03-03 18:10:00 +08:00
|
|
|
enable <= 0;
|
|
|
|
din <= 16'd0;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2025-03-03 18:10:00 +08:00
|
|
|
|
2025-02-26 15:50:49 +08:00
|
|
|
initial begin
|
2025-03-03 18:10:00 +08:00
|
|
|
wait(cnt[11] == 1);
|
2025-02-26 15:50:49 +08:00
|
|
|
$finish;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
endmodule
|