/********************************************** _ _ Cook Darwin __

_ descript: author : Cook.Darwin Version: VERA.0.0 creaded: 2017/8/23 madified: ***********************************************/ `timescale 1ns/1ps class MailBox #(

parameter DSIZE = 8

);

mailbox master_box; mailbox slaver_box;

logic mdata; logic sdata; int cnt; // virtual logic clock;

function new(int num = 0);

// clock = clk;
cnt = 0;
master_box = new(num);
slaver_box = new(num);

endfunction

task automatic master_put(logic [DSIZE-1:0] data);

master_box.put(data);

endtask:master_put

task automatic slaver_put(logic [DSIZE-1:0] data);

slaver_box.put(data);

endtask:slaver_put

task automatic master_get(ref logic data);

master_box.get(data);

endtask:master_get

task automatic slaver_get(ref logic data);

slaver_box.get(data);

endtask:slaver_get

task automatic incr();

cnt = cnt + 1;

endtask:incr

endclass:MailBox

module tb_axis_m2s_A1_0115; import AxiBfmPkg::*; logic pclk; logic prst_n;

localparam NUM = 8;

clock_rst_verb #(

.ACTIVE                 (0                      ),
.PERIOD_CNT             (0                      ),
.RST_HOLD               (50                     ),
.FreqM                  (148.5          )

)clock_rst_pixel(

.clock                  (pclk           ),
.rst_x                  (prst_n         )

);

// axi_stream_inf #(8) axis_slaver_inf_tmp[3:0] (pclk,prst_n,1'b1); axi_stream_inf #(8) axis_sub_master_inf[NUM-1:0] (pclk,prst_n,1'b1); axi_stream_inf #(8) axis_slaver_inf (pclk,prst_n,1'b1);

AxiStreamMasterBfm_c #(8,“OFF”) MasterBfm; AxiStreamSlaverBfm_c #(8) SlaverBfm = new(axis_slaver_inf);

MailBox #(4) mbox [NUM-1:0]; logic [3:0] mdata [NUM-1:0]; logic [3:0] sdata [NUM-1:0];

initial begin

forever begin
    SlaverBfm.get_data(100,0);
end

end

genvar KK;

generate for(KK=0;KK<NUM;KK++)begin

initial begin
    mbox[KK]        = new();
    MasterBfm[KK]   = new(axis_sub_master_inf[0][KK]);
end

end endgenerate

axi_stream_interconnect_M2S_A1 #(

.NUM        (NUM)

)master_1_axis_M2S_noaddr_inst( /* axi_stream_inf.slaver */ .s00 (axis_sub_master_inf ), //[NUM-1:0], /* axi_stream_inf.master */ .m00 (axis_slaver_inf ) // );

task automatic gen_m_tk(AxiStreamMasterBfm_c bfm,logic a = 10,int rate = 30); logic [7:0] data;

data = {>>{8'd1+a,8'd2+a,8'd3+a,8'd4+a,8'd5+a}};
forever
    bfm.gen_axi_stream(0,rate,data);

endtask:gen_m_tk

// task automatic push_mail_box(input logic data,ref mailbox mb); // mb.put(data); // endtask:push_mail_box // // task automatic get_mail_box(ref mailbox mb,ref logic data); // mb.get(data); // endtask:get_mail_box

generate for(KK=0;KK<NUM;KK++)begin

initial begin
    if(KK%2 == 0)
        gen_m_tk(MasterBfm[KK],KK*16,$urandom_range(80,10));
    // gen_m_tk(MasterBfm[KK],KK*16,100);
end

always@(posedge pclk)begin
    if(axis_sub_master_inf[0][KK].axis_tvalid && axis_sub_master_inf[0][KK].axis_tready)begin
        mbox[KK].master_put(axis_sub_master_inf[0][KK].axis_tdata[3:0]);
    end
end

always@(posedge pclk)begin
    if(axis_slaver_inf.axis_tvalid && axis_slaver_inf.axis_tready)begin
        if(axis_slaver_inf.axis_tdata[7:4] == KK)begin
            mbox[KK].slaver_put(axis_slaver_inf.axis_tdata[3:0]);
        end
    end
end

always@(*)begin
    mbox[KK].master_get(mdata[KK]);
    mbox[KK].slaver_get(sdata[KK]);
    assert(mdata[KK] == sdata[KK])
    else begin
        $display(" :%d: [%d] MDATA[%h] != SDATA[%h]",KK,mbox[KK].cnt,mdata[KK],sdata[KK]);
    end
    mbox[KK].incr();
end

end endgenerate

endmodule