Code Browser Pages:
Files in
rvm_eth.tar



call_back.vr
cfg_intf.vr
cfg_xtor.vr
chan.vr
cov.vr
defines.vr
env.vr
host_driver.vr
host_intf.vr
host_xtor_rx.vr
host_xtor.vr
phy_driver.vr
phy_intf.vr
phy_xtor_rx.vr
phy_xtor.vr
Current file: pkt.vr
pro.vr
run
rx_pkt.vr
sb.vr
timescale.v
top.v



#include <rvm_std_lib.vrh>

#ifndef PKT_CLASS
#define PKT_CLASS

#define MCAST_ADD_VAL  48'h81_81_81_81_81_81
#define MCAST_ADD_INV  48'h81_00_00_00_00_81
#define UCAST_ADD_VAL  48'h00_ff_00_ff_00_ff
#define UCAST_ADD_INV  48'h00_ff_ff_ff_ff_00
#define MCAST_PAUSE_ADD 48'h01_80_c2_00_00_01
#define MAX_NUM_OF_VLANS 4
#define SA_ADD     48'h00_00_00_00_00_00
#define SEED 0
#ifndef PACK 
#define SHOW 0
#else   
#define SHOW 1
#endif


enum DA_e    {MCAST_VALID,MCAST_INVALID,UCAST_VALID,UCAST_INVALID,BCAST};
enum TYPE_e  {LENGTH,JUMBO,PAUSE,CNTRL};
enum TAG_e   {SVLAN,VLAN,MVLAN,NOTAG};
enum LENGTH_e{LES_46,EQL_46,BW_47_TO_1500,GTR_1536,LEN_INVALID};
enum TIME_e  {TIME_ZERO,TIME_FFFF,TIME_RAND};
enum LENERR_e{LEN_GOOD,LEN_BAD};
enum PAYLOAD_e{RANDTYPE,ZERO};

