在芯片驗證環(huán)境使用宏定義方式舉例講解

作為一名芯片驗證工程師,使用宏定義的方式會節(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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容