一、SV
1. typedef enum 的使用方法?
2. $urandom_range(0,20)用法?取值包括0和20吗?
3.队列的用法?
4. logic 和bit 赋值上的区别?
在interface中logic直接用赋值不起作用, 换成bit后,能正常赋值。
5. const ref 用法?
6. 在什么情况下需要使用$cast()转换句柄?以及其用法详解?
7.阻塞赋值和非阻塞赋值?驱动数据时为啥要用非阻塞?
阻塞赋值:顺序执行,串行语句,组合逻辑
非阻塞赋值:并行执行, 并行语句,时序逻辑
驱动数据时为啥要用非阻塞: 防止竞争冒险。
8.fork ... join的三种用法?
9.功能覆盖率中,binsof用法及含义, ignore_bins, illegal_bins?
kind_port:cross kind,port{
hi=binsof(port)intersect{7};//任何kind值和port=7的交叉
md=binsof(port)intersect{0}&&binsof(kind)intersect{[9:11]};
//port=0和kind=9,10,11的交叉3个仓
lo=binsof(kind.lo);//kind中lo仓和port值的交叉, 3x8=24个仓
}
binsof和intersect分别制定的是cover point和值域 ,
对仓做操作用binsof,对值做操作用binsof()intersect{}。
10.在随机约束时,随机种子如何影响随机值?还是和约束写法有关?
11. 随机约束中,solve...before的用法?
rand bit a;
rand bit [1:0] b;
constraint c_ab {
a -> b == 3'h3;
solve a before b; //告诉求解器在尝试b之前必须先解出a,因此a的值决定了b的值
}
首先解决a,然后根据得到的值解决b。
12. 随机约束中,权重分布, 集合成员, 双向约束, soft local用法,条件约束, 约束函数?
权重分布: dist
集合成员: inside
soft软约束作用,当存在外部约束时,soft优先级更低。
local::data,当前文件的data.
约束函数: $urandom(); $urandom_range(100,200);
a -> b : a为真,b才会执行。
13. 在tb中,为啥要用logic代替wire和bit、reg, 有啥优点?
14. $cast()动态转换用法?
$cast(子类,父类):向下类型转换。
15. uvm和sv的回调函数?
16. 子类和父类的同名方法,仿真时跑哪个?
17.mailbox用法?
同名的mailbox可以收发消息。
18. public protected local的区别?
19. 内建函数$value$plusargs()
20. 在class中声明接口句柄时,virtual intf 为啥?
虚接口
21.sv的打印格式需要了解清楚.
22. include和import区别?
`include :包文件; `import: 包pkg.svh
23. 队列中pop_back() push_front();用法?
24. std::randomize()用法?
二、UVM
1.在class uvm_component 中,interface为啥要用virtual申明?有些成员方法在定义时要加virtual?
例如,在class uvm_driver中,virtual apb_if vif;
vitual protected task? vitual protected各自作用?
virtual task/function,virtual的作用?
2.uvm_phase中的函数定义中,为啥要用void关键词?
例如,function void build_phase(uvm_phase phase);
3. uvm_sequence中,`uvm_do_with()系列用法?
`uvm_do_with(seq,{constr});
`uvm_do_on_with(seq, sqr,{constr})。
4.各个uvm_phase的执行顺序?以及同一phase,在不同组件中的执行顺序?
run_phase: 自底向上 (先uvm_drive,agent , env, 再uvm_test);
build_phase: 自上而下(先uvm_base_test,再uvm_env)
先执行i_agt的build_phase,再去执行drv mon sqr, 执行完毕后再去执行scb的build_phase;
i_agt和scb是兄弟关系。先把i_agt一支树的build_phase执行完,再去执行scb的。
5. uvm_config_db::set/get()用法?以及各参数的含义?
A: uvm_config_db#(int)::set(this, "env.i_agt.drv", "pre_num", 100);
其中,第一个和第二个参数联合起来组成目标路径,与此路径符合的目标才能收信。
第一个参数必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。第三个参数表示这个值是传给目标中的哪个成员变量的,第四个参数是要设置的值。
tips:set函数时其第一个参数应该尽量使用this,在无法得到this指针的情况下(如在top_tb中),使用null或uvm_root::get()。
uvm_config_db#(int)::get(this, "", "pre_num", pre_num);
其中,第一个和第二个参数联合起来组成目标路径。
第一个参数也必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。一般的,如果第一个参数设置为this,那么第二个参数可以是一个空的字符串。第三个参数就是set函数中的第三个参数,这两个参数必须严格匹配,第四个参数则是要设置的成员变量。
6.new()和build_phase()的执行先后顺序是?
7.uvm_driver, uvm_monitor, uvm_sequencer定义时,为啥要加#(apb_transfer)?
8.extern function/task xxx() ;function/task class_name::xxx();extern表示什么含义?
9.uvm_adapter的具体作用?俩个函数的各自功能?
10. predictor.bus_in,收到monitor发送的数据后,会怎么样处理数据?predictor的功能是什么?
11.uvm_analysis端口用法?
12. uvm_event的用法?
13.sequence中的cfg是怎么收到的,`uvm_declare_p_sequencer(virtual_sequencer)用法?
14.rgm中,reg.mirror(status)用法?
rm.reg.mirror(status): 读取DUT中寄存器的值并将它们更新到寄存器模型中;
rm.reg.update(status): 将寄存器模型中的值更新到DUT中。
15. uvm_config_db中set()和get()用法及四个参数的含义?
A: uvm_config_db#(int)::set(this, "env.i_agt.drv", "pre_num", 100);
其中,第一个和第二个参数联合起来组成目标路径,与此路径符合的目标才能收信。
第一个参数必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。第三个参数表示这个值是传给目标中的哪个成员变量的,第四个参数是要设置的值。
tips:set函数时其第一个参数应该尽量使用this,在无法得到this指针的情况下(如在top_tb中),使用null或uvm_root::get()。
uvm_config_db#(int)::get(this, "", "pre_num", pre_num);
其中,第一个和第二个参数联合起来组成目标路径。
第一个参数也必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。一般的,如果第一个参数设置为this,那么第二个参数可以是一个空的字符串。第三个参数就是set函数中的第三个参数,这两个参数必须严格匹配,第四个参数则是要设置的成员变量。
16. factory override的用法?
重载transaction
set_type_override_by_type(my_transaction::get_type(), crc_err_tr::get_type());
重载sequence
set_type_override_by_type(normal_sequence::get_type(), abnormal_sequence::get_type());
17.uvm_field_automation UVM_ALL_ON UVM_DEFAULT有啥区别?
18. 在run_phase中,数据类型的声明要放在phase.raise_objection()前面。
19. env中,rgm.map.set_sequencer(sqr, adapter);实现前门访问。
A:
20. phase.phase_done.set_drain_time()用法?
A: 可以通过设置objection的drain_time属性,用来定义在phase结束后延时大小,保证DUT的输出完毕后再停止UVM验证平台。
一个phase对应一个drain_time,并不是所有的phase共享一个drain_time。在没有设置的情况下,drain_time的默认值为0。
21.set_type_override_by_trans(trans, bad_trans);
A: set_type_override_by_type:属于uvm_factory中的函数,component类和object类都能用。
第一个参数是被重载的类型,第二个参数是重载的类型,需要使用 xx::get_type() 获取类型。
22.`uvm_do_with具体执行了哪些操作,`uvm_do_on_with ?
A: 具体执行了start_item(), randomise(), finish_item()等操作。
`uvm_do_with(seq,{constr});
`uvm_do_on_with(seq, sqr,{constr})。
23. seq与sqr是如何连接的?
A: seq调用start函数,将seq挂载到sqr上时,就实现了连接。
24.callback的使用方法?
25 寄存器模型, 自动预测与显示预测的区别?
三、提高效率的用法
1. 如何操作一次性替换多个文件的同个信号名?