// Constrain the len according the payload_size control field
constraint len_size {
(payload_size == SMALL_P ) => len in { 5 : 6};
(payload_size == MEDIUM_P ) => len in { 7 : 8};
(payload_size == LARGE_P ) => len in {9 : 10}; }
// Constrain length of data == len
constraint data_size { data.size() ==len;}
constraint len_siz { solve len before data.size() ;}
// May be assigned either a good or bad value,parity will be calculated in portrandomize
constraint parity_type {
(packet_kind == GOOD_P ) => parity == 0;
(packet_kind == BAD_P ) => parity != 0;}
//All data object methods should be virtual
//All data object methods shall be nonblocking
tasknew();
task do_cfg(Configuration cfg);
virtualfunctionstring psdisplay(string prefix );
virtualfunction rvm_data copy(rvm_data to);
virtualfunctioninteger byte_unpack(bit [7:0] bytes[*],integer offset = 0,integer kind = -1);
virtualfunctionbit[7:0] parity_cal();
function rvm_data packet::copy(rvm_data to = null){
packet cpy;
// Copying to a new instance?
if (to == null)
cpy = new;
else
// Copying to an existing instance. Correct type?
if (!cast_assign(cpy, to,CHECK))
{
rvm_fatal(this.log, "Attempting to copy to a non packet instance");
copy = null;
return;
}
//unpacking function for converting recived data to class properties
functioninteger packet::byte_unpack(bit [7:0] bytes[*],integer offset ,integer kind){
sprintf(msg," bytes size %d",bytes.size());
da = bytes[1];
sa = bytes[2];
len = bytes[3];
functionbit[7:0] packet::parity_cal(){
integer i;
bit[7:0] result ;
result = result ^ this.da;
result = result ^ this.sa;
result = result ^ this.len;
for (i = 0;i<this.len;i++)
{
result = result ^ this.data[i];
}
parity_cal = result;
}
//post randomize fun to cal parity
task packet::post_randomize(){
parity = parity ^ parity_cal();
sprintf(msg," %x %x %x %x",mem[0],mem[1],mem[2],mem[3]);
rvm_note(this.log,msg);
}
compare = 1; // Assume success by default.
diff = "No differences found";
if (!cast_assign(cmp, to,CHECK))
{ rvm_fatal(this.log, "Attempting to compare to a non packet instance");
compare = 0;
diff = "Cannot compare non packets";
return;
}
// data types are the same, do comparison:
if (this.da != cmp.da)
{
diff = psprintf("Different DA values: %b != %b", this.da, cmp.da);
compare = 0;
return;
}
if (this.sa != cmp.sa)
{
diff = psprintf("Different SA values: %b != %b", this.sa, cmp.sa);
compare = 0;
return;
}
if (this.len != cmp.len)
{
diff = psprintf("Different LEN values: %b != %b", this.len, cmp.len);
compare = 0;
return;
}