/********************************************** _ _ Cook Darwin __
_ descript: author : Cook.Darwin Version: VERA.0.0 creaded: 2017/8/25 madified: ***********************************************/ package DataCBfmPkg; import AxiBfmPkg::sync_clk_wait;
class DataCMaster_c #(
parameter DSIZE = 8
);
virtual data_inf_c #(.DSIZE(DSIZE)) data_inf;
randc logic [DSIZE-1:0] rdata; // constraint rdata_c_external; constraint rdata_c_external {
if(DSIZE>13) rdata inside {[2**13:2**13+1079],[2**14:2**14+1079]}; else rdata < 1080;
}
function new(virtual data_inf_c #(DSIZE) b );
data_inf = b;
endfunction:new
task automatic gen_rand_data(int rate,int length); int cnt;
data_inf.valid = 0; data_inf.data = 0; cnt = 0; wait(data_inf.rst_n); forever begin @(posedge data_inf.clock); if(rate > $urandom_range(99,0))begin data_inf.valid = 1; this.randomize(); data_inf.data = rdata; sync_clk_wait(data_inf.clock,data_inf.ready); data_inf.valid = 0; cnt = cnt + 1; if(cnt == length) break; end else begin data_inf.valid = 0; end end data_inf.valid = 0; data_inf.data = 0; @(posedge data_inf.clock);
endtask:gen_rand_data
endclass:DataCMaster_c
class DataCSlaver_c #(
parameter DSIZE = 8
);
virtual data_inf_c #(.DSIZE(DSIZE)) data_inf;
function new(virtual data_inf_c #(DSIZE) b );
data_inf = b;
endfunction:new
task automatic get_data(int rate,int length); int cnt;
data_inf.ready = 0; cnt = 0; wait(data_inf.rst_n); forever begin @(posedge data_inf.clock); if(data_inf.ready && data_inf.valid)begin cnt = cnt + 1'b1; if(cnt == length) break; end if(rate > $urandom_range(99,0))begin data_inf.ready = 1; end else begin data_inf.ready = 0; end end @(posedge data_inf.clock);
endtask:get_data
endclass:DataCSlaver_c
endpackage:DataCBfmPkg