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
pkt.vr
pro.vr
run
Current file: rx_pkt.vr
sb.vr
timescale.v
top.v



#include <rvm_std_lib.vrh>

#ifndef RX_PKT_CLASS
#define RX_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


enum FCS_e {FCS_GOOD,FCS_BAD};
enum PREAM_e {PREAM_EQL7,PREAM_LES7,PREAM_GTR7};
enum SFD_e   {SFD_GOOD,SFD_BAD};

class rx_packet extends packet{
string name = "rx_pkt";
rand FCS_e      FCS_t;
rand PREAM_e    PREAM_t ;
rand SFD_e      SFD_t   ;
bit [3:0] preamlength;


constraint fcs_c {FCS_t dist {FCS_GOOD := 80,FCS_BAD := 20};}
constraint sfd_c { SFD_t dist { SFD_GOOD := 95,SFD_BAD := 5 };}
constraint pream_c { PREAM_t dist { PREAM_EQL7 := 50,PREAM_LES7 := 5,PREAM_GTR7 := 45 } ;}
constraint test_case ;


virtual function rvm_data copy (rvm_data to = null){
rx_packet cpy;
if (to != null) {
if (!cast_assign(cpy, to, CHECK)) {
rvm_fatal(log,"Not a atm_cell instance");
return;
}
} else cpy = new;

void = super.copy(cpy);
cpy.FCS_t        = this.FCS_t;
cpy.PREAM_t      = this.PREAM_t              ;
cpy.SFD_t        = this.SFD_t                ;
cpy.preamlength  = this.preamlength          ;

copy = cpy;
}



virtual function string psdisplay(string prefix = ""){
psdisplay = prefix;
if (PREAM_t == PREAM_EQL7   ) psdisplay = psprintf (" ",psdisplay,"|PREAM_EQL7");
if (PREAM_t == PREAM_LES7   ) psdisplay = psprintf (" ",psdisplay,"|PREAM_LES7");
if (PREAM_t == PREAM_GTR7   ) psdisplay = psprintf (" ",psdisplay,"|PREAM_GTR7");

if (SFD_t   == SFD_GOOD     ) psdisplay = psprintf (" ",psdisplay,"|SFD_GOOD");
if (SFD_t   == SFD_BAD      ) psdisplay = psprintf (" ",psdisplay,"|SFD_BAD ");
 psdisplay = psprintf (" ",psdisplay,super.psdisplay());
if (FCS_t == FCS_GOOD     )   psdisplay = psprintf (" ",psdisplay,"|FCS_GOOD");
if (FCS_t == FCS_BAD     )    psdisplay = psprintf (" ",psdisplay,"|FCS_BAD");
}

function integer byte_pack(var bit [7:0] bytes[*],integer offset = 0,integer kind = -1){
integer i;
bit [47:0] temp;

if(PREAM_t == PREAM_EQL7 )
preamlength = 7;
else if(PREAM_t == PREAM_LES7)
preamlength = {random()}%7;
else if(PREAM_t == PREAM_GTR7)
preamlength = 8 + {random()%7};
Pkt_Packed = new[preamlength];
for(i=0;i<preamlength;i++)
Pkt_Packed[i]=8'h55;
rvm_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(this.log,psprintf("pream len 0",preamlength));
Pkt_Packed = new[1 + Pkt_Packed.size()](Pkt_Packed);

if(SFD_t == SFD_GOOD)
Pkt_Packed[Pkt_Packed.size() - 1 ]=8'hd5;
if(SFD_t == SFD_BAD)
Pkt_Packed[Pkt_Packed.size() - 1 ]=8'hdd;
rvm_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(this.log,psprintf("SFD  :0",{Pkt_Packed[Pkt_Packed.size() - 1]} ));

     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_debug(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_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));
rvm_debug(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;

Crc = 32'hffff_ffff;
for(i = 0;i < Pkt_Packed.size();i++)
calcCrc(Pkt_Packed[i]);

Pkt_Packed = new[4  + Pkt_Packed.size()](Pkt_Packed);
rvm_debug(this.log,psprintf("\n size 0 ",Pkt_Packed.size()));

if (FCS_t == FCS_GOOD )
{'{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]};
}
else
{'{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_debug(this.log,psprintf( " CRC :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]}));
bytes = new[Pkt_Packed.size()] (Pkt_Packed) ;

}

function bit compare(packet p){
integer i;
compare = 0;
if((this.Pkt_Packed.size() -preamlength -1)!= p.Pkt_Packed.size())
{ rvm_note(this.log,psprintf("RXERROR in length match 0 0 ",(this.Pkt_Packed.size() - preamlength - 1),p.Pkt_Packed.size()));
compare = 1;
return ; }


for(i = 0;i < this.Pkt_Packed.size() - preamlength - 1;i++)
if(this.Pkt_Packed[i +preamlength] != p.Pkt_Packed[i])
{ rvm_note(this.log,psprintf("0 ERROR in data match %h %h ",i,this.Pkt_Packed[i],p.Pkt_Packed[i]));
 compare = 1;
return  ; }
}

function integer byte_unpack(bit [7:0] bytes[*],integer offset = 0 ,integer kind = -1){
bit[7:0] byte1,byte2;
bit[47:0] add;
integer i,q;
q = 0;
byte1 = 8'h00;
Pkt_Packed = new[bytes.size()];
//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_debug(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_debug(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_debug(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_debug(this.log,psprintf(" TagFeild :%h ",{byte1,byte2}));
  }
 else
  break;
}
 rvm_debug(this.log,psprintf(" TYPEFeild :%h ",{byte1,byte2}));

rvm_debug(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_debug(this.log,psprintf(" CNTRL PKT Recieved "));
   byte1 = bytes[q];q++;
   byte2 = bytes[q];q++;
 rvm_debug(this.log,psprintf(" TYPEFeild :%h ",{byte1,byte2}));
if({byte1,byte2} == 16'h00_01)
{ rvm_debug(this.log,psprintf(" PAUSE PKT Recieved "));
  byte1 = bytes[q];q++;
  byte2 = bytes[q];q++;
 rvm_debug(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 ;


}


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



}
#endif