| //////////////////////////////////////////////// |
| ////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s//// |
| ////s www.testbench.in s//// |
| ////s s//// |
| ////s UVM Tutorial s//// |
| ////s s//// |
| ////s gopi@testbench.in s//// |
| ////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s//// |
| //////////////////////////////////////////////// |
| `ifndef GUARD_PACKET |
| `define GUARD_PACKET |
| |
| |
| //Define the enumerated types for packet types |
| typedef enum { GOOD_FCS, BAD_FCS } fcs_kind_t; |
| |
| class Packet extends uvm_sequence_item; |
| |
| rand fcs_kind_t fcs_kind; |
| |
| rand bit [7:0] length; |
| rand bit [7:0] da; |
| rand bit [7:0] sa; |
| rand bit [7:0] data[]; |
| rand byte fcs; |
| |
| constraint payload_size_c { data.size inside { [2 : 55]};} |
| |
| constraint length_c { length == data.size; } |
| |
| |
| function new(string name = ""); |
| super.new(name); |
| endfunction : new |
| |
| function void post_randomize(); |
| if(fcs_kind == GOOD_FCS) |
| fcs = 8'b0; |
| else |
| fcs = 8'b1; |
| fcs = cal_fcs(); |
| endfunction : post_randomize |
| |
| ///// method to calculate the fcs ///// |
| virtual function byte cal_fcs; |
| return da ^ sa ^ length ^ data.xor() ^ fcs; |
| endfunction : cal_fcs |
| |
| `uvm_object_utils_begin(Packet) |
| `uvm_field_int(da, UVM_ALL_ON|UVM_NOPACK) |
| `uvm_field_int(sa, UVM_ALL_ON|UVM_NOPACK) |
| `uvm_field_int(length, UVM_ALL_ON|UVM_NOPACK) |
| `uvm_field_array_int(data, UVM_ALL_ON|UVM_NOPACK) |
| `uvm_field_int(fcs, UVM_ALL_ON|UVM_NOPACK) |
| `uvm_object_utils_end |
| |
| function void do_pack(uvm_packer packer); |
| super.do_pack(packer); |
| packer.pack_field_int(da,$bits(da)); |
| packer.pack_field_int(sa,$bits(sa)); |
| packer.pack_field_int(length,$bits(length)); |
| foreach(data[i]) |
| packer.pack_field_int(data[i],8); |
| packer.pack_field_int(fcs,$bits(fcs)); |
| endfunction : do_pack |
| |
| function void do_unpack(uvm_packer packer); |
| int sz; |
| super.do_pack(packer); |
| |
| da = packer.unpack_field_int($bits(da)); |
| sa = packer.unpack_field_int($bits(sa)); |
| length = packer.unpack_field_int($bits(length)); |
| |
| data.delete(); |
| data = new[length]; |
| foreach(data[i]) |
| data[i] = packer.unpack_field_int(8); |
| fcs = packer.unpack_field_int($bits(fcs)); |
| endfunction : do_unpack |
| |
| endclass : Packet |
| |
| /* |
| ///////////////////////////////////////////////////////// |
| //// Test to check the packet implementation //// |
| ///////////////////////////////////////////////////////// |
| module test; |
| |
| Packet pkt1 = new("pkt1"); |
| Packet pkt2 = new("pkt2"); |
| byte unsigned pkdbytes[]; |
| |
| initial |
| repeat(10) |
| if(pkt1.randomize) |
| begin |
| $display(" Randomization Sucessesfull."); |
| pkt1.print(); |
| uvm_default_packer.use_metadata = 1; |
| void'(pkt1.pack_bytes(pkdbytes)); |
| $display("Size of pkd bits %d",pkdbytes.size()); |
| pkt2.unpack_bytes(pkdbytes); |
| pkt2.print(); |
| if(pkt2.compare(pkt1)) |
| $display(" Packing,Unpacking and compare worked"); |
| else |
| $display(" *** Something went wrong in Packing or Unpacking or compare *** \n \n"); |
| end |
| else |
| $display(" *** Randomization Failed ***"); |
| |
| endmodule |
| |
| */ |
| `endif |