作為一名芯片驗證工程師,使用宏定義的方式會節(jié)省你的工作時間。當然這也不是唯一實現(xiàn)節(jié)省時間的方法,不管怎樣,技多不壓身,下面就怎么定義并使用給大家舉個例子介紹下。
你的環(huán)境中好幾個文件里面要用到一個task,但是這個task需要傳不同的實參,這個時候你只要在你的環(huán)境的一個全局文件里面定義好,然后把這個全局文件include在一個package文件中,這樣就會減少一些不必要的重復工作。
(下圖是女兒畫的我,哈哈哈)

我們還是從一個例子來一探究竟吧。
`ifndef EXP_HANDSOME_TEST__SV
`define EXP_HANDSOME_TEST__SV
class exp_test_base extends uvm_test;
? `uvm_component_utils(exp_test_base)
? exp_env env;
? extern function new(string name="exp_test_base",uvm_component parent);
? extern virtual function void build_phase(uvm_phase phase);
? extern virtual function void connect_phase(uvm_phase phase);
? extern virtual task wait_everthing_done();
endclass:exp_test_base
function exp_test_base::new(string name="exp_test_base",uvm_component parent);
? super.new(name,parent);
endfunction:new
function void exp_test_base::build_phase(uvm_phase phase);
? super.build_phase(phase);
? //create the env object
? env = exp_env::type_id::create("env",this);
...
endfunction:build_phase
function void exp_test_base::connect_phase(uvm_phase phase);
? super.connect_phase(phase);
...
endfunction:connect_phase
task exp_test_base::wait_everthing_done();
? ? ? fork
? ? ? ? forever begin
? ? ? ? ? #100;
? ? ? ? ? if (env.is_everything_done() == 1)
? ? ? ? ? ? break;
? ? ? ? end
? ? ? ? begin
? ? ? ? ? #50000;
? ? ? ? ? `uvm_fatal(get_name(),"wait for everything done time out")
? ? ? ? end
? ? ? join_any
? ? ? #0;
? ? ? disable fork;
? ? ? `uvm_info(get_name(),"Everything is done!!",UVM_LOW)
endtask:wait_everthing_done
到這里我們就會用到下面這個例子的宏定義,這個宏定義在后文可以找到
//////////////////////? your test case name 就是粗斜體? ////////////////////////////////////
`exp_test_run_begin(exp_handsome_007,exp_test_base)//宏定義方式的應用
? ? ? env.your_memory.preload_data("sram_init.txt");//舉個例子來實現(xiàn)
? ? ...
`exp_test_run_end//宏定義方式的應用
`endif
好了你要的在這,在另一個全局的定義變量的文件中定義上面使用到的宏定義,如下
`define exp_test_run_begin(T,B) \
? class ``T extends ``B; \
? `uvm_component_utils(``T) \
? function new(string name = `"``T`", uvm_component parent=null);\
? ? super.new(name,parent);\
? endfunction : new \
? virtual function void build_phase(uvm_phase phase);\
? ? super.build_phase(phase);\
? endfunction : build_phase \
? virtual task run_phase(uvm_phase phase);\
? ? ? phase.raise_objection(this);\
? ? ? begin
`define exp_test_run_end \
? ? ? end \
? ? ? wait_everthing_done(); \
? ? ? phase.drop_objection(this); \
? ? endtask:run_phase \
? endclass