In reply to dave_59:
below is the master transaction
class eit_axi_master_transaction #(parameter ADDR_WIDTH = 32, DATA_WIDTH = 32) extends uvm_sequence_item;
///////////////////////////////////////////////////////////////////////////////
// bit [(ADDR_WIDTH-1):0] Lower_value=0;
// bit [(ADDR_WIDTH-1):0] Upper_value=`MAX_ADDR;
//////////////////////////////////////////////////////////////////////////////
//ADD_ID will be used as AWID & ARID in child write/read classes
rand bit [3:0]ADD_ID;
//DATA_ID will be used as form WID & RID in child write/read classes
rand bit [3:0]DATA_ID;
rand bit [(ADDR_WIDTH-1):0]ADDR;
rand bit [7:0]LEN;
rand bit [2:0]SIZE;
rand bit [1:0]BURST;
`uvm_object_param_utils_begin(eit_axi_master_transaction #(ADDR_WIDTH,DATA_WIDTH))
`uvm_field_int(ADD_ID,UVM_ALL_ON)
`uvm_field_int(DATA_ID,UVM_ALL_ON)
`uvm_field_int(ADDR,UVM_ALL_ON)
`uvm_field_int(LEN,UVM_ALL_ON)
`uvm_field_int(SIZE,UVM_ALL_ON)
`uvm_field_int(BURST,UVM_ALL_ON)
`uvm_object_utils_end
//---------------------------------------------------------------------------------------------------------------------------------------------
// Constraint: This constraint help to work VIP as per specification
// Provide ADDRESS range in MAX_ADDR_RANGE : User can give this address via test cases
//---------------------------------------------------------------------------------------------------------------------------------------------
//Constraint for MAX address generation
///////////////////////////////////////////////////////////////////////////////////
// constraint MAX_ADDR_RANGE { ADDR inside {[Lower_value:Upper_value]}; }
constraint MAX_ADDR_RANGE { ADDR inside {[0:`MAX_ADDR]}; }
/////////////////////////////////////////////////////////////////////////////////
//Constraint for generating only INCR burst for LEN greater than 15
constraint BURST_TYPE_cr {if (LEN > 'd15) BURST=='b01 ;}
//Constraint generating NOT generating Reserved type
constraint BURST_NOT_BE_RESERVED_cr {BURST != 'b11;}
constraint ADD_ID_DATA_ID_MATCH_cr {ADD_ID == DATA_ID ;}
//Constraint for generating Aligned addresses for Wrap burst
constraint WRAP_CR{if(BURST=='b10) ADDR ==int'(ADDR/2**SIZE)*(2**SIZE); LEN inside{1,3,7,15}; }
//Constraint for keeping generated data size less than or equal to dat-bus
constraint SIZE_value_cr {2**SIZE <= (DATA_WIDTH/8) ;}
function new(string name = "eit_axi_master_transaction");
super.new(name);
endfunction
endclass : eit_axi_master_transaction
/*------------------------Extended WRITE transaction class------------------------------*/
class eit_axi_master_write_transaction #(parameter ADDR_WIDTH = 32, DATA_WIDTH = 32) extends eit_axi_master_transaction #(ADDR_WIDTH,DATA_WIDTH);
//---------------------------------------------------------------------------------------------------------------------------------------------
// DATA and STROB are dynamic array because we have to genrate that based on the transfer size
// Used WDATA constraint. It help to genrate random data as we required
//---------------------------------------------------------------------------------------------------------------------------------------------
rand bit [(DATA_WIDTH-1):0] WDATA[];
rand bit [(DATA_WIDTH/8)-1:0] WSTRB[];
bit[1:0] BRESP;
`uvm_object_param_utils_begin(eit_axi_master_write_transaction #(ADDR_WIDTH,DATA_WIDTH))
`uvm_field_array_int(WDATA,UVM_ALL_ON|UVM_NOCOMPARE) // no compare
`uvm_field_array_int(WSTRB,UVM_ALL_ON|UVM_NOCOMPARE) // no compare
`uvm_field_int(BRESP,UVM_ALL_ON|UVM_NOCOPY|UVM_NOCOMPARE) // no copy no compare
`uvm_object_utils_end
constraint WSTRB_size_cr {WSTRB.size() == 1 ;}
// dynamic array size declaration
constraint WDATA_size_cr {WDATA.size() == LEN +1 ;}
//array element has byte dependent upon size.
constraint WDATA_element_size_cr { foreach( WDATA[i]) WDATA[i]<=((2**((2**SIZE)*8)-1));}
function new(string name = "eit_axi_master_write_transaction");
super.new(name);
endfunction
endclass : eit_axi_master_write_transaction
/*-------------------------------------------------------------------------------------*/
/*------------------------Extended READ transaction class------------------------------*/
class eit_axi_master_read_transaction #(parameter ADDR_WIDTH = 32, DATA_WIDTH = 32) extends eit_axi_master_transaction #(ADDR_WIDTH,DATA_WIDTH);
//---------------------------------------------------------------------------------------------------------------------------------------------
// DATA and RESP are dynamic array because we have to genrate that based on the transfer size
//---------------------------------------------------------------------------------------------------------------------------------------------
bit [(DATA_WIDTH-1):0] RDATA[];
bit [1:0] RRESP[];
`uvm_object_param_utils_begin(eit_axi_master_read_transaction #(ADDR_WIDTH,DATA_WIDTH))
`uvm_field_array_int(RDATA,UVM_ALL_ON|UVM_NOCOPY|UVM_NOCOMPARE) // no copy no compare
`uvm_field_array_int(RRESP,UVM_ALL_ON|UVM_NOCOPY|UVM_NOCOMPARE) // no copy no compare
`uvm_object_utils_end
function new(string name = "eit_axi_master_read_transaction");
super.new(name);
endfunction
endclass : eit_axi_master_read_transaction
/*-------------------------------------------------------------------------------------*/