OpenCores
URL https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk

Subversion Repositories qaz_libs

[/] [qaz_libs/] [trunk/] [avalon_lib/] [sim/] [src/] [amm_bfm/] [amm_transaction_pkg.sv] - Rev 38

Go to most recent revision | Compare with Previous | Blame | View Log

//////////////////////////////////////////////////////////////////////
////                                                              ////
//// Copyright (C) 2015 Authors and OPENCORES.ORG                 ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// details.                                                     ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
//////////////////////////////////////////////////////////////////////


package amm_transaction_pkg;

  // --------------------------------------------------------------------
  //
  class amm_delay_class;

    rand int unsigned delay;


    // --------------------------------------------------------------------
    //
    function int unsigned
      next;

      assert(this.randomize() with{delay dist {0 := 40, [1:3] := 40, [4:7] := 20};});
      return(delay);

    endfunction: next


  // --------------------------------------------------------------------
  //
  endclass: amm_delay_class


  // --------------------------------------------------------------------
  //
  class amm_payload_class #(N = 8, B = 1);

    rand logic [(8*N)-1:0]  w[];


    // --------------------------------------------------------------------
    //
    function
      new
      (
        logic [B-1:0] burstcount = 0
      );

      this.w  = new[burstcount + 1];

    endfunction: new


    // --------------------------------------------------------------------
    //
    function void
      random
      (
        logic [B-1:0] burstcount = 0
      );

      this.w = new[burstcount + 1];
      assert(this.randomize());

    endfunction: random


  // --------------------------------------------------------------------
  //
  endclass: amm_payload_class


  // --------------------------------------------------------------------
  //
  class amm_transaction_class #(A = 32, N = 8, B = 1);

    amm_delay_class delay_h;
    amm_payload_class #(.N(N), .B(B)) payload_h;
    amm_payload_class #(.N(N), .B(B)) data_h;
    rand logic  [(A-1):0]   address = 'bz;
    rand logic  [N-1:0]     byteenable = {N{1'b1}};
    rand logic  [B-1:0]     burstcount = 1;

    constraint default_burstcount
    {
      burstcount dist {0 := 40, [1:15] := 40, [16:255] := 20};
    }


    // --------------------------------------------------------------------
    //
    function
      new
      (
        logic [B-1:0] burstcount = 0
      );

      this.payload_h  = new(burstcount + 1);
      this.delay_h    = new;

    endfunction: new


    // --------------------------------------------------------------------
    //
    function void
      basic_random;

      assert(this.randomize() with
      {
        this.burstcount == 1;
      });

      this.payload_h.random(this.burstcount);

    endfunction: basic_random


    // // --------------------------------------------------------------------
    // //
    // function void
      // basic_random_burst;

      // assert(this.randomize() with
      // {
        // this.addr[$clog2(N*8)-1:0] == 0;
        // this.id == 0;
        // this.resp == 0;
        // this.burst == 2'b01;
        // this.size == $clog2(N);
        // this.len dist {0 := 40, [1:3] := 40, [4:15] := 20};
      // });

      // this.payload_h.random(this.len);

    // endfunction: basic_random_burst


    // --------------------------------------------------------------------
    //
    function void
      basic_read
      (
        logic [(A-1):0] address,
        logic [B-1:0] burstcount = 1
      );

      this.address = address;
      this.burstcount = burstcount;
      this.payload_h.random(burstcount);
      
    endfunction: basic_read


    // --------------------------------------------------------------------
    //
    function void
      basic_write
      (
        logic [(A-1):0] address,
        logic [B-1:0] burstcount = 1
      );

      this.address = address;
      this.burstcount = burstcount;
      this.payload_h.random(burstcount);

    endfunction: basic_write


    // --------------------------------------------------------------------
    //
    function void copy
    (
      amm_transaction_class #(.A(A), .N(N), .B(B)) from
    );

      this.address    = from.address;
      this.byteenable = from.byteenable;
      this.burstcount = from.burstcount;

    endfunction: copy


    // --------------------------------------------------------------------
    //
    virtual function amm_transaction_class #(.A(A), .N(N), .B(B)) clone;

      clone = new();
      clone.copy(this);
      return(clone);

    endfunction: clone


  // --------------------------------------------------------------------
  //
  endclass: amm_transaction_class


// --------------------------------------------------------------------
//
endpackage: amm_transaction_pkg

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.