数字验证每日十问--(1)

  1. 定宽数组、动态数组、关联数组、队列各自特点和使用?

a.定宽数组:属于静态数组,编译时便已经确定大小。其可以分为合并定宽数组和非合并定宽数组;声明合并数组的时候,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定;用一个单引号和大括号来初始化数组`{};

b.动态数组:其内存空间在运行时才能够确定,使用前需要用new[]进行空间分配,同时在方括号中传递数组宽度;

c.队列:队列结合了链表和数组的优点,可以在一个队列的任何位置进行增加或者删除元素,对队列赋值只有大括号,没有单引号;队列是连续储存的

d.关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时候使用,类似于hash,通过一个索引值和一个数据组成,索引值必须是唯一的。关联数组采用在方括号中放置数据类型的形式来进行声明;

2. 多线程fork join/fork join_any/fork join_none的用法差异?

a.Fork join:内部 begin end块并行运行,直到所有线程运行完毕才会进入下一个阶段。

b.Fork join_any:内部 begin end块并行运行,任意一个begin end块运行结束就可以进入下一个阶段。

c.Fork join_none:内部 begin end块并行运行,无需等待可以直接进入下一个阶段。

d.wait fork:会引起调用进程阻塞,直到它的所有子进程结束,一般用来确保所有子进程(调用进程产生的进程,也即一级子进程)执行都已经结束。

e.disable fork:用来终止调用进程的所有活跃进程, 以及进程的所有子进程。

3.多线程的同步调度方法?

a.mailbox邮箱:主要用于两个线程之间的数据通信,通过put函数和 get 函数还有peek函数进行数据的发送和获取。

b.Event:事件主要用于两个线程之间的一个同步运行,通过事件触发和事件等待进行两个线程间的运行同步。使用@(event)或者 wait(event.trigger)进行等待,->进行触发。

c.Semaphore:旗语主要是用于对资源访问的一个交互,通过key的获取和返回实现一个线程对资源的一个访问。使用put和 get函数获取返回key。一次可以多个。

4. Task和function的区别?

a.函数能调用另一个函数,但不能调用任务,任务能调用另一个任务,也能调用另一个函数

b.函数总是在仿真时刻0就开始执行,任务可以在非零时刻执行

c.函数一定不能包含任何延迟、事件或者时序控制声明语句,任务可以包含延迟、事件或者时序控制声明语句

d.函数至少有一个输入变量,可以有多个输入变量,任务可以没有或者多个输入(input)、输出(output)和双向(inout)变量

e.函数只能返回一个值,函数不能有输出(output)或者双向(inout)变量,任务不返回任何值,任务可以通过输出(output)或者双向(inout)变量传递多个值

5. 简述在TB中使用interface和clocking blocking的好处

a. interface接口是一组信号的集合,用于对信号进行一个封装,可以用于组件之间的通信。接口可以包含信号、方法和时序约束。因此使用interface接口进行连接,不仅可以简化代码,而且提高可重用性。

b.clocking block时钟块可以使得信号保持同步, clocking block 允许定义时序约束,如 setup 和 hold 时间,这些约束确保信号在采样点之前和之后保持稳定,从而避免了由于信号变化时机不当引起的竞争。避免TB与 DUT的接口竞争,减少我们由于信号竞争导致的错误。(input 采样提前 output驱动延后)

c. modport 是接口的一部分,用于为不同的验证组件(如产生器、消费者或监视器)提供定制的信号视图。通过modport,可以定义哪些信号是可读的、可写的或双向的

6. OPP(面向对象)的特性?

a.封装(Encapsulation):封装是指将数据和操作数据的方法捆绑在一起的机制。类通过封装将数据和操作数据的方法组合成一个单一的单元,从而隐藏了数据的内部细节,只暴露出必要的接口供外部使用。这样可以提高代码的可维护性和安全性。

b.继承(Inheritance):继承是指一个类可以派生出子类,子类可以继承父类的属性和方法,并且可以添加新的属性和方法或者修改父类的方法。继承提供了代码重用的机制,可以减少重复编码,提高代码的可维护性和扩展性。

c.多态(Polymorphism):多态是指在不同的上下文中,同一个方法可以有不同的行为。通过多态,可以编写出通用的代码,可以处理多种不同类型的对象,而无需对每种类型都编写特定的代码。多态通过方法的重载和方法的覆盖来实现,提高了代码的灵活性和可扩展性。通过对类中方法进行virtual声明,这样当调用基类句柄指向扩展类时,方法会根据对象去识别,调用扩展类的方法,而不是基类中的。

7. 简述UVM的工厂机制?

Factory机制也叫工厂机制,其存在的意义就是为了能够方便的替换TB中的实例或者已注册的类型。一般而言,在搭建完TB后,我们如果需要对TB进行更改配置或者相关的类信息,我们可以通过使用factory机制进行覆盖,达到替换的效果,从而大大提高TB的可重用性和灵活性。

要使用factory机制先要进行:

a.将类注册到factory表中

b.创建对象,使用对应的语句 (type_id::create)

c.编写相应的类对基类进行覆盖。

8. UVM从哪里启动,接口怎么传递到环境中?

UVM的启动总结:在导入uvm_pkg文件时,会自动创建UVM_root所例化的对象UVM_top,UVM顶层的类会提供run_test()方法充当UVM世界的核心角色,通过UVM_top调用run_test()方法;在环境中输入run_test来启动UVM验证平台,run_test语句会创建一个my_case0的实例,得到正确的test_name;

依次执行uvm_test容器中的各个component组件中的phase机制,按照顺序:

build-phase(自顶向下构建UVM 树

connet_phase(自低向上连接各个组件)

end_of_elaboration_phase

start_of_simulation_phase

run_phase:objection机制仿真挂起,通过start启动sequence(每个sequence都有一个body任务。当一个sequence启动后,会自动执行sequence的body任务),等到sequence发送完毕则关闭objection,结束run_phase()(UVM_objection提供component和sequence共享的计数器,当所有参与到objection机制中的组件都落下objection时,计数器counter才会清零,才满足run_phase()退出的条件

执行后面的phase

9. 介绍ref类型

Ref参数类型是引用

a.向子程序传递数组时应尽量使用ref获取最佳性能,如果不希望子程序改变数组的值,可以使用const ref类型

b.在任务里可以修改变量而且修改结果对调用它的函数随时可见。

10. UVM的优势,为什么要用UVM?

   UVM其实就是SV的一个封装,将我们在搭建测试平台过程中的一些重复性和重要的工作进行封装,从而使我们能够快速的搭建一个需要的测试平台,并且可重用性还高。

      那么相对SV,UVM 为什么提高了复用性? 总结为以下几点:

a. 各个模块的验证环境是独立封装的,对外不需要保留数据端口,因此便于环境的进一步集成复用。

每个模块单元都具有自闭性,自闭性是指单元组件(如uvm_agent 或者uvm_env)自身可以成为独立行为、不依赖于其他并行的组件。单元自闭性为日后的组件复用提供了良好的基础。各个子环境可以独立集成于顶层环境,互相也不需要额外的通信连接,各自划分“小世界”。

b. 由于UVM自身的phase机制,在顶层协调各个子环境时,无需考虑由于子环境之间的例化顺序而导致对象句柄引用悬空的问题

上一级的组件在例化自身之后,会执行各个phase阶段,通过build_phase可以进一步创建子组件,而这些子组件也通过一样的过程去创建下一级组件。回归创建的实现依赖于自顶向下执行的 build_phase 。通过build_phase这种结构化创建,可以保证父组件必先于子组件创建,而创建过程包括以下步骤:

      (1)在定义成员变量时赋予默认值,或者在new( ) 函数中赋予初值

      (2)结构配置变量用来决定组件的条件生成,如agent依靠is active 判断是否需要例化sequencer和driver

     (3)模式配置变量用来决定各个子组件的工作模式

     (4)子组件按照自顶向下、从前到后的顺序依次生成

c. 在完成整个环境创建以后,各个组件会通过通信端口的连接进行数据通信(TLM通信)

d. UVM提供config_db配置方式,使得整体环境的结构和运行模式都可以从树状的config中获取,这也使得顶层环境可以在不同uvm_test 进行集中管理。

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值