101 lines
2.3 KiB
Systemverilog
101 lines
2.3 KiB
Systemverilog
|
|
import uvm_pkg::*; // import the UVM library
|
||
|
|
`include "uvm_macros.svh" // Include the UVM macros
|
||
|
|
|
||
|
|
// example transaction
|
||
|
|
class Transaction extends uvm_sequence_item;
|
||
|
|
|
||
|
|
bit [1 : 0] addr;
|
||
|
|
bit [7 : 0] data;
|
||
|
|
|
||
|
|
`uvm_object_utils_begin(Transaction)
|
||
|
|
`uvm_field_int(addr, UVM_DEFAULT)
|
||
|
|
`uvm_field_int(data, UVM_DEFAULT)
|
||
|
|
`uvm_object_utils_end
|
||
|
|
|
||
|
|
constraint addr_data_constraint {
|
||
|
|
addr == 5;
|
||
|
|
5 < data < 10;
|
||
|
|
}
|
||
|
|
|
||
|
|
function new (string name = "Transaction");
|
||
|
|
super.new(name);
|
||
|
|
endfunction : new
|
||
|
|
|
||
|
|
endclass : Transaction
|
||
|
|
|
||
|
|
// test
|
||
|
|
class test extends uvm_test;
|
||
|
|
|
||
|
|
`uvm_component_utils(test)
|
||
|
|
|
||
|
|
bit [2 : 0] i;
|
||
|
|
Transaction tr_queue[$];
|
||
|
|
bit e1, e2;
|
||
|
|
|
||
|
|
function new(string name = "test", uvm_component parent = null);
|
||
|
|
super.new(name, parent);
|
||
|
|
endfunction : new
|
||
|
|
|
||
|
|
// build phase - fill tr_queue with 10 random transactions
|
||
|
|
function void build_phase(uvm_phase phase);
|
||
|
|
Transaction tr;
|
||
|
|
super.build_phase(phase);
|
||
|
|
|
||
|
|
`uvm_info(get_type_name(), "Starting build phase ...", UVM_HIGH)
|
||
|
|
tr = Transaction::type_id::create("tr");
|
||
|
|
|
||
|
|
for(i = 0; i < 10; i++) begin
|
||
|
|
tr.randomize();
|
||
|
|
tr_queue.push_back(tr);
|
||
|
|
end
|
||
|
|
endfunction : build_phase
|
||
|
|
|
||
|
|
task run_phase(uvm_phase phase);
|
||
|
|
`uvm_info(get_type_name(), "Starting run phase ...", UVM_HIGH)
|
||
|
|
phase.raise_objection(this);
|
||
|
|
|
||
|
|
fork
|
||
|
|
generate_random_events();
|
||
|
|
display_tr();
|
||
|
|
join_any;
|
||
|
|
disable fork;
|
||
|
|
|
||
|
|
phase.drop_objection(this);
|
||
|
|
endtask : run_phase
|
||
|
|
|
||
|
|
task generate_random_events();
|
||
|
|
forever begin
|
||
|
|
#($urandom_range(10,1)); // delay
|
||
|
|
if($urandom_range(1)) begin
|
||
|
|
`uvm_info(get_type_name(), "e1 changed...", UVM_HIGH)
|
||
|
|
e1 = !e1;
|
||
|
|
end
|
||
|
|
else begin
|
||
|
|
`uvm_info(get_type_name(), "e2 changed...", UVM_HIGH)
|
||
|
|
e2 = !e2;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
endtask : generate_random_events
|
||
|
|
|
||
|
|
task display_tr();
|
||
|
|
Transaction tr;
|
||
|
|
while(tr_queue.size()) begin
|
||
|
|
@(e1 || e2);
|
||
|
|
tr = tr_queue[i];
|
||
|
|
`uvm_info(get_type_name(),
|
||
|
|
$sformatf("Transaction: \n%s", tr.sprint()),
|
||
|
|
UVM_HIGH)
|
||
|
|
end
|
||
|
|
endtask : display_tr
|
||
|
|
|
||
|
|
endclass : test
|
||
|
|
|
||
|
|
// top module
|
||
|
|
module top();
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
run_test("test");
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule : top
|