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