SV是IC验证必须要会的内容,在面试中也经常被问到,下面将以System Verilog书本中的顺序,逐步讲解。
1. 数据类型
Verilog中的数据类型有wire和reg,二者都是四值逻辑(0,1,x,z),还有integer(可综合),time(64bit无符号整数,不可综合),real(浮点数)。SV中引入了需要两态数据类型,比如bit int 等。还引入了四值逻辑logic类型,它是wire和req的一个结合,这样我们可以不再理会数据接口的类型直接定义为logic就可以,但是logic不可用于双向总线(inout)和多驱动情况下。
上述概念在笔试中经常出现,至于面试中可能会问,SV为什么在已有四值逻辑的前提下,还要引入二值逻辑?(首先SV在一开始设计的时候,就希望软件和硬件的世界分开进行),硬件的世界就是硬件设计,属于四值逻辑,软件的世界就是验证环境,是二值逻辑。二值逻辑更有利于提高仿真器的性能并减少内存的使用量。并且使用二值逻辑在进行SV和C语言交互的时候,两种语言边界的数据传输更简单。此外,使用四值逻辑进行存储的时候,至少需要两位去表示四个状态,而二值逻辑只需要一位,所以从内存的消耗上,二值逻辑更具有优势。
2. 数组和队列
定宽数组:数组大小在定义时就被确定了,一般分为压缩数组和非压缩数组。
压缩数组 bit[3:0][7:0] name 4个字节组成32bit 每个字节8位
非压缩数组 bit[7:0]name[3]
动态数组:动态数组使用前必须调用new[]去指定长度分配空间,动态数组在编译时是不确定的,运行时才能确定。
关联数组:类似于hash表,关联数组采用在方括号中放置数据类型的形式来进行声明,例如[int]或[packet]。SV中提供关联数组来保持稀疏矩阵的元素,一般再对非常大的空间进行寻址时,SV只为实际写入的元素分配空间,这可以节省时间。
队列:队列是一个大小可变,具有相同数据类型成员的有序集合。声明时用符号[$],不需要使用new函数,可以在任何位置增加或删除元素。
上述概念都是面试中的高频知识点,还有一些开放性问题,比如它们的应用场合(动态数组适合随时事务不确定位宽大小的情况,关联数组用来存放稀疏矩阵中的元素,队列是增加元素或删除元素比较方便)
3. 结构体和联合体
结构体struct,联合体union。
struct中各成员都占有自己的内存空间,他们同时存在,一个struct变量的总长度等于所有成员长度之和,在union中,所有成员不能同时占有它的内存空间,它们不能同时存在,union变量的长度等于最长的成员的长度。
4. interface和modport
interface:定义interface模块以关键字interface和endinterface结尾,内部通过定义输入输出信号和对应的logic信号,注意,双态信号不可以定义为logic。定义好了interface后,需要在top层将interface进行例化。
modport:使用modport来对上述信号接口进行一个分组和方向指定,这样会使得接口更加条理清洗。在顶层top中例化test时参数还是接口(模块内部是modport)
5. clocking同步控制定义
接口中部分信号需要与时钟保持同步,这时信号才可以被同步的驱动或者采样。使用clocking 时钟块创建同步模型,可以确保内部信号的同步使用,每一个clocking块对应一个时钟域。
注意:我们的输入信号需要在时钟上升沿前被采样,输出信号需要在时钟后采样,才能避免建立时间与保持时间的违例,进而避免亚稳态现象的发生。
6.线程使用
fork join:并行运行,内部所有进程都运行结束才结束
fork join any:并行运行 内部任意线程运行结束就结束
fork join none:并行运行 可直接运行后面程序 无需等待
wait fork :等待进程结束
disable fork: 结束其余进程
注意 程序里面的begin end语句块中 内部是顺序执行
fork join是面试必问的考点 秋招中笔试时 还会有公司手撕fork join方面的代码
7. 线程间通信
1) 事件Event,用于线程之间的同步 控制线程序列
触发事件操作符:-> 不会阻塞线程的执行,通常触发操作在等待时间操作之后(先等待,后触发)
等待时间操作符:@和wait(),等待操作总是阻塞线程的执行,只有当时间发生变化(被触发时),线程才会继续执行
2)旗语semaphore,用于对共享资源管理
使用旗语时,然后通过new创建一个包含特定钥匙数的旗语对象,除了new 函数外semaphore还提供了get 获取钥匙和 put 归还钥匙 try_get是试图获得一把或多把钥匙而不阻塞
3.信箱mailbox,数据传输的媒介,mailbox可以实现不同线程之间的信息传递
maibox类似于FIFO,可以设置一定的深度,当信箱中信息数量达到邮箱的深度时,信箱为满,此时不能再往信箱中存放信息。使用信箱时,通过new创建信箱对象 默认无限深,put将数据信息放入信箱 ,get获取数据并将数据信息移除信箱, num返回邮箱中数据条目,peek可以获取数据而不移除 put get均会阻塞,但是try get和try put不会阻塞