/********************************************** _ _ Cook Darwin __
_ descript: author : Cook.Darwin Version: VERA.0.0 creaded: 2017/10/23 madified: ***********************************************/ `timescale 1ns/1ps module tb_axis_s2m_pipe_1023; import AxiBfmPkg::*;
logic aclk; logic aresetn;
clock_rst_verb #(
.ACTIVE (0 ), .PERIOD_CNT (0 ), .RST_HOLD (5 ), .FreqM (140 )
)clock_rst_master(
.clock (aclk ), .rst_x (aresetn )
);
logic [1:0] addr; logic addr_vld;
localparam DSIZE = 8;
axi_stream_inf #(DSIZE) axis_in (aclk,aresetn,1'b1); axi_stream_inf #(DSIZE) axis_out [2:0] (aclk,aresetn,1'b1);
AxiStreamMasterBfm_c #(DSIZE,“OFF”) MasterBfm = new(axis_in); AxiStreamSlaverBfm_c #(DSIZE) SlaverBfm;
initial begin
SlaverBfm[0] = new(axis_out[0]); SlaverBfm[1] = new(axis_out[1]); SlaverBfm[2] = new(axis_out[2]);
end
axis_interconnect_S2M_pipe #(
.NUM (3)
)axi_stream_interconnect_S2M_inst( /* input */ .addr_vld (addr_vld ), /* output */ .addr_rdy (), /* input [NSIZE-1:0] */ .addr (addr ), /* axi_stream_inf.slaver */ .s00 (axis_in ), /* axi_stream_inf.master */ .m00 (axis_out )//[NUM-1:0] );
//mialbox list
mailbox mb_master_addr = new(100); mailbox mb_master_len = new(100); mailbox mb_master_rate = new(100);
mailbox mb_slaver_rate_0 = new(100); mailbox mb_slaver_rate_1 = new(100); mailbox mb_slaver_rate_2 = new(100);
initial begin:MB_INIT int index; logic master_addr; int master_len; int master_rate; int slaver_rate [2:0];
index = 0; repeat(1000)begin master_addr = $urandom_range(3,0); // master_len = 2*($urandom_range(0,5)); master_len = 1; master_rate = $urandom_range(4,1)*25; slaver_rate[0] = $urandom_range(4,1)*25; slaver_rate[1] = $urandom_range(4,1)*25; slaver_rate[2] = $urandom_range(4,1)*25; mb_master_addr.put(master_addr); mb_master_len.put(master_len); mb_master_rate.put(master_rate); mb_slaver_rate_0.put(slaver_rate[0]); mb_slaver_rate_1.put(slaver_rate[1]); mb_slaver_rate_2.put(slaver_rate[2]); @(posedge aclk); index++; // $display("---PUSH[%d] DONE!----",index); end
end
//—– int track_cnt = 0;
task automatic master_tk; logic data [$]; int length; int rate;
wait(axis_in.aresetn); repeat(100) @(posedge axis_in.aclk); data = {>>{8'd1,8'd2,8'd3,8'd4}}; repeat(1000) begin mb_master_len.get(length); mb_master_rate.get(rate); data = {>>{track_cnt[7:0],8'd1,8'd2,8'd3,8'd4}}; MasterBfm.gen_axi_stream(length,rate,data); track_cnt++; $display("[%d] LEN[%d], RATE[%d/100], DONE !!",track_cnt,length,rate); end $display(" GEN DONE !!!");
endtask:master_tk
task automatic slaver_tk; int slaver_rate [2:0];
wait(axis_in.aresetn); repeat(100) @(posedge axis_in.aclk); fork repeat(100) begin mb_slaver_rate_0.get(slaver_rate[0]); SlaverBfm[0].get_data(slaver_rate[0],0); end repeat(100) begin mb_slaver_rate_1.get(slaver_rate[1]); SlaverBfm[1].get_data(slaver_rate[1],0); end repeat(100) begin mb_slaver_rate_2.get(slaver_rate[2]); SlaverBfm[2].get_data(slaver_rate[2],0); end join
endtask:slaver_tk
// initial begin // mb_master_addr.get(addr); // end
always@(posedge aclk)
if(axis_in.axis_tvalid && axis_in.axis_tready && axis_in.axis_tlast)begin addr_vld <= 1'b1; end else begin addr_vld <= 1'b0; end
always@(posedge aclk)
if(axis_in.axis_tvalid && axis_in.axis_tready && axis_in.axis_tcnt == 0)begin mb_master_addr.get(addr); end
initial begin
master_tk();
end
initial begin
slaver_tk();
end
endmodule