Packages
- Provide a common name space •
- Can be imported •
- Can contain common objects •
// You can have the followings in a package // • Common typedefs // • Common class definitions // • Shared instances or variables import uvm_pkg::*; `include "defines.svh" `include "macro_defines.svh" `include "test_plugin.svh" module top; initial begin #10ns; uvm_top.uvm_report_info ($psprintf("%m"), "This is an info message"); end endmodule
Macros
`define info(msg) uvm_top.uvm_report_info($psprintf("%m"), msg); `define warning(msg) uvm_top.uvm_report_warning($psprintf("%m"), msg); `define error(msg) uvm_top.uvm_report_error($psprintf("%m"), msg); `define fatal(msg) uvm_top.uvm_report_fatal($psprintf("%m"), msg); import uvm_pkg::*; module top; initial begin `info ("My info message goes here"); `warning ("My warning message goes here"); `error ("My error message goes here"); `fatal ("My fatal message goes here"); end endmodule `ifdef FPGA module sythesizable_block; endmodule // monitor `else module beh_model; endmodule // beh_model; `endif // !`ifdef FPGA
// Define macro when you compile in dofile % if (file exists work) {delete -all} % vlib work % vlog top.sv +define+FPGA % vsim -novopt top % run -all
Classes
class read_op extends memory_op; constraint read_only_c {mem_op == read;}; endclass // read_op // • Put each class in individual .svh file // • Put all .svh files in a package "tb_pkg" using `include // • Put all files in a file list "vfiles.f" to compile // • In the top test bench file, import "uvm_pkg" and this "tb_pkg"
UVM package
- uvm_report_object
- uvm_cmdline_processor
- uvm_component
- uvm_agent
- uvm_driver #()
- uvm_env
- uvm_monitor
- uvm_port_component_base
- uvm_root
- uvm_scoreboard
- uvm_sequencer_base
- uvm_test
- uvm_tlm_fifo_base #()
- UVM phases used in uvm_test
- function void build_phase()
- function void connect_phase()
- function void end_of_elaboration_phase()
- function void start_of_simulation_phase()
- function void run_phase()
- function void extract_phase()
- function void check_phase()
- function void report_phase()
- Use "+UVM_TESTNAME=test1" to run different tests
- The sub classes extended rom uvm_test with UVM_TESTNAME plusarg will start the run_test() that is defined in uvm_pkg and the run_test() uses UVM factory pattern to create a test object.
class test1 extends uvm_test; `uvm_component_util(test1) function new (string name, uvm_component base); super.new(name, base); endfunction : new task run_phase(uvm_phase phase); phase.raise_objection(this); // tell UVM this thread started super.run(); `uvm_info("test1: ", "Starting...", UVM_INFO); phase.drop_objection(this); // tell UVM this thread finished endtask endclass : test1 // in top module module top; initial run_test(); // this will create a test object // and executes its run_phase() endmodule : top
UVM Structure
- Top
- uvm_test or program in SystemVerilog
- task run();
- uvm_env
- uvm_agent
- driver
- run
- monitor
- $monitoron / $monitoroff
- sync_reset
- semaphore
- semaphore sem = new(1);
- sem.get(1) ... sem.put(1)
- `uvm_raise_objection(this)
/ `uvm_drop_objection(this) - disable <block_name>;
- sequencer
- sequence
- body
- start
- transaction
- build
- run
- uvm_scoreboard or ovm_subscriber
- uvm_agent for coverage
- interface
- DUT
UVM Randomization and Constraints
typedef logic [15:0] addr_type; typedef logic [7:0] data_type; typedef enum {read, write, nop} op_type; class my_op; rand addr_type addr; rand data_type data; rand op_type cmd; ... endclass : my_op class read_op extends my_op; constraint read_only_cmd {my_op == read;}; endclass // read_op module top; my_op op; read_op rdop; addr_type addr2; initial begin op = new(); addr2 = $random; repeat (2) begin assert(op.randomize()); // with constraint assert(op.randomize() with {my_op == read;}); assert(rdop.randomize()); // this will be limited to read only end end endmodule // top
No comments:
Post a Comment