转行上岸年薪40W+学长整理:IC面试之verilog(上)
1、同步复位和异步复位的区别,体现在verilog代码中是什么样子
如图所示
2、 变量类型、四值逻辑和二值逻辑区别及使用
①二值逻辑只可以表示0和1;四值逻辑可表示0、1、x和z;
②二值逻辑仿真工具开辟的存储空间更小且其行为更接近真实的电路;使用四值逻辑是因为实际过程中会出现错误,如volition等从而出现x和z态来提示出错;
③二值逻辑的默认值是0;四值逻辑的默认值为x。
3、 Wire、reg 和 logic有什么区别
①总结Verilog wire和reg的区别:
wire表示导线结构,reg表示存储结构。
wire使用assign赋值,reg赋值定义在always、initial、task或function代码块中。
wire赋值综合成组合逻辑,reg可能综合成时序逻辑,也可能综合成组合逻辑。
②总结SystemVerilog logic的使用方法:
单驱动时logic可完全替代reg和wire,除了Evan提到的赋初值问题。
多驱动时,如inout类型端口,使用wire。
4、 使用权重时,:= 和 :/ 区别
:=表示值范围内的每一个值的权重是相同的;:/表示权重均分到值范围内的每一个值。如src dist {[1:3]:=60};1,2,3的权重都是60,概率均为60/180; dst dist {[1:3]:/60};1,2,3权重均分60,为20,概率为20/60.
5、 随机时,如果想把constraint里的某个数据不让它随机,使用什么方法
①如果只有少数几个变量需要修改,可以调用rand-mode();函数把这些变量设置为非随机数;如p.length.rand_mode(0);p.length=42。
②p.constraint_mode(0);关闭随机约束块;(0);关闭,(1);打开
6、 array中,pack和unpack的区别
①非合并数组:如 bit [7:0] arry1[3];
存储方式:按[7:0] 8位存放,32位中没使用也会继续开辟新空间
②合并数据:如bit [3:0] [7:0] arry2;
存储方式:紧凑连续存放,32位不存放完不会开辟新空间
7、 oop的主要特点
8、有两个变量rand A, rand B, 怎么控制b先随机
可以加入把B加入到fork join中。如:
initial begin
transaction t;
t=new();
fork
t.randomize(B);
join
t.randomize(A);
end
9、covergroup在哪里定义,哪里例化,有哪些,分别怎么做采样,根据什么来写
10、状态机分类;
11、setup time, hold time,
①Setup/holdtime是芯片对输入信号和时钟信号之间的时间要求。Setup time是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。
②hold time是指触发器的时钟信号上升沿到来以后, 数据稳定不变的时间。如果holdtime不够,数据同样不能被打入触发器
12、sv中队列的方法是什么(push, pop insert之类的), 说一下队列、动态数组、关联数组怎么用
①队列;可以在一个队列的任何位置进行增加或者删除元素;声明q[$]包含方法有q.insert(i,j)—在固定位置i插入数j;q.push_front(bask)—前(后)插入;j=q.pop_back(front)—从后(前)取出给j
②动态数组:new[]来制定位宽;如
int dyn[];
initial begin
dyn = new[5];
end
③ 关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时候使用,类似于hash,通过一个索引值和一个数据组成,索引值必须是唯一的。
13、竞争与冒险
①竞争: 在组合电路当中,当某个输入变量具有两条以上的路径到达输出端的时候,由于每条路径上的延迟时间的不同,到达终点的时间就会有先有后,这一现象称作竞争。所以这是一个输入级的概念。
②冒险:组合逻辑电路中有两个输入信号A和B,当A、B同时向相反的逻辑电平跳变(A : 1—> 0 ; B : 0 —> 1),有可能导致输出端可能产生毛刺的现象,称为冒险。这是一个输出级概念。
③解决方法:
方法一:接入滤波电容
在输出端并接一个滤波电容Cf,可以将毛刺的幅度削弱至有效点平范围之下。
缺点:增加了输出电压波形的上升时间和下降时间,使波形变坏。适合对输出波形前后无严格要求的场合。
方法二:引入选通脉冲
设法得到一个与输入信号同步的选通脉冲,对这个脉冲的宽度和作用时间有严格要求。
方法三:增加冗余项
例如:Y = AB +A’C,在B=C=1的条件下,会产生竞争冒险。通过增加冗余项BC来消除。
由于BC=1,所以Y = AB +A’C + BC成立。
此时,无论A的状态如何变化,都不会引起竞争与冒险。
方法四:加blocking clock;
14、怎么收集功能覆盖率的;
15、sv中的约束,怎么将256个数从小到大排列,不用sort方法
constraint c {for(int i=0;i<7,i++)
for(int j=i+1;j<8:i++)
if(array[i]>array[j]) begin
int temp = arrays[i];
arrays[i] = arrays[j];
arrays[j] = temp;
end;}
16、rand和randc
17、SV中同步方式有哪几种
①事件(event)
event可用于实现线程的同步,通过->操作符来触发事件,通过@和wait来等待事件。在这当中,@为边沿敏感型,可能出现因事件已经被触发而被阻塞住的情况,而wait(xx.triggered)则是电平敏感,如果当前事件已经被触发也不会被阻塞
②旗语(semaphore)
旗语可以实现对同一资源的控制访问,当一个资源存在多个请求时,可通过semaphore的方式来分配“钥匙”来控 制多方的访问请求。
③、信箱(mailbox)
在使用sv搭建验证环境时,mailbox的使用还是比较普遍,主要用于各个组件之间的通信(及信息传输)
18、谈谈SV中的class
①验证证环境的不同组件其功能和所需要处理的数据内容是不相同的。不同环境的同一类型的组件其所具备的功能和数据内容是相似的。基于以上两点,验证世界的各个组件角色明确、功能分立,使用面向对象编程与验证世界的构建原则十分符合;
②class类:基本模块包括成员变量和方法。在Verilog中module也可以包含变量和方法,只不过它是“硬件盒子”,class是“软件盒子”。
③Verilog中没有句柄的概念,即只能通过层次化的索引方式A.B.sigx,而SV中的class通过句柄可以将对象的指针赋予其它句柄,使得操作更加灵活。
④与硬件域例如module、interface不同的是,在class中声明的变量其默认为类型为动态变量,即其声明周期在仿真开始后的某时间点开始到某时间点结束。在class中定义的方法默认类型是动态方法,也可以通过关键字static修改为静态方法。