SV学习视频记录

interface(接口)

1、引入接口的目的是方便模块输入输出信号的管理

2、接口中存在modport,可以用于将一组信号归类

3、接口中存在clocking,用于信号同步,避免竞争冒险,只能用于平台。时钟在默认情况下存在input #1step output #0

4、#n表示经过n个时间单位,##n表示经过n个周期

5、SV中的时间分区:将某一个时钟(?也可能是某段短时间片)分成四个区间,active(执行duv中的仿真代码),observed(执行断言),reactive(执行平台中的oop操作),postpone(采样)。

6、加入program的目的是为了解决testbech和rtl信号可能产生的竞争冒险现象。program和module的区别主要有三点,
一、module里可以定义program,而program里不能定义module;
二、是module里不能调用program里定义的task, function,而program可以调用module里定义的task和function;
三、program里不能例化module,interface,其它program,也不能包含always块·。
四、最主要的区别是program是在reactive时域执行的,而module在active时域执行的,所以program在module后执行,可以解决竞争冒险现象

数据类型

1、SV中可以用`0,`1,`z,`x的方式对多bit变量直接赋值

2、四值变量logic,二值变量bit(无符号),byte,shortint,int,longint。二值变量的默认值为0,四值变量的默认值为x。将一个四值变量赋值为二值变量时,x和z的值默认被映射为0.$isunknown()用来判断某变量是否含有不定态。对于越界地址的写是无效的,对于越界地址的读范围默认值(0或x)。

3、定长数组:可以是一维,也可以是多维。数组的下表可以人为指定,默认从0开始。数组的赋值可以通过'{}的方式整体赋值也可以通过for循环的方式赋值。$size()访问数组的大小。

4、for与foreach的比较(待完善)

5、数组之间可以通过=进行赋值,通过!=和=进行比较

6、动态数组。动态数组使用[]进行说明,在运行时通过new[n]来确定大小,大小是可以改变的。动态数组有一些内建的系统子程序,如delete()和size().

7、队列。使用[$]进行定义,使用{}进行赋值。内建子程序有:

insert(i,a):在i位置插入元素a或队列a

delete(i):删除i位置的元素

delete():删除整个队列

push_front(a):在队列前面插入a

push_back(a):在队列末尾插入a

pop_back():删除队列中的最后一个元素

pop_front():删除队列中的第一个元素

8、联合数组。可以利用离散的内存,不局限于使用连续的空间。(待完善)

9、数组方法。可以用于定长数组,动态数组,队列和关联数组

sum():对数组的所有元素求和,返回值的位宽与数组元素位宽一致。

product():积

and():与

or():或

xor():异或

min():最小值,返回值为队列

max(): 最大值,返回值为队列

unique():返回一个去重后的队列

find with(item>3):返回所有大于3的元素组成的队列

find_index with(item>3):返回所有大于3的元素的下标组成的队列

类似地子程序还有find_first with(),find_first_index with(),find_last with(),find_last_index_with()

reverse():将整个数组逆序,会改变原数组

sort():将数组按照升序排列,会改变原数组

rsort():将数组按照降序排列,会改变原数组

shuffle():将数组乱序,会改变原数组

10、结构体。将不同的数据类型组合在一起

11、枚举类型。 默认的数据类型是整型,最左侧的值默认为0,往右依次加1.

它的內建子程序有:

name():得到枚举变量值对应的字符串。

first():返回第一个枚举常量

last():返回最后一个枚举常量

next():返回下一个枚举常量

next(N):返回以后第N个枚举常量

prev():返回上一个枚举常量

prev(N):返回以前第N个枚举常量

SV基础

1、inside关键字。inside后接集合表达式,可以用在随机化表达式或者if表达式中。

2、类型强制转换。type'(expression)

3、位宽强制转换。size'(expression)

4、符号强制转换。signed'(expression);unsigned'(expression)

5、do...while循环和while循环的区别:while循环在满足循环条件时才会执行,do...while循环则至少会执行一次。

6、verilog中task和function的区别:function中不能有消耗时间的语句,因此function不能调用task,且必须有返回值。task有input,output和inout信号,可以消耗时间。

