/********************************************** _ _ Cook Darwin __
_ descript: author : Cook.Darwin Version: VERA.0.0 creaded: 2016/8/21 madified: ***********************************************/ `timescale 1ns / 1ps // package AxiBfmPkg; module AxiStreamBfm #(
parameter DSIZE = 16
)(
axi_stream_inf.master inf, axi_stream_inf.slaver sinf
);
logic clock; logic rst_n;
// logic [DSIZE-1:0] data_queue [$]; // logic last_queue [$];
assign clock = inf.aclk; assign rst_n = inf.aresetn;
// logic axis_tdata ; // logic axis_tvalid ; // logic axis_tready ; // logic axis_tuser ; // logic axis_tlast ; // logic axis_tkeep ; int cnt;
task automatic gen_axi_stream (
int length, int valid_ramdon_percent, ref [DSIZE-1:0] data_s [$]
); int index; int cc = 0; int data_len; int rt; logic [DSIZE-1:0] data_ss; logic curr_data;
data_len = data_s.size(); cc=0; repeat(length)begin index = cc%data_len; data_ss[cc] = data_s[index]; cc++; end $display("__________________________________"); $display("GEN AXI STREAM LEN = %d",data_len); while(1)begin @(posedge clock); #1; rt = $urandom_range(99,0); inf.axis_tvalid = (rt < valid_ramdon_percent); if(inf.axis_tvalid && inf.axis_tready) inf.axis_tdata = data_ss.size() != 0? data_ss.pop_front : inf.axis_tdata; inf.axis_tlast = data_ss.size() == 0; if(inf.axis_tlast)begin forever begin @(negedge clock); if (inf.axis_tready) break; end break; end end $display("==================================");
endtask:gen_axi_stream
always@(posedge clock,negedge rst_n)
if(~rst_n) cnt <= 0; else begin if(inf.axis_tvalid && inf.axis_tready && inf.aclken)begin if(inf.axis_tlast) cnt <= 0; else cnt <= cnt + 1'b1; end else cnt <= cnt; end
task automatic reset_stream;
@(posedge clock); fork inf.axis_tvalid = #1 0; inf.axis_tlast = #1 0; inf.axis_tdata = #1 0; join
endtask:reset_stream
task automatic gen_axi_stream_ready(
int ready_ramdon_percent
); int rt;
forever begin rt = $urandom_range(99,0); @(posedge clock); sinf.axis_tready = #1 (rt < ready_ramdon_percent); end
endtask:gen_axi_stream_ready // // task automatic push_queue(input [DSIZE-1:0] data [$],input dlast); // data
endmodule:AxiStreamBfm
// endpackage:AxiBfmPkg