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