7、sv中task和function的区别:不再需要begin...end语句,增加了return语句(task可以使用return退出程序,function可以使用return返回值),void function可以不需要返回值,function中可以有output和inout方向的参数。缺省参数默认是logic类型,input方向,或者和上一个参数一样。

8、ref和const关键字。ref关键字替代了input,output和inout,它表示变量通过引用传递而并非复制传递,它只能用于automatic task和function中。如想要不改变变量的值,通过const ref修饰变量。

9、从函数中返回一个数组

方法一:用typeddef定义一个数组类型,然后将这种类型作为返回值

方法二:使用ref修饰数组传递到函数中

方法三:将数组包装到了类中,返回对象的句柄

10、局部数据存储

自动存储:module和program块中的子程序默认状态下使用静态存储。当子程序使用静态存储时,局部变量会使用共享的静态存储区,不同线程之间会窜用局部变量。局部变量采用静态存储时,在仿真的一开始就有初值,而不是在初始化时才被赋予初值。

OOP(object oriented programming)面向对象编程

1、类,对象,句柄,初始化。

2、static关键字:静态变量对所有的对象共享,存放在堆中。

3、浅复制与深复制。浅复制只能复制句柄,不能复制空间。

4、extends(继承)。子类可以继承父类所有的变量和方法。

5、vitual关键字。

virtual修饰interface:interface 简化了模块之间的连接,但是无法很好地适用于基于OOP的测试平台,无法在program ,class中进行实例化。为了解决这个问题, System Verilog引入了virtual interface的概念。virtual interface是实际interface的指针。即virtual interface是一种可以在class中实例化的数据类型,使用virtual interface可与被测设计(DUT)进行间接地通信,而无需使用层次结构引用。

vitual修饰function:称为虚方法,父类的虚方法被子类重写之后,父类和子类拥有同名的虚方法,当父类的句柄指向子类的对象时,父类句柄调用该方法名时具体调用哪个方法取决于对象类型;当此方法不是虚方法时,调用哪个方法取决于句柄类型。

virtual修饰class:称为虚类,虚类可以申明句柄,可以被继承,但不能被实例化。继承自虚类的类只有在所有的虚方法都有实体的时候猜能被例化。

pure virtual修饰function:称为纯虚方法,它不是一个实体为空的虚方法,而是一个原型定义。

纯虚方法至能在虚类中定义,但是虚类中也可以定义非纯虚方法。

6、多态。oop中多个子程序使用同一个名字的现象称为多态,例如,子类和父类中拥有同名的方法。

随机化

1、 rand和randc

2、constraint(约束)

3、randomize()方法

4、dist操作符:搭配:=(范围内每一个值的权重是相等的)和:/(权重均分到范围内的每一个值)

5、->符号

6、rand_mode():将随机变量打开或关闭

7、constraint_mode():将约束打开或关闭

fork与通信

1、fork...join,fork...join any,fork..join none(子线程与父线程同时时,先执行父线程语句)

2、wait fork:等待所有的线程执行完

3、disable fork:结束所有子线程

4、event:->触发事件,@等待事件的触发(边沿敏感),wait(e.triggered())等待事件被触发(电平敏感)

5、旗语:对共享资源的一种访问控制策略。旗语是一种类,new(n)可以创建一个有一把钥匙或者多把钥匙的旗语;get(n)可以获取一把或多把钥匙;put(n)会返回一把或多把钥匙。

6、信箱:用于线程之间的信息传递,类似于一个具有源端和接收端的fifo。信箱是一种类,new(n)用来创建一个n条目的信箱,put(句柄)将句柄传递到信箱中,get(句柄)将信箱中的内容移除并传递给句柄,peek对信箱中的内容拷贝但不移除。

断言

1、立即断言:assert(),作用类似与if

2、并发断言:使用property定义

覆盖率

·1、代码覆盖率

2、功能覆盖率

3、状态机覆盖率

操作文件的系统函数

$fopen(file_name,mode):打开一个文件,第二个参数规定了能对文件进行何种操作

$fscanf(文件句柄,读取格式,承接数组):每次读取指定文件中的一行,赋值给承接数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值