Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 1ns/1ps
- `include "uvm_macros.svh"
- import uvm_pkg :: *;
- `define ADDR_WIDTH_IN_BITS 8
- `define DATA_WIDTH_IN_BITS 8
- //-----------------------------------------------------------------------------
- // Interface
- //-----------------------------------------------------------------------------
- interface my_interface(input logic clk,
- input logic rstn /* Active Low Reset */);
- bit valid;
- logic [`ADDR_WIDTH_IN_BITS - 1 : 0] start_addr;
- reg [`DATA_WIDTH_IN_BITS - 1 : 0] data_reg;
- wire [`DATA_WIDTH_IN_BITS - 1 : 0] data;
- int unsigned length_in_bytes;
- assign data = data_reg;
- endinterface : my_interface
- typedef virtual my_interface my_vif;
- typedef class my_agent;
- //-----------------------------------------------------------------------------
- // Agent Configuration Class
- //-----------------------------------------------------------------------------
- class my_agent_cfg extends uvm_object;
- // virtual interface
- my_vif vif;
- // The length of time, in ps, that reset will stay active
- int unsigned reset_time_ps = 10;
- // Minimum length of payload data
- int unsigned min_payload_length = 5;
- // Maximum length of payload data
- int unsigned max_payload_length = 100;
- uvm_active_passive_enum is_active = UVM_ACTIVE;
- `uvm_object_utils_begin(my_agent_cfg)
- `uvm_field_enum(uvm_active_passive_enum, is_active, UVM_DEFAULT)
- `uvm_field_int(reset_time_ps, UVM_DEFAULT | UVM_DEC)
- `uvm_field_int(min_payload_length, UVM_DEFAULT | UVM_DEC)
- `uvm_field_int(max_payload_length, UVM_DEFAULT | UVM_DEC)
- `uvm_object_utils_end
- function new(string name="my_agent_cfg");
- super.new(name);
- endfunction : new
- function void is_valid();
- if (max_payload_length < min_payload_length) begin
- `uvm_error(get_name(),
- $sformatf("Value of max_payload_length is shall be greater or equal to value of min_payload_length, configured values of max_payload_length:%0d, min_payload_length:%0d",
- max_payload_length, min_payload_length))
- end
- if (reset_time_ps <= 0) begin
- `uvm_error(get_name(), $sformatf("reset_time_ps shall be greater than 0"))
- end
- endfunction : is_valid
- endclass : my_agent_cfg
- //-----------------------------------------------------------------------------
- // Sequence Item Class
- //-----------------------------------------------------------------------------
- class my_seq_item extends uvm_sequence_item;
- // Random varialbes
- rand logic [`ADDR_WIDTH_IN_BITS - 1 : 0] start_addr;
- rand logic [`DATA_WIDTH_IN_BITS - 1 : 0] data[];
- rand int unsigned payload_length;
- // Non random variables
- my_agent_cfg cfg;
- `uvm_object_utils_begin(my_seq_item)
- `uvm_field_int (start_addr, UVM_DEFAULT | UVM_HEX)
- `uvm_field_int (payload_length, UVM_DEFAULT | UVM_DEC)
- `uvm_field_array_int (data, UVM_DEFAULT | UVM_HEX)
- `uvm_object_utils_end
- constraint length_cn {
- payload_length inside {[cfg.min_payload_length : cfg.max_payload_length]};
- data.size == payload_length;
- }
- constraint order_cn {
- solve payload_length before data;
- }
- function new(string name="my_seq_item");
- super.new(name);
- endfunction : new
- function string convert2string();
- convert2string = $sformatf("start_addr:%0h, payload_length:%0d, data[0]:%0h, data[%0d]:%0h",
- start_addr, payload_length, data[0], payload_length-1, data[payload_length-1]);
- endfunction : convert2string
- endclass : my_seq_item
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement