没有合适的资源?快使用搜索试试~ 我知道了~
IC验证面试常问题88道.pdf
需积分: 50 14 下载量 23 浏览量
2022-10-07
20:38:46
上传
评论
收藏 1.07MB PDF 举报
温馨提示
试读
34页
IC验证面试常问题88道.pdf
资源推荐
资源详情
资源评论
IC 验证面试常问题 88 道
Q1. 定宽数组、动态数组、关联数组、队列各自特点和使用
队列:队列结合了链表和数组的优点,可以在一个队列的任何位置进
行增加或者删除元素;
定宽数组:属于静态数组,编译时便已经确定大小。其可以分为压缩
定宽数组和非压缩定宽数组:压缩数组是定义在类型后面,名字前面;非压缩
数组定义在名字后面。Bit [7:0][3:0] name; bit[7:0] name [3:0];
动态数组:其内存空间在运行时才能够确定,使用前需要用 new[]进行
空间分配。
关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时
候使用,类似于 hash,通过一个索引值和一个数据组成,索引值必须是唯一
的。
Q2.多线程 fork join/fork join_any/fork join_none 的用法差异
Fork join:内部 begin end 块并行运行,直到所有线程运行完毕才会
进入下一个阶段。
Fork join_any:内部 begin end 块并行运行,任意一个 begin end 块
运行结束就可以进入下一个阶段。
Fork join_none:内部 begin end 块并行运行,无需等待可以直接进入
下一个阶段。
wait fork:会引起调用进程阻塞,直到它的所有子进程结束,一般
用来确保所有子进程(调用进程产生的进程,也即一级子进程)执行都已
经结束。
disable fork:用来终止调用进程 的所有活跃进程, 以及进程的所
有子进程。
Q3. 多线程的同步调度方法
多线程之间同步主要由
mailbox、event、 semaphore
三种进行一个通信交互。
mailbox 邮箱:
主要用于两个线程之间的数据通信,通过
put
函数和
get
函数还有
peek
函数进行数据的发送和获取。
Event:
事件主要用于两个线程之间的一个同步运行,通过事件触发和
事件等待进行两个线程间的运行同步。使用
@(event)
或者
wait(event.trigger)
进行等待,
->
进行触发。
Semaphore:
旗语主要是用于对资源访问的一个交互,通过
key
的获取
和返回实现一个线程对资源的一个访问。使用
put
和
get
函数获取返回
key
。
一次可以多个。
Q4. Task
和
function
的区别
函数能调用另一个函数,但不能调用任务,任务能调用另一个任务,
也能调用另一个函数
函数总是在仿真时刻
0
就开始执行,任务可以在非零时刻执行
函数一定不能包含任何延迟、事件或者时序控制声明语句,任务可以
包含延迟、事件或者时序控制声明语句
函数至少有一个输入变量,可以有多个输入变量,任务可以没有或者
多个输入
(input)
、输出
(output)
和双向
(inout)
变量
函数只能返回一个值,函数不能有输出
(output)
或者双向
(inout)
变量,
任务不返回任何值,任务可以通过输出
(output)
或者双向
(inout)
变量传递多
个值
Q5.
简述在
TB
中使用
interface
和
clocking blocking
的好处
Interface
是一组接口,用于对信号进行一个封装,捆扎起来。如果
像
verilog
中对各个信号进行连接,每一层我们都需要对接口信号进行定义,
若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用
interface
接口进行连接,不仅可以简化代码,而且提高可重用性,除此之
外,
interface
内部提供了其他一些功能,用于测试平台与
DUT
之间的同步
和避免竞争。
Clocking block:
在
interface
内部我们可以定义
clocking
块,可以
使得信号保持同步
,
对于接口的采样
vrbg
和驱动有详细的设置操作,从而避
免
TB
与
DUT
的接口竞争,减少我们由于信号竞争导致的错误。采样提前,
驱动落后,保证信号不会出现竞争。
Q6. OPP(面向对象)的特性?
封装、继承和多态
封装
:
通过将一些数据和使用这些数据的方法封装在一个集合
(class)
里,成为一个类。
继承
:
允许通过现有类去得到一个新的类,且其可以共享现有类的属
性和方法。现有类叫做基类,新类叫做派生类或扩展类。
多态
:
得到扩展类后,有时我们会使用基类句柄去调用扩展类对象,
这时候调用的方法如何准确去判断是想要调用的方法呢
?
通过对类中方法进
行
virtual
声明,这样当调用基类句柄指向扩展类时,方法会根据对象去识
别,调用扩展类的方法,而不是基类中的。而基类和扩展类中方法有着同
样的名字,但能够准确调用,叫做多态。
Q7.
简述
UVM
的工厂机制
Factory
机制也叫工厂机制,其存在的意义就是为了能够方便的替换
TB
中的实例或者已注册的类型。一般而言,在搭建完
TB
后,我们如果需
要对
TB
进行更改配置或者相关的类信息,我们可以通过使用
factory
机制
进行覆盖,达到替换的效果,从而大大提高
TB
的可重用性和灵活性。
要使用
factory
机制先要进行:
1. 将类注册到
factory
表中
2. 创建对象,使用对应的语句 (
type_id::create
)
3. 编写相应的类对基类进行覆盖。
Q8. SV
中的
interface
的
clock blocking
的功能
Interface
是一组接口,用于对信号进行一个封装,捆扎起来。如果
像
verilog
中对各个信号进行连接,每一层我们都需要对接口信号进行定义,
若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用
interface
接口进行连接,不仅可以简化代码,而且提高可重用性,除此之
外,
interface
内部提供了其他一些功能,用于测试平台与
DUT
之间的同步
和避免竞争。
Clocking block:
在
interface
内部我们可以定义
clocking
块,可以
使得信号保持同步
,
对于接口的采样和驱动有详细的设置操作,从而避免
TB
与
DUT
的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落
后,保证信号不会出现竞争。
Q9. 动态数组和联合数组的区别?
动态数组:其内存空间在运行时才能够确定,使用前需要用 new[]进行
空间分配。
关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时
候使用,类似于 hash,通过一个索引值和一个数据组成: bit [63:0]
name[bit[63:0]];索引值必须是唯一的。
1. 【关联数组】可以用来保存稀疏矩阵的元素。当你对一个非常大的地
址空间寻址时,该数组只为实际写入的元素分配空间,这种实现方法所需
要的空间要小得多。
2. 此外,关联数组有其它灵活的应用,在其它软件语言也有类似的数据
存储结构,被称为哈希(Hash)或者词典(Dictionary),可以灵活赋予键值(key)
和数值(value) 。
Q10. 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
机制,
按照顺序
:
1.
build-phase
(自顶向下构建
UVM
树)
2.
connet_phase(
自底向上连接各个组件
)
3. end_of_elaboration_phase
4. start_of_simulation_phase
5.
run_phase() objection
机制仿真挂起,通过
start
启动
sequence
(每
个
sequence
都有一个
body
任务。当一个
sequence
启动后,会自动执行
sequence
的
body
任务)
,
等到
sequence
发送完毕则关闭
objection
,结束
run_phase()
(
UVM_objection
提供
component
和
sequence
共享的计数器,
当所有参与到
objection
机制中的组件都
drop objection
时,计数器
counter
才会清零,才满足
run_phase()
退出的条件)
6. 执行后面的
phase
Q11.
接口怎么传递到验证环境中(
uvm_config_db
)
传递
virtual interface
到环境中;
配置单一变量值,例如
int
、
string
、
enum
等;
传递配置对象(
config_object
)到环境;
1. 传递
virtual interface
到环境中;
a) 虽然 SV 可以通过层次化的 interface 的索引完成传递,但是这种传递方
式不利于软件环境的封装和复用。通过使用 uvm_config_db 配置机制来传递
接口,可以将接口的传递与获取彻底分离开。
b) 接口传递从硬件世界到 UVM 环境可以通过 uvm_config_db 来实现,在实
现过程中应当注意:
c)
接口传递应发生在
run_test()
之前。这保证了在进入
build_phase
之前,
virtual interface 已经被传递到 uvm_config_db 中。
d) 用户应当把 interface 与 virtual interface 区分开来,在传递过程中的类
型应当为
virtual interface
,即实际接口的句柄。
1. 配置单一变量值,例如
int
、
string
、
enum
等;在各个
test
中,可以
在
build_phase
阶段对底层组件的各个变量加以配置,进而在环境例化之前
完成配置,使得环境可以按照预期运行。
2. 传递配置对象(
config_object
)到环境;
在
test
配置中,需要配置的参数不只是数量多,可能还分属于不同的
组件。对这么多层次的变量做出类似上边的单一变量传递,需要更多的代
码,容易出错且不易复用。
如果整合各个组件中的变量,将其放置在一个
uvm_object
中,再对
中心化的配置对象进行传递,将有利于整体环境的修改维护,提升代码的
复用性。
Q12. UVM
的优势,为什么要用
UVM
UVM 其实就是 SV 的一个封装,将我们在搭建测试平台过程中的一些重复性
和重要的工作进行封装,从而使我们能够快速的搭建一个需要的测试平台,
并且可重用性还高。但是
UVM
又不仅仅是封装。
Q13.
说一下
ref
类型,你用到过嘛
ref 参数类型是引用
1. 向子程序传递数组时应尽量使用 ref 获取最佳性能,如果不希望子程
序改变数组的值,可以使用 const ref 类型
2. 在任务里可以修改变量而且修改结果对调用它的函数随时可见。
剩余33页未读,继续阅读
资源评论
只想当老六
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功