Files
IC_PRJ/tb/tb_array_wr.v

151 lines
4.8 KiB
Verilog
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

`timescale 1ns/1ps
module tb_array_wr();
// 时钟和复位信号
reg clk;
reg rst_n;
// 输入信号DUT 的输入)
reg array_wr_frame_valid;
reg [151:0] array_wr_frame_data;
reg [7:0] array_inner_tras;
reg [7:0] array_inner_trp;
reg [7:0] array_inner_trcd_wr;
reg [7:0] array_inner_twr;
// 输出信号DUT 的输出)
wire array_wr_frame_ready;
wire array_wr_done;
wire array_wr_csn;
wire [15:0] array_wr_raddr;
wire array_caddr_vld_wr;
wire [5:0] array_caddr_wr;
wire array_wdata_vld;
wire [127:0] array_wdata;
// 实例化被测试模块DUT
array_wr u_array_wr(
.clk (clk),
.rst_n (rst_n),
.array_wr_frame_valid(array_wr_frame_valid),
.array_wr_frame_data(array_wr_frame_data),
.array_wr_frame_ready(array_wr_frame_ready),
.array_wr_done (array_wr_done),
.array_wr_csn (array_wr_csn),
.array_wr_raddr (array_wr_raddr),
.array_caddr_vld_wr (array_caddr_vld_wr),
.array_caddr_wr (array_caddr_wr),
.array_wdata_vld (array_wdata_vld),
.array_wdata (array_wdata),
.array_inner_tras (array_inner_tras),
.array_inner_trp (array_inner_trp),
.array_inner_trcd_wr(array_inner_trcd_wr),
.array_inner_twr (array_inner_twr)
);
// 生成时钟50MHz周期 20ns
initial begin
clk = 1'b0;
forever #10 clk = ~clk;
end
// 主测试流程
initial begin
// 初始化信号
rst_n = 1'b0;
array_wr_frame_valid = 1'b0;
array_wr_frame_data = 152'd0;
array_inner_tras = 8'd3; // 示例值TRAS = 3 个时钟周期
array_inner_trp = 8'd2; // 示例值TRP = 2 个时钟周期
array_inner_trcd_wr = 8'd2; // 示例值TRCD_WR = 2 个时钟周期
array_inner_twr = 8'd2; // 示例值TWR = 2 个时钟周期
// 复位释放10 个时钟周期后)
#200;
rst_n = 1'b1;
#20;
// 测试场景 1单帧数据写入含 SOF 和 EOF
$display("=== 测试场景 1单帧数据写入 ===");
send_frame(
1'b1, // 起始标志
1'b1, // 结束标志(单帧)
16'h1234,// 地址
6'h05, // 列地址
128'hA5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 // 数据
);
wait(array_wr_done); // 等待写入完成
#100;
// 测试场景 2多帧数据写入首帧 SOF末帧 EOF
$display("=== 测试场景 2多帧数据写入 ===");
// 第一帧SOF=1EOF=0
send_frame(
1'b1,
1'b0,
16'h5678,
6'h0A,
128'h55AA55AA55AA55AA55AA55AA55AA55AA
);
#20;
// 第二帧SOF=0EOF=1
send_frame(
1'b0,
1'b1,
16'h5678, // 地址与前一帧相同(连续写入)
6'h0B,
128'hAA55AA55AA55AA55AA55AA55AA55AA55
);
wait(array_wr_done); // 等待写入完成
#100;
// 测试场景 3无输入时的空闲状态
$display("=== 测试场景 3空闲状态验证 ===");
array_wr_frame_valid = 1'b0;
#200;
// 测试结束
$display("=== 所有测试场景完成 ===");
$finish;
end
// 任务:发送一帧数据(封装输入信号逻辑)
task send_frame;
input wsof; // 帧起始标志
input weof; // 帧结束标志
input [15:0] wraddr; // 写入地址
input [5:0] wcaddr; // 列地址
input [127:0] wdata; // 写入数据
begin
// 等待模块就绪ready 信号为高)
wait(array_wr_frame_ready);
#10; // 延迟一小段时间
// 驱动输入信号
array_wr_frame_valid = 1'b1;
array_wr_frame_data = {wsof, weof, wraddr, wcaddr, wdata}; // 拼接帧数据
#20; // 保持一个时钟周期
// 撤销有效信号
array_wr_frame_valid = 1'b0;
array_wr_frame_data = 152'd0;
end
endtask
initial begin
$fsdbDumpfile("tb.fsdb");
$fsdbDumpvars(0,tb_array_wr,"+all");
$vcdpluson;
$vcdplusmemon;
end
// 监控关键信号变化(可选,用于调试)
initial begin
$monitor(
"Time: %0t, State: %h, CSN: %b, Ready: %b, Done: %b, Valid: %b",
$time, u_array_wr.cur_state, array_wr_csn, array_wr_frame_ready, array_wr_done, array_wdata_vld
);
end
endmodule