1.bind的用法
bind module_name1 module_name2 inst_name();
module_name1:被bind的module
module_name2:發起bind的module
應用場景:module_name2中做assertion,去bind rtl內部module;module_name2是interface
2.格式化字符串
$psprintf("se%0d",idx);
$sformatf("se%0d",idx);
$sformat(str_name,"se%0d",idx); //格式化字符串到str_name
void'($sscanf(str,"xx%3sxx",str_extract)); //例如str是"xxabcxx",則可以提取出字符串"abc"到str_extract
UVM_FILE/$fopen/$fdisplay
3.uvm常用api
get_name() //調用改函數的component的實例化時索引名字
get_full_name() //調用改函數的component在uvm tree中的全路徑索引
uvm_is_match("*str*", cmp_name);//例如cmp_name是"xxstrxx"則可以匹配
uvm_hdl_read("top.dut.reg",value); //后門讀取rtl信號
uvm_hdl_deposit("top.dut.reg",value); //后門賦值rtl信號
uvm_hdl_force("top.dut.reg",value); //后門force rtl信號
4.define用法
`define EXAMPLE(Str, Sig)\
Str.clk = Sig``_clk;
`EXAMPLE(a,b) <=> a.clk =b_clk;
5.$cast用法
- 父類句柄中是子類對象,可將其用cast傳給子類句柄
- 類型轉換,例如int轉換成enum
6.randomize用法
assert(std::randomize(val1,val2) with {constrain});
7.命令行傳參
$value$plusargs("name=%d", na)
運行時加option "+name=1", na值為1
8.transaction api
tr.set_initiator(this); //可以把所處的class句柄傳給transaction,在transaction中用get_initiator()獲得
tr.sprint(); //打印所有field
tr.convert2string(); //所有field轉為str
function void do_print(uvm_printer printer);
9.sv用法
8'(val) //將val轉為8位位寬
10.uvm sequence
seq.set_parent(this) //layer sequence中設置parent sequence
seq.start(sqr,this) //在sequence中start另一個sequence要加this
uvm_sequence_state_enum seq_state = get_sequence_state(); //查看sequence所處階段,例如UVM_BODY
wait_for_sequence_state(UVM_STOPPED|UVM_FINISHED); //wait sequence到某個階段
11.uvm sequence
uvm sequence中對transaction進行約束時變量名最好不要和transaction中變量名一樣,否則compiler會優先從transaction中尋找這個變量。如果一定要一樣,可以在這個同名變量前加local::