【sv】重点总结文字版

SV总结(文字版)

另:
word版:路科_v2pro_sv重点总结.docx
手写笔记(sv全):路科_v2pro_sv听课手写笔记.pdf

目录

  1. 第一章 验证导论 3
    1.1. 测试平台 3
    1.2. 为什么要用sv,相比于Verilog有什么优点 4
  2. 第二章 数据类型(重点) 5
    2.1. 数据类型 5
    2.2. 二值逻辑和四值逻辑有哪些 6
    2.3. 数组类型的特点和应用 6
    2.4. 枚举类型的转换 7
    2.5. 注意 8
  3. 第三章 过程语句和子程序 8
    3.1. Initial 8
    3.2. Ref参数类型 9
    3.3. Task任务和function函数的区别及是否消耗时间 9
  4. 第四章 连接设计和测试平台 10
    4.1. Interface接口(重点) 10
    4.2. 阻塞赋值和非阻塞赋值 10
    4.3. 竞争和冒险(重点) 定义、如何避免 11
    4.4. Program 12
  5. 第五章 面向对象编程基础(重点) 12
    5.1. 类的三要素 12
    5.2. 全局变量、局部变量的区别 12
    5.3. 句柄:子类、父类 13
  6. 第六章 随机化(重点) 13
    6.1. 为什么要随机化 13
    6.2. Rand、randc 区别 14
    6.3. Constraint 14
    6.4. 随机化调用函数 14
    6.5. 权重 := :/ 15
    6.6. Randsequence/randcase 15
  7. 第七章 线程及线程间通信 16
    7.1. 线程的概念 16
    7.2. fork…join/join_any/join_none 区别(重点) 16
    7.3. event事件 16
    7.4. semaphone旗语 18
    7.5. mailbox信箱 18
  8. 高级技巧 19
    8.1. downcasting类型向下转换 19
    8.2. 虚方法 19
    8.3. 例子 19

1.第一章 验证导论
1.1.测试平台

1.2.为什么要用sv,相比于Verilog有什么优点
1)不需要综合,具有灵活性;
2)包含了v,拓展了数据类型、结构、压缩数组、接口、断言等;
3)加入了面向队对象的概念,便于复用,提高对大型设计建模能力。
2.第二章 数据类型(重点)
2.1.数据类型
SV是对verilog的扩展
2.2.二值逻辑和四值逻辑有哪些

四值逻辑:integer(有符号)、logic、reg、net-type、time;
二值逻辑:byte、shortint、int、longint、bit(无符号)。
2.3.数组类型的特点和应用
主要内容:Logic、双状态数据类型、定宽数组、动态数组、队列、关联数组、结构体、合并结构、类型转换、枚举类型、字符串等
sv新数据类型优点:
1)双状态数据类型:更好的性能,更低的内存;
2)队列、动态和关联数组:减少内存消耗,自带搜索和分类功能;
3)类和结构:支持抽象数据结构;
4)枚举类型:方便代码编写,增加可读性。
数据类型应用
1)队列:适用于创建计分板,可频繁增加或删减数据(任何位置);
2)动态数组:允许在程序运行时指定数组宽度,为测试平台提供了极大灵活性;
3)关联数组:用于稀疏存储和一些只有单一索引的计分板;
4)枚举类型:创建具名常量列表使代码更便于读写。
(另:
压缩数组和非压缩数组
bit [7:0][3:0] packed;
bit[7:0] b_unpacked[3:0];
二维数组
int a1 [7:0] [1023:0] : [7:0]二维[1023:0]一维
Wire [7:0] table [3:0]: [7:0]一维[3:0]二维)
2.4.枚举类型的转换
枚举类型的缺省类型为双状态int
枚举类型和整型之间的转化:
int = enum
enum = T’(int)
例子:
typedef enum {INIT,DECODE,IDLE} fsmstate_e;
fsmstate_e pstate,nstate; //声明自定义类型变量
case (pstate)
IDLE : nstate = INIT; //数值赋值
INIT : nstate = DECODE;
default : nstate = IDLE;
endcase
$display (“Next state is %s”,nstate.name()); //显示状态名
问:就上面的例子中,给nstate如果直接用整数赋值,那么合法的范围是多少?
A.该赋值行为本身不合法
B.[0:2]
C.任意整数
D.xxx
答案是 A解析:因为上面已经定义nstate为枚举类型,而枚举类型不可以直接用整数赋值。
2.5.注意
在不同数据类型操作时应注意变量的:
1)逻辑数值类型;
2)符号类型;
3)矢量位宽。