class packet extends rvm_data{
static rvm_log log = new("packet", "class");
rand DA_e       DA_t    ;
rand TAG_e      TAG_t   ;
rand TYPE_e     TYPE_t  ;
rand LENGTH_e   LENGTH_t;
rand TIME_e     TIME_t  ;
rand LENERR_e   LENERR_t;

rand integer Num_Of_Vlans;
rand integer length;
static integer No;
integer Pkt_No;
bit [7:0] Pkt_Packed [*];
bit [7:0] data [$];
bit [31 :0]Crc;
bit [31:0] Table [256];
PAYLOAD_e PAYLOAD_t;

constraint length_c {
     if  ((TYPE_t == LENGTH )& LENGTH_t == LES_46)       {length  in { 1 :45};     }
else if  ((TYPE_t == LENGTH )& LENGTH_t == EQL_46)       {length == 46 ;           }
else if  ((TYPE_t == LENGTH )& LENGTH_t == BW_47_TO_1500){length  in { 47 :1500};  }
else if  ((TYPE_t == LENGTH )& LENGTH_t == GTR_1536)     {length  in { 1536 :1636};}
else if  ((TYPE_t == LENGTH )& LENGTH_t == LEN_INVALID)  {length  in { 1501:1535}; }
else if  (TYPE_t == JUMBO & LENERR_t == LEN_GOOD)        {length  in { 47 :9000};    }
else if  (TYPE_t == JUMBO & LENERR_t == LEN_BAD)        {length  in { 1:46,9001 :9999}; }
else if  (TYPE_t == PAUSE & LENERR_t == LEN_GOOD )       {length  == 42 ;           }
else if  (TYPE_t == PAUSE & LENERR_t == LEN_BAD  )       {length  in {1:41,43:9999};}
else if  (TYPE_t == CNTRL & LENERR_t == LEN_GOOD )       {length  == 46 ;           }
else if  (TYPE_t == CNTRL & LENERR_t == LEN_BAD  )       {length  in {1:45,47:9999};}  }


constraint len_c  {LENGTH_t dist {LES_46 := 15,EQL_46 := 5,BW_47_TO_1500 := 45,GTR_1536 := 15,LEN_INVALID := 15}; }
constraint tag_c  {TAG_t dist {SVLAN := 25 ,VLAN := 20,MVLAN := 30,NOTAG := 25}; }
constraint lenerr_c { LENERR_t dist {LEN_GOOD:= 70,LEN_BAD :=30};}
constraint type_c { TYPE_t dist {LENGTH := 82,JUMBO := 3,PAUSE := 12,CNTRL := 3}; }
constraint pausetime_c { if(TYPE_t == PAUSE ) TIME_t dist { TIME_ZERO := 10,TIME_FFFF := 10,TIME_RAND := 80}; }
constraint vlans { if (TAG_t == MVLAN) {Num_Of_Vlans in {2 : MAX_NUM_OF_VLANS };}}

constraint test_case ;


task new(){
super.new(this.log);
CrcTable();
Num_Of_Vlans = 0;
PAYLOAD_t = RANDTYPE;
if(No === 'bx)
No = 0;
}


virtual function rvm_data copy (rvm_data to = null){
packet cpy;
if (to != null) {
if (!cast_assign(cpy, to, CHECK)) {
rvm_fatal(log,"Not a pkt instance");
return;
}
} else cpy = new;
this.copy_data(cpy);

cpy.DA_t         = this.DA_t                 ;
cpy.TAG_t        = this.TAG_t                ;
cpy.TYPE_t       = this.TYPE_t               ;
cpy.LENGTH_t     = this.LENGTH_t             ;
cpy.TIME_t       = this.TIME_t               ;
cpy.LENERR_t     = this.LENERR_t             ;
cpy.Num_Of_Vlans = this.Num_Of_Vlans         ;
cpy.length       = this.length               ;
cpy.Pkt_No       = this.Pkt_No               ;

copy = cpy;

}


task pre_randomize(){
No++ ;
Pkt_No = No ;
 }

virtual function string psdisplay(string prefix = ""){

psdisplay = prefix;
if (DA_t    == MCAST_VALID  ) psdisplay = psprintf  (" ",psdisplay,"|MCAST_VALID  ");
if (DA_t    == MCAST_INVALID) psdisplay = psprintf  (" ",psdisplay,"|MCAST_INVALID");
if (DA_t    == UCAST_VALID  ) psdisplay = psprintf  (" ",psdisplay,"|UCAST_VALID  ");
if (DA_t    == UCAST_INVALID) psdisplay = psprintf  (" ",psdisplay,"|UCAST_INVALID");
if (DA_t    == BCAST        ) psdisplay = psprintf  (" ",psdisplay,"|BCAST        ");

psdisplay = psprintf(" ",psdisplay,"|SA");
if (TAG_t  == SVLAN        )  psdisplay = psprintf  (" ",psdisplay,"|SVLAN ");
if (TAG_t  == VLAN        )   psdisplay = psprintf  (" ",psdisplay,"|VLAN  ");
if (TAG_t  == MVLAN        )  psdisplay = psprintf  (" ",psdisplay,"|MVLAN");
if (TAG_t  == MVLAN        )  psdisplay = psprintf  (" ",psdisplay,"0",Num_Of_Vlans);
if (TAG_t  == NOTAG        )  psdisplay = psprintf  (" ",psdisplay,"|NOTAG ");

if (TYPE_t  == LENGTH       ) psdisplay = psprintf  (" ",psdisplay,"|LENGTH");
if (TYPE_t  == JUMBO        ) psdisplay = psprintf  (" ",psdisplay,"|JUMBO ");
if (TYPE_t  == PAUSE        ) psdisplay = psprintf  (" ",psdisplay,"|PAUSE ");
if (TYPE_t  == CNTRL        ) psdisplay = psprintf  (" ",psdisplay,"|CNTRL ");

if (TYPE_t  == LENGTH ) {
if (LENGTH_t== LES_46       ) psdisplay = psprintf  (" ",psdisplay,"|LES_46       ");
if (LENGTH_t== EQL_46       ) psdisplay = psprintf  (" ",psdisplay,"|EQL_46       ");
if (LENGTH_t== BW_47_TO_1500) psdisplay = psprintf  (" ",psdisplay,"|BW_47_TO_1500");
if (LENGTH_t== GTR_1536     ) psdisplay = psprintf  (" ",psdisplay,"|GTR_1536     ");
if (LENGTH_t== LEN_INVALID  ) psdisplay = psprintf  (" ",psdisplay,"|LEN_INVALID  ");
                       }
else if (TYPE_t  == PAUSE ) {
if (TIME_t  == TIME_ZERO    ) psdisplay = psprintf  (" ",psdisplay,"|TIME_ZERO    ");
if (TIME_t  == TIME_FFFF    ) psdisplay = psprintf  (" ",psdisplay,"|TIME_FFFF    ");
if (TIME_t  == TIME_RAND    ) psdisplay = psprintf  (" ",psdisplay,"|TIME_RAND    ");  }
else
psdisplay = psprintf(" ",psdisplay,"|             ");
psdisplay = psprintf(" ",psdisplay,"|DataLen:    0",length);

if (LENERR_t== LEN_GOOD     ) psdisplay = psprintf  (" ",psdisplay,"|LEN_GOOD");
if (LENERR_t== LEN_BAD      ) psdisplay = psprintf  (" ",psdisplay,"|LEN_BAD ");
}

virtual task CrcTable(){
integer i,j;
bit[31:0] crc;
for(i = 0; i < 256; i++) {
crc                           = i;
for(j = 0; j < 8; j++) {
if(crc[0] == 1) {
crc                       = {1'b0,crc[31:1]};
crc                       = crc ^ 32'hEDB8_8320;
}
else {
crc                       = {1'b0,crc[31:1]};
}
}
Table[255 - i]                   = crc;
//display( "\n TABLE 0 ",Table[i] );
}
}

virtual task calcCrc(bit [7:0] pkt){
integer i;
//display("the value = %h crc ",pkt); 
i                               = Crc[7:0] ^ pkt;
Crc                             = {8'h0,Crc[31:8]};
Crc                             = Crc ^ Table[255 - i];
//display("the table = %h  crc at 0 crc 0 \n ",Table[i],i,Crc); 
}

function integer byte_pack(var bit [7:0] bytes[*],integer offset ,integer kind){
bit [47:0] temp;
integer i;
     if (DA_t == MCAST_VALID & TYPE_t != PAUSE )
temp = MCAST_ADD_VAL;
else if (DA_t == MCAST_VALID & TYPE_t == PAUSE )
temp = MCAST_PAUSE_ADD;
else if (DA_t == MCAST_INVALID )
temp = MCAST_ADD_INV;
else if (DA_t == UCAST_VALID   )
temp = UCAST_ADD_VAL;
else if (DA_t == UCAST_INVALID )
temp = UCAST_ADD_INV;
else if (DA_t == BCAST         )
temp = 48'hFF_FF_FF_FF_FF_FF;
else rvm_note(this.log,psprintf (" DA TYPE ERROR IN ENV "));
Pkt_Packed = new[6 + Pkt_Packed.size()](Pkt_Packed);

'{Pkt_Packed[Pkt_Packed.size() - 6],Pkt_Packed[Pkt_Packed.size() -5],Pkt_Packed[Pkt_Packed.size() -4],Pkt_Packed[Pkt_Packed.size() -3],Pkt_Packed[Pkt_Packed.size() -2],Pkt_Packed[Pkt_Packed.size() -1]}=temp;
rvm_note(this.log,psprintf("\nDA     :0",{Pkt_Packed[Pkt_Packed.size() - 6],Pkt_Packed[Pkt_Packed.size() -5],Pkt_Packed[Pkt_Packed.size() -4],Pkt_Packed[Pkt_Packed.size() -3],Pkt_Packed[Pkt_Packed.size() -2],Pkt_Packed[Pkt_Packed.size() -1]}));
Pkt_Packed = new[6 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 6],Pkt_Packed[Pkt_Packed.size() -5],Pkt_Packed[Pkt_Packed.size() -4],Pkt_Packed[Pkt_Packed.size() -3],Pkt_Packed[Pkt_Packed.size() -2],Pkt_Packed[Pkt_Packed.size() -1]}=SA_ADD;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("SA     :0",{Pkt_Packed[Pkt_Packed.size() - 6],Pkt_Packed[Pkt_Packed.size() -5],Pkt_Packed[Pkt_Packed.size() -4],Pkt_Packed[Pkt_Packed.size() -3],Pkt_Packed[Pkt_Packed.size() -2],Pkt_Packed[Pkt_Packed.size() -1]}));
if(TAG_t == VLAN)
{Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = 16'h81_00;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("VLAN  :0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}));
Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = 16'h11_11;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("TAG CONTROL:0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}));
}
else if (TAG_t == SVLAN)
{Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = 16'h92_00;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("SVALN  :0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}) );
Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = 16'h11_11;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("TAG CONTROL:0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}));
}
else if (TAG_t == MVLAN)
{ for (i =0;i< Num_Of_Vlans ;i++){
 Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = 16'h81_00;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("MVALN  :0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} ));
Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = 16'h11_11;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("TAG CONTROL:0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}));
}}
if (TYPE_t == LENGTH)
{ Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
if(LENERR_t == LEN_GOOD )
 '{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = length;
else
 '{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} = length + 1 + random()%30;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("LENGTH  :0,0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]},{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}));
}
else if (TYPE_t == JUMBO)
{ Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}  = 32'h88_70;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("JUMBO  :0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}));
}
else if (TYPE_t == PAUSE)
{ Pkt_Packed = new[4 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 4],Pkt_Packed[Pkt_Packed.size() - 3],Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}  = 64'h88_08_00_01;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("PAUSE  :0",{Pkt_Packed[Pkt_Packed.size() - 4],Pkt_Packed[Pkt_Packed.size() - 3],Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} ));
Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
if(TIME_t == TIME_ZERO)
i=0;
else if(TIME_t == TIME_FFFF)
i=32'hFFFF;
else
i= random();
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}  = i;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("PAUSETIME  :0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}) );
}
else if (TYPE_t == CNTRL)
{ Pkt_Packed = new[2 + Pkt_Packed.size()](Pkt_Packed);
'{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}  = 32'h88_08;
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf("CNTRL  :0",{Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]}));
}
Pkt_Packed = new[length  + Pkt_Packed.size()](Pkt_Packed);
rvm_note(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_note(this.log,psprintf(" DATA LENGTH :0 ",length));
Pkt_Packed[Pkt_Packed.size() - length ]=Pkt_No;

for(i = Pkt_Packed.size() - length ;i < Pkt_Packed.size() ;i++)
if(PAYLOAD_t == RANDTYPE)
Pkt_Packed[i]= random();
else
Pkt_Packed[i]= 0;
bytes = new[Pkt_Packed.size()] (Pkt_Packed) ;
} //packing

