blob: fded507c4330ddb0a97b79fd8dc5dd5635262650 [file] [log] [blame]
/******************************************************************************
* (C) Copyright 2014 AMIQ Consulting
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* NAME: amiq_eth_packet_length.sv
* PROJECT: amiq_eth
* Description: This file contains the declaration of the basic Ethernet frame
* in which Length/Type field is interpreted as Length.
* The definition of this packet is described in IEEE 802.3-2012.
* For more details see file docs/ieee_802.3-2012/802.3-2012_section1.pdf,
* chapter 3. Media Access Control (MAC) frame and packet specifications
*******************************************************************************/
`ifndef __AMIQ_ETH_PACKET_LENGTH
//protection against multiple includes
`define __AMIQ_ETH_PACKET_LENGTH
//Basic class for declaring the Ethernet packets in which Length/Type field is interpreted as Length.
class amiq_eth_packet_length extends amiq_eth_packet;
`uvm_object_utils(amiq_eth_packet_length)
//Length
rand amiq_eth_length length;
constraint length_constraint {
length >= `AMIQ_ETH_PAYLOAD_SIZE_MIN &&
length <= `AMIQ_ETH_PAYLOAD_SIZE_MAX;
}
//MAC Client Data
rand amiq_eth_data client_data[$];
constraint client_data_constraint {
client_data.size() == length;
}
//Frame Check Sequence
rand amiq_eth_fcs fcs;
//constructor
//@param name - the name assigned to the instance of this class
function new(string name = "");
super.new(name);
endfunction
//pack the entire Ethernet packet
//@param packer - the packer used by this function
virtual function void do_pack(uvm_packer packer);
super.do_pack(packer);
`uvm_pack_int(length);
`uvm_pack_queue(client_data);
`uvm_pack_int(fcs);
endfunction
//unpack the entire Ethernet packet
//@param packer - the packer used by this function
virtual function void do_unpack(uvm_packer packer);
super.do_unpack(packer);
`uvm_unpack_int(length);
`uvm_unpack_queue(client_data);
`uvm_unpack_int(fcs);
endfunction
//converts the information containing in the instance of this class to an easy-to-read string
//@return easy-to-read string with the information contained in the instance of this class
virtual function string convert2string();
return $sformatf("%s, Length: %0d, Client DATA size: %0d, FCS: %08X",
super.convert2string(), length, client_data.size(), fcs);
endfunction
//function for packing the Ethernet packet into an UVM generic payload class
//@return an instance of the UVM generic payload containing the packed Ethernet packet
virtual function uvm_tlm_generic_payload to_generic_payload();
uvm_tlm_generic_payload result = super.to_generic_payload();
result.set_address(`AMIQ_ETH_PACKET_LENGTH_CODE);
return result;
endfunction
endclass
`endif