3.第三章 过程语句和子程序
3.1.Initial
1)Initial只执行一次,符合软件的执行方式;
2)Initial和always一样,无法被延迟执行,即在仿真一开始它们都会同时执行,执行时没有先后顺序之分;
3)initial内部是按时间顺序执行的;
4)Initial 不可综合。
3.2.Ref参数类型
大白话讲:就是说你一加这东西,你程序操作的目标数据,都是存储器中同一片地址数据,这样凡是用到这片数据的程序,都会牵一发动全身。
注意:
1)ref 只能被用于带自动存储的子程序中;
2)如果不希望子程序修改数组的值,则使用const ref类型(p55)
3)在需要方法中修改类中参数值得时候,需要在参数前加上ref,尤其是句柄(P123)。

3.3.Task任务和function函数的区别及是否消耗时间
function task
能调用 function函数,
但不能调用task 可以调用function 和 task
不能有耗时语句,
在仿真0时刻执行 任务中可以置入耗时语句,
可在非零时刻执行
至少有一个或多个输入变量 可以没有,也可以有多个输入、输出和双向变量
只能返回一个值,
不能有输出或者双向变量 任务不返回任何值,可以通过输出或者双向变量传递多个值

4.第四章 连接设计和测试平台
4.1.Interface接口(重点)
Interface的特点
1)可以用作设计,也可以用作验证;
2)与module的使用性质很像;
可以定义端口,也可以定义双向信号;
可以使用initial和always,也可以定义function和task。
3)TB和DUT是相互独立的,通过接口连接;
4)端口列表中只需要定义时钟、复位等公共信号,或者不定义任何端口信号。
Modport用来限定信号传输方向
clocking时序块可放在接口中做
4.2.阻塞赋值和非阻塞赋值
阻塞赋值 非阻塞赋值
符号 = <=
执行顺序 顺序执行 并行执行
应用 组合逻辑 时序逻辑

4.3.竞争和冒险(重点) 定义、如何避免
竞争和冒险的定义:
1)竞争:在组合逻辑中,由于门的输入信号通路中经过了不同的延时,导致到达该门的时间不一致叫竞争;
2)冒险:由于竞争而产生的尖脉冲或者说毛刺。
硬件的解决方法:
1)增加滤波电容;
2)使用格雷码,一次只有一位改变;
3)利用冗余项法:代数法和卡诺图法。
验证的解决方法:
1)延迟采样:在驱动时,添加相应的人为延迟,模拟真实的延迟行为,同时加大clk与变量之间的延迟,以此提高DUT使用信号时的准确度和TB采样信号时的可靠性;
2)提前采样:对于一些采样时依然存在delta-cycle延迟信号,我们还可以依靠在采样事件前的某一段时刻中进行采样,来模拟建立时间的采样要求,确保采样的可靠性。
4.4.Program
1)不能用always、module、interface;
2)顺序执行;
3)可定义变量,发起initial;
4)阻塞赋值→内部变量;
5)非阻塞赋值→外部硬件信号。

