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