sv/uvm的一些tips


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::

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM