作为一名芯片验证工程师,使用宏定义的方式会节省你的工作时间。当然这也不是唯一实现节省时间的方法,不管怎样,技多不压身,下面就怎么定义并使用给大家举个例子介绍下。
你的环境中好几个文件里面要用到一个task,但是这个task需要传不同的实参,这个时候你只要在你的环境的一个全局文件里面定义好,然后把这个全局文件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");//举个例子来实现
...
`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