SV面试常问知识点总结

1. 多线程同步的方法

多线程之间同步主要由mailbox、event、semaphore三种进行一个通信交互。
mailbox邮箱:主要用于两个线程之间的数据通信,通过put函数和 get 函数还有peek函数进行数据的发送和获取。
Event:事件主要用于两个线程之间的一个同步运行,通过事件触发和事件等待进行两个线程间的运行同步。使用@(event)或者 wait(event.trigger)进行等待,->进行触发。
tips1:@和wait的区别:

@会阻塞一个进程,直到@的事件被触发(->)后,该进程才会unblock。如果事件触发(->event)在@event先执行,则@event的进程会一直被阻塞住。如果->event和@event发生在同一个time step,就会造成竞争冒险,因为无法确认他们哪一个先执行。
event的triggered属性的持续时间是一个time step,因此它解决了触发事件和等待事件在同一个time step时的竞争冒险问题。只要wait(event.triggered)在 ->event之前执行,或者在同一个time step执行,都能正确地等到事件

tips2:sv事件和uvm事件的区别:

SV中event是单纯一个类型(声明了就可以用),而UVM的uvm_event是一个类(需要相应的创建或拿到句柄)
event被->触发之后,会触发使用@等待该事件的对象;uvm_event通过trigger()来触发,会触发使用wait_trigger()等待的对象。如果要再次等待事件触发,event只需要再次用->来触发,而uvm_event需要先通过reset()方法重置初始状态,再使用trigger()来触发
sv中的event不可以响应那种等待前就触发的事件,uvm_event可以利用wait_ptrigger()/wait_ptrigger_data来完成等待,这样不会因为事件在等待前触发而被阻塞。

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

2. 多线程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:用来终止调用进程 的所有活跃进程, 以及进程的所有子进程。
经典面试题:现在有定义好的三个子线程do1,do2,do3,在task中并行运行这三个子线程,其中只要有任何一个线程结束,都退出并行运行块,并打印DONE。要求分别用fork-join、fork-join_any,fork-join_none来实现。

3. Task和function的比较

函数能调用另一个函数,但不能调用任务,任务能调用另一个任务,也能调用另一个函数
函数总是在仿真时刻0就开始执行,任务可以在非零时刻执行
函数一定不能包含任何延迟、事件或者时序控制声明语句,任务可以包含延迟、事件或者时序控制声明语句
输入输出:
函数至少有一个输入变量,可以有多个输入变量,任务可以没有或者多个输入(input)、输出(output)和双向(inout)变量
函数只能返回一个值,函数不能有输出(output)或者双向(inout)变量,任务不返回任何值,任务可以通过输出(output)或者双向(inout)变量传递多个值

4. 在TB中使用interface和clocking blocking的好处

Interface:是一组接口,用于对信号进行一个封装,捆扎起来。如果像 verilog中对各个信号进行连接,每一层我们都需要对接口信号进行定义,若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用interface接口进行连接,不仅可以简化代码,而且提高可重用性,除此之外,interface内部提供了其他一些功能,用于测试平台与DUT之间的同步和避免竞争。
Virtual interface:引入interface可以简化模块儿之间的连接,即interface是连接硬件的,其是硬件语言;但对于验证来说,其描述语言往往是软件语言,interface无法在基于OOP的测试平台中实例化,因此我们无法通过interface把激励传送到DUT中;为了解决这个问题,引入了virtual interface,使得基于OOP的验证环境可以通过虚接口把激励传送给DUT。
tips:

①、interface只能在module中声明,在class中要用virtual interface;
②、virtual interface是在仿真运行时才连接到DUT上,如果只是interface,在编译时就必须进行连接。virtual interface在class中是automatic,在运行的时候产生;
③、virtual interface主要完成接口的动态分配,只要在top层定义virtual interface,其他层不需要改变,直接通过interface传递参数即可;
④、可以消除绝对路径,避免修改的时候改很多东西

Clocking block:在interface内部我们可以定义clocking块,可以使得信号保持同步,对于接口的采样vrbg和驱动有详细的设置操作,从而避免TB与 DUT的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不会出现竞争。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值