sv队列和动态数组的区别_面经收集二(SV语言基础)

一、wait和@的区别?

答:wait和@主要是用来解决冒险问题的,其中@算是边沿触发,wait算是电平触发。例如在1ns时触发事件A,而进程2在1ns时等用@等待事件A,那么可能由于竞争问题(delta-cycle)而等不到,而用wait(A.triggered())则可以等到。

二、time_slot时钟片概念和分类。解释modport,解释interface,对比它们。如何传递iterface,什么是resource_db。

答:time_slot相当于是在时钟边沿上,仿真器按照一定的调度顺序对一系列仿真事件进行了安排,大概分为preponed、active、observed、re-active、postponed。对应时钟片入口、module执行时间、断言执行时间、program执行时间、时钟片退出。

modport可以定义不同信号接入接口的方式(input、output、inout、ref),所以它定义在接口里面;

interface是将多组信号合成一起由一个端口表示,简化模块之间的连接,实现类与模块之间的通信。

传递interface的方法普遍用uvm_config_db#(intf)进行传递,一般在最顶层run_test之前进行传递。在sv里面,也有编写函数进行接口的层层传递,但这种传递方式不利于组件之间的独立性。

uvm_config_db继承于uvm_resource_db。uvm_resource_db也是一种配置手段,但是它是按照队列的方式,如果是同优先级的话,先配置的有效,这样后期要实现覆盖的功能的时候,这样就不太方便。

三、比较函数和任务中automatic和static的区别?比较TLM端口和mailbox的区别。

答:automatic是把函数或任务中的变量声明为动态,这样在任务执行完之后,变量就进行销毁,即用即扔;而声明为static,则为静态,生命周期贯穿整个仿真,且全局只有唯一一个该静态变量。

TLM端口可以自己实现put和get方法,比较灵活;其次,TLM端口用于组件之间的通信,无需通过句柄层层传递,降低了组件之间的耦合性,使得验证环境更加独立。

四、virtual虚函数的作用,加了virtual调用有什么区别,没加如何调用?

答:虚函数是sv类中多态性的变现,即可以通过指针指向的对象通过动态查找来决定调用哪个函数,加了之后可以使得父类句柄在指向子类对象的时候可以调用子类方法,没加只能声明子类句柄来调用。

五、wait fork,disable fork,fork join_any是什么意思。

答:wait fork是等待所有fork线程执行完毕再退出。disable fork是关闭该线程,fork join_any是指完成该线程中耗时最小的操作后就退出。

六、copy和clone的区别。

答:copy是默认已经创建好了对象,然后进行数据的拷贝。clone则会新创建一个对象,再进行数据的拷贝。

七、reg、wire、logic区别。

答:verilog作为硬件描述语言,因此有针对硬件的reg类型和线网类型。reg是数据存储单元的抽象表示,wire类型模拟物理连线,本身不存储值,由驱动单元的值决定。logic作为sv中侧重验证的存在,是一种数据类型,可以算是一种变量。在单驱动时,logic可以代替wire,但是多驱动时例如inout,必须要用wire。

八、阻塞赋值和非阻塞赋值,映射什么电路?

答:阻塞赋值是用“=”号来进行赋值,表示在当前时刻后面的赋值是在前面的赋值结束之后才开始的。非阻塞赋值是在赋值时刻,先计算右边的表达式的值,在周期结束后统一赋值。

九、Sv与verilog相比的优点?

答:提供了logic数据类型,避免小白出错。提供了interface,使得硬件和验证环境的连接更加简便。提供了面向对象编程的类,同时类的三要素使得在构建验证环境时候更加简便。提供了多个数据类型,在构建软件验证环境时能更多地做好随机化。

十、Sv的interface是做什么的?

答:interface是将多组信号合成一起由一个端口表示,简化模块之间的连接,实现类与模块之间的通信。

十一、为什么需要clocking。

利用clocking进行采样是为了避免信号竞争问题,它可以定义数据延迟或者提前进行采样,保证数据不受delta_cycle带来的竞争问题影响,使得采样数据更加稳定。

十二、Clocking中的默认延时?

答:后期试一下。

十三、动态数组和关联数组的区别?

答:动态数组所占的空间在开始写入数据之前就被固定下来了,对于一些超大容量的数组来说,是一种浪费。关联数组可以用来保存稀疏矩阵,当对一个大空间寻址的时候,只为写入的数据分配空间,类似于python的字典。

十四、Sv断言有哪些?

答:分为立即断言和并发断言。立即断言相当于一个if else语句,立即返回值,断言失败默认调用$error。

并发断言可以认为是一个连续运行的模块,为整个仿真过程检查信号,所以需要在并发断言内指定一个采样时钟。并发断言只有在时钟沿才会执行;可以在过程块、module、interface和program块内定义并发断言。(后期继续补充)

十五、怎么知道测试功能点是否全面?

答:目前大多都是看功能覆盖率和代码覆盖率,一般要求在代码覆盖率达到100%,功能覆盖率到95%以上。

十六、代码覆盖率包括?和功能覆盖率得关系?

答:代码覆盖率包括:行覆盖率:检查某行代码是否被执行、条件覆盖率:检查条件判断是否被执行、翻转覆盖率:检查某值0到1、1到0是否被执行、状态机覆盖率:检查某个状态状态跳转是否被执行、分支覆盖率:检查某个分支是否被执行。功能覆盖率是在checker不报错的情况下,将所定义的功能点都仿真一遍,仿真到多少功能点越多越好。代码覆盖率一般要达到100%,是功能覆盖率的前提。

十七、Mailbox用法,写一个fifo?

答:mailbox本身就是一个原生的轻量级fifo,有get()方法,put()方法。

mailbox #(trans) res;tans a;res=new();res.get(a);res.put(a);

十八、sv中event的用法?

答:sv中事件、旗语、信箱都可以做进程间的通信,其中事件可以做单一的通知功能,比如触发事件A,另一线程等待到了事件A,就继续接下来的操作。也可以做线程之间的同步。

十九、sv中queue和array的区别,如何删除queue?

答:数组和队列的区别在于,数组的长度一旦确定就不可更改,但是队列不一样,队列的初始长度是0,可以用插入,pop,push等方法向里面塞入数据。调用delete方法删除。

二十、slove before的作用?

slove a before b;#先随机a,再随机b;#参考这个“https://blog.csdn.net/weixin_46022434/article/details/107757344”#例如

f025d9095ebcdfb4045d546afa0c51f1.png

这是没加solve before

加了solve before的话,先随机a,a为1的概率为1/2,为0的概率为1/2,为0之中再随机data,分别为1,2,3,所以概率改变了。

其中:

randc类型变量不被允许使用solve…before约束。

二十一、illegal bin触发会怎样?

答:报错、仿真停止。

二十二、随机一个序列100000次,每次不重复。

答:每次给予一个不同的随机种子?

二十三、Rand data0~a?

class trans;  int a;  rand int b;  constraint cr {a inside {[0:b]};}endclass

二十四、Rand bit data[100],约束随意一位是0,剩下的为1。

foreach(a[i]) a[i] dist {0:=1,1:=99};//只想出这个。。。。要是int就好了
  • 11
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值