Code Browser Pages:
| // by gopi@testbench.in `include "vmm.sv" `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 typedef enum {FCS_GOOD,FCS_BAD} FCS_e ; typedef enum {PREAM_EQL7,PREAM_LES7,PREAM_GTR7} PREAM_e ; typedef enum {SFD_GOOD,SFD_BAD} SFD_e ; 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 vmm_data copy (vmm_data to = null); rx_packet cpy; if (to != null) begin if (!$cast(cpy, to)) begin `vmm_fatal(log,"Not a atm_cell instance"); return; end end 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; endfunction 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"); endfunction virtual function int unsigned byte_pack(ref logic [7:0] bytes[], input int unsigned offset = 0, input int 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}; bytes = new[preamlength]; for(i=0;i<preamlength;i++) bytes[i]=8'h55; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("pream len 0",preamlength)); bytes = new[1 + bytes.size()](bytes); if(SFD_t == SFD_GOOD) bytes[bytes.size() - 1 ]=8'hd5; if(SFD_t == SFD_BAD) bytes[bytes.size() - 1 ]=8'hdd; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("SFD :0",{bytes[bytes.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 `vmm_debug(this.log,$psprintf (" DA TYPE ERROR IN ENV ")); bytes = new[6 + bytes.size()](bytes); {bytes[bytes.size() - 6],bytes[bytes.size() -5],bytes[bytes.size() -4],bytes[bytes.size() -3],bytes[bytes.size() -2],bytes[bytes.size() -1]}=temp; `vmm_debug(this.log,$psprintf("\nDA :0",{bytes[bytes.size() - 6],bytes[bytes.size() -5],bytes[bytes.size() -4],bytes[bytes.size() -3],bytes[bytes.size() -2],bytes[bytes.size() -1]})); bytes = new[6 + bytes.size()](bytes); {bytes[bytes.size() - 6],bytes[bytes.size() -5],bytes[bytes.size() -4],bytes[bytes.size() -3],bytes[bytes.size() -2],bytes[bytes.size() -1]}= `SA_ADD; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("SA :0",{bytes[bytes.size() - 6],bytes[bytes.size() -5],bytes[bytes.size() -4],bytes[bytes.size() -3],bytes[bytes.size() -2],bytes[bytes.size() -1]})); if(TAG_t == VLAN) begin bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 16'h81_00; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("VLAN :0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 16'h11_11; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("TAG CONTROL:0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); end else if (TAG_t == SVLAN) begin bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 16'h92_00; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("SVALN :0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]} )); bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 16'h11_11; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("TAG CONTROL:0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); end else if (TAG_t == MVLAN) begin for (i =0;i< Num_Of_Vlans ;i++)begin bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 16'h81_00; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("MVALN :0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]} )); bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 16'h11_11; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("TAG CONTROL:0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); end end if (TYPE_t == LENGTH) begin bytes = new[2 + bytes.size()](bytes); if(LENERR_t == LEN_GOOD ) {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = length; else {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = length + 1 + $random()%30; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("LENGTH :0,0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]},{bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); end else if (TYPE_t == JUMBO) begin bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 32'h88_70; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("JUMBO :0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); end else if (TYPE_t == PAUSE) begin bytes = new[4 + bytes.size()](bytes); {bytes[bytes.size() - 4],bytes[bytes.size() - 3],bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 64'h88_08_00_01; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("PAUSE :0",{bytes[bytes.size() - 4],bytes[bytes.size() - 3],bytes[bytes.size() - 2],bytes[bytes.size() - 1]} )); bytes = new[2 + bytes.size()](bytes); if(TIME_t == TIME_ZERO) i=0; else if(TIME_t == TIME_FFFF) i=32'hFFFF; else i= $random(); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = i; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("PAUSETIME :0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]}) ); end else if (TYPE_t == CNTRL) begin bytes = new[2 + bytes.size()](bytes); {bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = 32'h88_08; `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf("CNTRL :0",{bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); end bytes = new[length + bytes.size()](bytes); `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); `vmm_debug(this.log,$psprintf(" DATA LENGTH :0 ",length)); bytes[bytes.size() - length ]=Pkt_No; for(i = bytes.size() - length ;i < bytes.size() ;i++) if(PAYLOAD_t == RANDTYPE) bytes[i]= $random(); else bytes[i]= 0; Crc = 32'hffff_ffff; for(i = 0;i < bytes.size();i++) calcCrc(bytes[i]); bytes = new[4 + bytes.size()](bytes); `vmm_debug(this.log,$psprintf("\n size 0 ",bytes.size())); if (FCS_t == FCS_GOOD ) begin {bytes[bytes.size() - 4],bytes[bytes.size() - 3],bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = ~{Crc[7:0],Crc[15:8],Crc[23:16],Crc[31:24]}; end else begin {bytes[bytes.size() - 4],bytes[bytes.size() - 3],bytes[bytes.size() - 2],bytes[bytes.size() - 1]} = {Crc[7:0],Crc[15:8],Crc[23:16],Crc[31:24]}; end `vmm_debug(this.log,$psprintf( " CRC :0 ",{bytes[bytes.size() - 4],bytes[bytes.size() - 3],bytes[bytes.size() - 2],bytes[bytes.size() - 1]})); Pkt_Packed = new[ bytes.size()]; foreach(Pkt_Packed[i]) Pkt_Packed[i] = bytes[i]; byte_pack = bytes.size() ; endfunction virtual function bit compare(vmm_data to,output string diff,input int kind = -1); integer i; rx_packet p; $cast(p,to); compare = 1; $display(" PREAm length 0 ",this.preamlength); if((this.Pkt_Packed.size() -5 - preamlength )!= p.Pkt_Packed.size()) begin diff = $psprintf("RX ERROR in length match 0 0 ",(this.Pkt_Packed.size() -5 - preamlength),p.Pkt_Packed.size()); compare = 0; return ; end for(i = 0;i < this.Pkt_Packed.size() - preamlength - 1 -4 ;i++) if(this.Pkt_Packed[i +preamlength +1] != p.Pkt_Packed[i]) begin diff = $psprintf("0 ERROR in data match %h %h ",i,this.Pkt_Packed[i + preamlength +1],p.Pkt_Packed[i]); compare = 0; return ; end endfunction virtual function int unsigned byte_unpack(const ref logic [7:0] bytes[], input int unsigned offset = 0, input int len = -1, input int kind = -1); bit[7:0] byte1,byte2; bit[47:0] add; integer i,q; q = 0; byte1 = 8'h00; Pkt_Packed = new[bytes.size()]; 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) begin DA_t = MCAST_VALID ; TYPE_t = PAUSE ; end 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 ; `vmm_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++; `vmm_debug(this.log,$psprintf(" SA is %h ",add)); TAG_t = NOTAG ; for(Num_Of_Vlans = 0; Num_Of_Vlans < 10;Num_Of_Vlans++) begin byte1 = bytes[q];q++; byte2 = bytes[q];q++; if(({byte1,byte2} == 16'h92_00)|| ({byte1,byte2} == 16'h81_00)) begin `vmm_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++; `vmm_debug(this.log,$psprintf(" TagFeild :%h ",{byte1,byte2})); end else break; end `vmm_debug(this.log,$psprintf(" TYPEFeild :%h ",{byte1,byte2})); `vmm_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) begin `vmm_debug(this.log,$psprintf(" CNTRL PKT Recieved ")); byte1 = bytes[q];q++; byte2 = bytes[q];q++; `vmm_debug(this.log,$psprintf(" TYPEFeild :%h ",{byte1,byte2})); if({byte1,byte2} == 16'h00_01) begin `vmm_debug(this.log,$psprintf(" PAUSE PKT Recieved ")); byte1 = bytes[q];q++; byte2 = bytes[q];q++; `vmm_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; end end else if(({byte1,byte2} < 1535) && ({byte1,byte2} > 1)) TYPE_t = LENGTH ; length = bytes.size() - 4 ; Pkt_Packed = new[bytes.size()]; foreach(Pkt_Packed[i]) Pkt_Packed[i] = bytes[i]; endfunction virtual function vmm_data allocate(); rx_packet p = new; allocate = p; endfunction endclass `endif |