SV & UVM 知识点疑问及回答

本文详细探讨了SV编程中的typedefenum、队列、逻辑赋值、UVM组件接口、虚拟方法、uvm_phase顺序、配置数据库操作等关键概念,以及如何在UVM中提高效率和处理并发。
摘要由CSDN通过智能技术生成

一、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. 如何操作一次性替换多个文件的同个信号名?

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值