5.第五章 面向对象编程基础(重点)
5.1.类的三要素
封装、继承、多态
继承是子类使用父类的方法,而多态则是父类使用子类的方法。
5.2.全局变量、局部变量的区别
public、protect和local的访问权限
若没有指明访问类型,成员的默认类型是public
类型 该类 子类 外部
public(默认) √ √ √
protected √ √ ×
local √ × ×
5.3.句柄:子类、父类
1)子类对象的面积比父类大,包括了父类;
2)子类变量可以和父类同名;
3)子类句柄可以访问子类+父类的变量;
4)父类句柄 可能指向父类(basic_test t=new)
可能指向子类 (t=wr);
5)赋值: 子类句柄可直接赋值给父类(t=wr)
父类句柄不可直接赋值给子类,需用$cast(wr,t);

6.第六章 随机化(重点)
6.1.为什么要随机化
1)使用随机化,可以很容易的在短时间内产生大量随机激励,适用于较大验证空间,可以量化验证流程,减少重复性代码量,丰富验证的多样性,提高验证效率;
2)相对于固定激励,可以简化代码编写,找到可能隐藏的错误,提高验证的完备性。
6.2.Rand、randc 区别
Rand : 随机范围内被取到的概率都是等同的,
例:1/54,1/54,1/54
Randc:(c:cycle) 表示周期化随机,
例:1/54,1/53,1/52,,周期54
6.3.Constraint
注意定义数据的类型位宽和约束范围的匹配

6.4.随机化调用函数
1) r a n d o m : 系 统 随 机 化 调 用 函 数 , 返 回 32 b i t 有 符 号 数 ; 2 ) random:系统随机化调用函数,返回32bit有符号数; 2) random32bit2)urandom():系统随机化调用函数,返回32bit无符号数;
3)$urandom_range():系统随机化调用函数,返回指定范围内的无符号随机整数;
4)srandom():对象和线程(手动添加种子seed)的随机化方法;
5)randomize():对象的随机化方法;

6.5.权重 := :/
:=每个值的权重是相同的;
:/权重要平分到值范围内的每一个值。
6.6.Randsequence/randcase
都是轻量级随机控制应用;
randsequence类似case;
randcase 建立随机决策树对应dist权重约束和ifelse条件约束。

7.第七章 线程及线程间通信
7.1.线程的概念
线程即独立运行的程序
线程需要被触发,可以结束或者不结束
7.2.fork…join/join_any/join_none 区别(重点)

fork…join fork…join_any fork…join_none
内部线程并行执行,最长子线程结束后,继续父线程 只要任意一线程结束,就继续父线程,其他线程还继续 只要触发,
就算还没有跑线程,
就可以结束

7.3.event事件
->e1 触发e1事件
@e1 阻塞e1事件 (边沿敏感)
wait(e1.triggered()) 阻塞e1 (电平敏感)
@ 和wait(e1.triggered())的区别

1)如果在timeslot中,触发发生在@前则@是无法探测到,这就要求@一直需要提前挂着等待,如果没有捕捉到就会一直阻塞;
2)在trigger的情况中,整个timeslot都可以探测到,trigger属性是一种能够查询事件是否已经被触发,而不是只检查当前时刻;
7.4.semaphone旗语
实现对统一资源的访问控制,确保互斥访问,为了线程安全
注意:
1)new()若不传参数就是没有钥匙
2)get()之后记得要put()
7.5.mailbox信箱
作为缓存,类似队列,在两线程间进行数据传递
缺省时,容量不限
若没有ref,则只是拷贝
若有ref,表示对队列的指针操作
ex:

用了ref方法内部对队列的操作会影响外部队列本身,否则q就没法传数据
mailbox和队列的对比:
Mailbox 队列
需new()例化 只需声明
数据类型可不同 数据类型必须一致
put()、get()
是阻塞的 push.back()、pop.front()
是非阻塞的
只能用作FIFO 可以用作FIFO或LOFO
对数组拷贝的是指针 对数组引用,需声明端口方向ref

8.第八章 高级技巧
8.1.downcasting类型向下转换
$cast(子类,父类):父类向下转换成子类
8.2.虚方法
Virtual!同名同参同返回值,
注意:子类对象返回的类型是父类还是子类。
8.3.例子
ex.1

ex.2

ex.3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值