“`timescale 1ns / 1ps
module tb_Top_NUC;
//仅用于测试
//wr_fifo Interface
reg wrfifo_clr;
reg wrfifo_clk;
reg [15:0] wrfifo_din;
reg wrfifo_wren;
///////////////////////////////////////
wire mmcm_locked;
wire ui_clk;
wire init_calib_complete;
reg aresetn;
reg sys_clk_i;
reg sys_rst;
reg [15:0] expect_rd_data;
initial sys_clk_i = 1'b1;
always #2.5 sys_clk_i = ~sys_clk_i;
wire [13:0] ddr3_addr;
wire [2:0] ddr3_ba;
wire ddr3_cas_n;
wire [0:0] ddr3_ck_n;
wire [0:0] ddr3_ck_p;
wire [0:0] ddr3_cke;
wire ddr3_ras_n;
wire ddr3_reset_n;
wire ddr3_we_n;
wire [15:0] ddr3_dq;
wire [1:0] ddr3_dqs_n;
wire [1:0] ddr3_dqs_p;
wire [0:0] ddr3_cs_n;
wire [1:0] ddr3_dm;
wire [0:0] ddr3_odt;
parameter RD_AXI_BYTE_ADDR_BEGIN = 0 ;
parameter RD_AXI_BYTE_ADDR_END = 4095 ;
parameter WR_AXI_BYTE_ADDR_BEGIN = 0 ;
parameter WR_AXI_BYTE_ADDR_END = 4095 ;
parameter AXI_DATA_WIDTH = 64 ;
parameter AXI_ADDR_WIDTH = 32 ;
parameter AXI_ID_WIDTH = 4 ;
parameter AXI_ID = 4'b0000;
parameter AXI_BURST_LEN = 8'd15 ; //burst length = AXI_BURST_LEN+1
parameter RD_FIFO_ADDR_DEPTH = 16 ;
parameter WR_FIFO_ADDR_DEPTH = 64 ;
// Master Interface Write Address Ports
wire [AXI_ID_WIDTH-1:0] m_axi_awid ;
wire [AXI_ADDR_WIDTH-1:0] m_axi_awaddr ;
wire [7:0] m_axi_awlen ;
wire [2:0] m_axi_awsize ;
wire [1:0] m_axi_awburst ;
wire [0:0] m_axi_awlock ;
wire [3:0] m_axi_awcache ;
wire [2:0] m_axi_awprot ;
wire [3:0] m_axi_awqos ;
wire [3:0] m_axi_awregion;
wire m_axi_awvalid ;
wire m_axi_awready;
// Master Interface Write Data Ports
wire [AXI_DATA_WIDTH-1:0] m_axi_wdata ;
wire [AXI_DATA_WIDTH/8-1:0] m_axi_wstrb ;
wire m_axi_wlast ;
wire m_axi_wvalid ;
wire m_axi_wready ;
// Master Interface Write Response Ports
wire [AXI_ID_WIDTH-1:0] m_axi_bid ;
wire [1:0] m_axi_bresp ;
wire m_axi_bvalid ;
wire m_axi_bready ;
// Master Interface Read Address Ports
wire [AXI_ID_WIDTH-1:0] m_axi_arid ;
wire [AXI_ADDR_WIDTH-1:0] m_axi_araddr ;
wire [7:0] m_axi_arlen ;
wire [2:0] m_axi_arsize ;
wire [1:0] m_axi_arburst ;
wire [0:0] m_axi_arlock ;
wire [3:0] m_axi_arcache ;
wire [2:0] m_axi_arprot ;
wire [3:0] m_axi_arqos ;
wire [3:0] m_axi_arregion;
wire m_axi_arvalid ;
wire m_axi_arready;
// Master Interface Read Data Ports
wire [AXI_ID_WIDTH-1:0] m_axi_rid ;
wire [AXI_DATA_WIDTH-1:0] m_axi_rdata ;
wire [1:0] m_axi_rresp ;
wire m_axi_rlast ;
wire m_axi_rvalid ;
wire m_axi_rready ;
parameter TDATA_WIDTH = 128 ;
parameter TDEST_WIDTH = 1 ;
parameter TID_WIDTH = 1 ;
//实时数据流输入
reg [0:0] s_axis_tid_s;
reg [0:0] s_axis_tdest_s;
reg [TDATA_WIDTH-1:0] s_axis_tdata_s;
reg [(TDATA_WIDTH>>3)-1:0] s_axis_tstrb_s;
reg [(TDATA_WIDTH>>3)-1:0] s_axis_tkeep_s;
reg s_axis_tlast_s;
reg s_axis_tuser_s;
reg s_axis_tvalid_s;
wire s_axis_tready_s=1'b1;///////////////////////////////////////////////////////////
//实时数据流输出
wire [0:0] m_axis_tid_s;
wire [0:0] m_axis_tdest_s;
wire [TDATA_WIDTH-1:0] m_axis_tdata_s;
wire [(TDATA_WIDTH>>3)-1:0] m_axis_tstrb_s;
wire [(TDATA_WIDTH>>3)-1:0] m_axis_tkeep_s;
wire m_axis_tlast_s;
wire m_axis_tuser_s;
wire m_axis_tvalid_s;
reg m_axis_tready_s=1'b1;////////////////////////////////////////////////////////////
parameter SIM_DATA_BEGIN = 1;
parameter SIM_DATA_CNT = 4096;
initial sys_clk_i = 1'b1;
always #2.5 sys_clk_i = ~sys_clk_i;
initial wrfifo_clk = 1'b1;
always #5 wrfifo_clk = ~wrfifo_clk;
initial begin
sys_rst = 1'b0;
aresetn = 1'b0;
expect_rd_data = 16'd0;
wrfifo_clr = 1'b1;
wrfifo_wren = 1'b0;
wrfifo_din = 16'd0;
#201; // 等待201ns,确保时钟稳定
// 释放复位
sys_rst = 1'b1;
aresetn = 1'b1;
// 等待DDR3控制器的锁相环锁定
@(posedge mmcm_locked);
#200;
wrfifo_clr = 1'b0;
@(posedge init_calib_complete);
#200;
//wr_data(SIM_DATA_BEGIN,SIM_DATA_CNT);//4096个数据
#8000;
//rd_data(SIM_DATA_BEGIN,SIM_DATA_CNT);//4096个数据
#5000;
$display("SIM is successfully");
$stop;
end
task wr_data;
input [15:0]data_begin;
input [15:0]wr_data_cnt;
begin
wrfifo_wren = 1'b0;
s_axis_tvalid_s=1'b0;
wrfifo_din = data_begin;
@(posedge wrfifo_clk);
#1 wrfifo_wren = 1'b1;
repeat(wr_data_cnt)
begin
@(posedge wrfifo_clk);
#1 wrfifo_din = wrfifo_din + 1'b1;
end
#1 wrfifo_wren = 1'b0;
end
endtask
task rd_data;
input [15:0]data_begin;
input [15:0]rd_data_cnt;
integer k,i,j;
begin
s_axis_tvalid_s=1'b0;
for(k=0;k<4;k=k+1) begin
s_axis_tdata_s=data_begin-1;
for(i=0;i<16;i=i+1) begin
for ( j=0 ;j<64-1 ;j=j+1 ) begin
@(posedge wrfifo_clk);
#1;
if(i==0&&j==0) begin
s_axis_tuser_s=1'b1;
end
else begin
s_axis_tuser_s=1'b0;
end
s_axis_tdata_s=s_axis_tdata_s+1'd1;
s_axis_tvalid_s=1'b1;
s_axis_tlast_s=1'b0;
end
@(posedge wrfifo_clk);
s_axis_tuser_s=1'b0;
s_axis_tlast_s=1'b1;
s_axis_tvalid_s=1'b1;
s_axis_tdata_s=s_axis_tdata_s+1'd1;
end
end
end
endtask
Top_NUC # (
.TDATA_WIDTH (TDATA_WIDTH ),
.TDEST_WIDTH (TDEST_WIDTH ),
.TID_WIDTH (TID_WIDTH ),
.WR_FIFO_DW (16 ),
.RD_FIFO_DW (256 ),
.RD_AXI_BYTE_ADDR_BEGIN(RD_AXI_BYTE_ADDR_BEGIN ),
.RD_AXI_BYTE_ADDR_END (RD_AXI_BYTE_ADDR_END ),
.WD_AXI_BYTE_ADDR_BEGIN(WR_AXI_BYTE_ADDR_BEGIN ),
.WD_AXI_BYTE_ADDR_END (WR_AXI_BYTE_ADDR_END ),
.AXI_DATA_WIDTH (AXI_DATA_WIDTH ),
.AXI_ADDR_WIDTH (AXI_ADDR_WIDTH ),
.AXI_ID_WIDTH (AXI_ID_WIDTH ),
.AXI_ID (AXI_ID ),
.AXI_BURST_LEN (AXI_BURST_LEN ),
.WR_FIFO_ADDR_DEPTH (WR_FIFO_ADDR_DEPTH ),
.RD_FIFO_ADDR_DEPTH (RD_FIFO_ADDR_DEPTH )
)
Top_NUC_inst (
.aclk (ui_clk ),
.aresetn (~init_calib_complete),///////////////////////////////
//仅用于测试
.wrfifo_clr (wrfifo_clr ),
.wrfifo_clk (wrfifo_clk ),
.wrfifo_wren (wrfifo_wren ),
.wrfifo_din (wrfifo_din ),
.wrfifo_full ( ),
.wrfifo_wr_cnt ( ),
/////////////////////////////////////////////////////////////////////////////
.s_axis_tid_s (s_axis_tid_s ),
.s_axis_tdest_s (s_axis_tdest_s ),
.s_axis_tdata_s (s_axis_tdata_s ),
.s_axis_tstrb_s (s_axis_tstrb_s ),
.s_axis_tkeep_s (s_axis_tkeep_s ),
.s_axis_tlast_s (s_axis_tlast_s ),
.s_axis_tuser_s (s_axis_tuser_s ),
.s_axis_tvalid_s (s_axis_tvalid_s ),
.s_axis_tready_s (s_axis_tready_s ),
.m_axis_tid_s (m_axis_tid_s ),
.m_axis_tdest_s (m_axis_tdest_s ),
.m_axis_tdata_s (m_axis_tdata_s ),
.m_axis_tstrb_s (m_axis_tstrb_s ),
.m_axis_tkeep_s (m_axis_tkeep_s ),
.m_axis_tlast_s (m_axis_tlast_s ),
.m_axis_tuser_s (m_axis_tuser_s ),
.m_axis_tvalid_s (m_axis_tvalid_s ),
.m_axis_tready_s (m_axis_tready_s ),
.m_axi_awid (m_axi_awid ),
.m_axi_awaddr (m_axi_awaddr ),
.m_axi_awlen (m_axi_awlen ),
.m_axi_awsize (m_axi_awsize ),
.m_axi_awburst (m_axi_awburst ),
.m_axi_awlock (m_axi_awlock ),
.m_axi_awcache (m_axi_awcache ),
.m_axi_awprot (m_axi_awprot ),
.m_axi_awqos (m_axi_awqos ),
.m_axi_awregion (m_axi_awregion ),
.m_axi_awvalid (m_axi_awvalid ),
.m_axi_awready (m_axi_awready ),
.m_axi_wdata (m_axi_wdata ),
.m_axi_wstrb (m_axi_wstrb ),
.m_axi_wlast (m_axi_wlast ),
.m_axi_wvalid (m_axi_wvalid ),
.m_axi_wready (m_axi_wready ),
.m_axi_bid (m_axi_bid ),
.m_axi_bresp (m_axi_bresp ),
.m_axi_bvalid (m_axi_bvalid ),
.m_axi_bready (m_axi_bready ),
.m_axi_arid (m_axi_arid ),
.m_axi_araddr (m_axi_araddr ),
.m_axi_arlen (m_axi_arlen ),
.m_axi_arsize (m_axi_arsize ),
.m_axi_arburst (m_axi_arburst ),
.m_axi_arlock (m_axi_arlock ),
.m_axi_arcache (m_axi_arcache ),
.m_axi_arprot (m_axi_arprot ),
.m_axi_arqos (m_axi_arqos ),
.m_axi_arregion (m_axi_arregion ),
.m_axi_arvalid (m_axi_arvalid ),
.m_axi_arready (m_axi_arready ),
.m_axi_rid (m_axi_rid ),
.m_axi_rdata (m_axi_rdata ),
.m_axi_rresp (m_axi_rresp ),
.m_axi_rlast (m_axi_rlast ),
.m_axi_rvalid (m_axi_rvalid ),
.m_axi_rready (m_axi_rready )
);
mig_7series_0 u_mig_7series_0 (
// Memory interface ports
.ddr3_addr (ddr3_addr ),
.ddr3_ba (ddr3_ba ),
.ddr3_cas_n (ddr3_cas_n ),
.ddr3_ck_n (ddr3_ck_n ),
.ddr3_ck_p (ddr3_ck_p ),
.ddr3_cke (ddr3_cke ),
.ddr3_ras_n (ddr3_ras_n ),
.ddr3_reset_n (ddr3_reset_n ),
.ddr3_we_n (ddr3_we_n ),
.ddr3_dq (ddr3_dq ),
.ddr3_dqs_n (ddr3_dqs_n ),
.ddr3_dqs_p (ddr3_dqs_p ),
.init_calib_complete (init_calib_complete ),
.ddr3_cs_n (ddr3_cs_n ),/////////////////////////////////////
.ddr3_dm (ddr3_dm ),
.ddr3_odt (ddr3_odt ),
// Application interface ports
.ui_clk (ui_clk ),
.ui_clk_sync_rst (ui_clk_sync_rst ),
.mmcm_locked (mmcm_locked ),
.aresetn (aresetn ),
.app_sr_req (1'b0 ),
.app_ref_req (1'b0 ),
.app_zq_req (1'b0 ),
.app_sr_active ( ),
.app_ref_ack ( ),
.app_zq_ack ( ),
// Slave Interface Write Address Ports
.s_axi_awid (m_axi_awid ),
.s_axi_awaddr (m_axi_awaddr ),
.s_axi_awlen (m_axi_awlen ),
.s_axi_awsize (m_axi_awsize ),
.s_axi_awburst (m_axi_awburst ),
.s_axi_awlock (m_axi_awlock ),
.s_axi_awcache (m_axi_awcache ),
.s_axi_awprot (m_axi_awprot ),
.s_axi_awqos (m_axi_awqos ),
.s_axi_awvalid (m_axi_awvalid ),
.s_axi_awready (m_axi_awready ),
// Slave Interface Write Data Ports
.s_axi_wdata (m_axi_wdata ),
.s_axi_wstrb (m_axi_wstrb ),
.s_axi_wlast (m_axi_wlast ),
.s_axi_wvalid (m_axi_wvalid ),
.s_axi_wready (m_axi_wready ),
// Slave Interface Write Response Ports
.s_axi_bid (m_axi_bid ),
.s_axi_bresp (m_axi_bresp ),
.s_axi_bvalid (m_axi_bvalid ),
.s_axi_bready (m_axi_bready ),
// Slave Interface Read Address Ports
.s_axi_arid (m_axi_arid ),
.s_axi_araddr (m_axi_araddr ),
.s_axi_arlen (m_axi_arlen ),
.s_axi_arsize (m_axi_arsize ),
.s_axi_arburst (m_axi_arburst ),
.s_axi_arlock (m_axi_arlock ),
.s_axi_arcache (m_axi_arcache ),
.s_axi_arprot (m_axi_arprot ),
.s_axi_arqos (m_axi_arqos ),
.s_axi_arvalid (m_axi_arvalid ),
.s_axi_arready (m_axi_arready ),
// Slave Interface Read Data Ports
.s_axi_rid (m_axi_rid ),
.s_axi_rdata (m_axi_rdata ),
.s_axi_rresp (m_axi_rresp ),
.s_axi_rlast (m_axi_rlast ),
.s_axi_rvalid (m_axi_rvalid ),
.s_axi_rready (m_axi_rready ),
// System Clock Ports
.sys_clk_i (sys_clk_i ),
.sys_rst (sys_rst ) //active low
);
ddr3_model ddr3_model
(
.rst_n (ddr3_reset_n ),
.ck (ddr3_ck_p ),
.ck_n (ddr3_ck_n ),
.cke (ddr3_cke ),
.cs_n (ddr3_cs_n ),
.ras_n (ddr3_ras_n ),
.cas_n (ddr3_cas_n ),
.we_n (ddr3_we_n ),
.dm_tdqs(ddr3_dm ),
.ba (ddr3_ba ),
.addr (ddr3_addr ),
.dq (ddr3_dq ),
.dqs (ddr3_dqs_p ),
.dqs_n (ddr3_dqs_n ),
.tdqs_n ( ),
.odt (ddr3_odt )
);
endmodule”分析这段代码,检查是否存在错误