131 lines
2.9 KiB
Verilog
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
|