Code Browser Pages:
| #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 |