Code Browser Pages:
Files in
vmm_eth.tar



call_back.sv
cfg_intf.sv
cfg_xtor.sv
chan.sv
cov.sv
env.sv
file_list
host_driver.sv
host_intf.sv
host_xtor_rx.sv
host_xtor.sv
phy_driver.sv
phy_intf.sv
phy_xtor_rx.sv
phy_xtor.sv
pkt_generator_rx.sv
pkt_generator.sv
pkt.sv
pro.sv
run
Current file: rx_pkt.sv
sb.sv
tb_top.v
timescale.v
top.sv
verilog_top.v



// 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