//unpacking function for converting recived data to class properties
function integer byte_unpack(bit [7:0] bytes[*],integer offset ,integer kind){
bit[7:0] byte1,byte2;
bit[47:0] add;
integer length,i,q;
q = 0;
byte1 = 8'h00;
length = bytes.size();
Pkt_Packed = new[length];
while(byte1 != 8'hd5)
{byte1 = bytes[q];
 q++; }
rvm_note(this.log,psprintf(" Preamble length 0 ",q));
Pkt_Packed = new[bytes.size() - q];
foreach(Pkt_Packed,i)
Pkt_Packed[i] = bytes[q+i];
//foreach(Pkt_Packed,i)
//display(" %h",Pkt_Packed[i]);


add[47:40] = bytes[q];q++;
add[39:32] = bytes[q];q++;
add[31:24] = bytes[q];q++;
add[23:16] = bytes[q];q++;
add[15: 8] = bytes[q];q++;
add[ 7: 0] = bytes[q];q++;
if(add == MCAST_ADD_VAL)
   DA_t = MCAST_VALID ;
else if(add == MCAST_PAUSE_ADD)
   { DA_t = MCAST_VALID ;
     TYPE_t = PAUSE ;  }
else if(add == MCAST_ADD_INV)
DA_t = MCAST_INVALID ;
else if(add == UCAST_ADD_VAL)
DA_t = UCAST_VALID ;
else if(add == UCAST_ADD_INV )
DA_t = UCAST_INVALID;
else if(add == 48'hFF_FF_FF_FF_FF_FF)
DA_t = BCAST ;

rvm_note(this.log,psprintf(" DA is %h ",add));
add[47:40] = bytes[q];q++;
add[39:32] = bytes[q];q++;
add[31:24] = bytes[q];q++;
add[23:16] = bytes[q];q++;
add[15: 8] = bytes[q];q++;
add[ 7: 0] = bytes[q];q++;
rvm_note(this.log,psprintf(" SA is %h ",add));
TAG_t = NOTAG ;
for(Num_Of_Vlans = 0; Num_Of_Vlans < 10;Num_Of_Vlans++)
{
  byte1 = bytes[q];q++;
  byte2 = bytes[q];q++;
 if(({byte1,byte2} ==  16'h92_00)|| ({byte1,byte2} ==  16'h81_00))
 { rvm_note(this.log,psprintf(" Vlan :%h ",{byte1,byte2}));
    if({byte1,byte2} ==  16'h92_00)
      TAG_t = SVLAN ;
    else if({byte1,byte2} ==  16'h81_00)
      TAG_t = VLAN ;
    byte1 = bytes[q];q++;
    byte2 = bytes[q];q++;
   rvm_note(this.log,psprintf(" TagFeild :%h ",{byte1,byte2}));
  }
 else
  break;
}
 rvm_note(this.log,psprintf(" TYPEFeild :%h ",{byte1,byte2}));

rvm_note(this.log,psprintf("Num_Of_Vlans 0",Num_Of_Vlans));
if(Num_Of_Vlans > 1)
 TAG_t = MVLAN ;
if({byte1,byte2} == 32'h88_70)
 TYPE_t = JUMBO ;
else if({byte1,byte2} == 16'h88_08)
{ rvm_note(this.log,psprintf(" CNTRL PKT Recieved "));
   byte1 = bytes[q];q++;
   byte2 = bytes[q];q++;
 rvm_note(this.log,psprintf(" TYPEFeild :%h ",{byte1,byte2}));
if({byte1,byte2} == 16'h00_01)
{ rvm_note(this.log,psprintf(" PAUSE PKT Recieved "));
  byte1 = bytes[q];q++;
  byte2 = bytes[q];q++;
 rvm_note(this.log,psprintf(" Pause time :%h ",{byte1,byte2}));
  if({byte1,byte2} == 16'h0)
    TIME_t = TIME_ZERO;
  else if({byte1,byte2} == 16'hFFFF)
    TIME_t = TIME_FFFF;
  else TIME_t = TIME_RAND;

 } }
else if(({byte1,byte2} < 1535) && ({byte1,byte2} > 1))
 TYPE_t = LENGTH ;
  length = bytes.size() - 4 - q;
}

function bit check_crc(){
integer i;
Crc = 32'hffff_ffff;
for(i = 0;i < Pkt_Packed.size() - 4;i++)
calcCrc(Pkt_Packed[i]);
if({Pkt_Packed[Pkt_Packed.size() - 4],Pkt_Packed[Pkt_Packed.size() - 3],Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]} == ~{Crc[7:0],Crc[15:8],Crc[23:16],Crc[31:24]})
{ rvm_note(this.log,psprintf(" GOOD CRC ")); check_crc = 1; }
else
{ rvm_note(this.log,psprintf(" BAD  CRC ")); check_crc = 0;}
  rvm_note(this.log,psprintf(" %h %h",{Pkt_Packed[Pkt_Packed.size() - 4],Pkt_Packed[Pkt_Packed.size() - 3],Pkt_Packed[Pkt_Packed.size() - 2],Pkt_Packed[Pkt_Packed.size() - 1]},~{Crc[7:0],Crc[15:8],Crc[23:16],Crc[31:24]}));
}
function bit compare(rvm_data to,var string diff,integer kind = -1){
packet cmp;
integer i;

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;
}

if(this.Pkt_Packed.size() < 60 )
{  if( cmp.Pkt_Packed.size() != 64)
{ diff = psprintf("ERROR in length match: sent pkt length is  0 expected pkt length is 64 , recieved packet length is 0 ",this.Pkt_Packed.size(),cmp.Pkt_Packed.size());
compare = 0;
return ; }
}
else if((4 + this.Pkt_Packed.size() ) != cmp.Pkt_Packed.size())
{ diff = psprintf("ERROR in length match 0 0 ",this.Pkt_Packed.size(),cmp.Pkt_Packed.size());
compare = 0;
return ; }


foreach(Pkt_Packed,i)
if(this.Pkt_Packed[i] != cmp.Pkt_Packed[i])
{ diff = psprintf("0 ERROR in data match %h %h ",i,this.Pkt_Packed[i],cmp.Pkt_Packed[i]);
 compare = 0;
return  ; }
}

 virtual function rvm_data allocate()
   {
      packet p = new;
      allocate = p;
   }


}
#endif