因为选择的offer是IC验证,以前学的是设计,所以只能再学systemverilog(SV)和UVM了。在学习SV和UVM之前,我认为需要学习以下几个部分:数字电路、c++和verilog。因为IC验证确实有不少别的专业之前没学过数字电路和Verilog,所以还是最好先学习一下。

知识点的总结主要是通过systemverilog验证-测试平台编写指南这本书进行的,所以请看书。通过对这本书的目录进行重点的划分,然后再进行相关知识点的总结。最后,给出自己收集的别的博主IC EDA环境的虚拟机,以及使用虚拟机需要了解的相关知识点:vim使用命令、makefile使用和VCS使用命令。当然SV的学习不用研究的太过深入,毕竟现在有UVM可以简化验证平台的构建。

目录

  • 第一章 验证导论
  • 第二章 数据类型
    • 2.1 内建数据类型
    • 2.2 数组
    • 2.3 自定义数据类型和枚举类型
    • 2.4 类型转化
  • 第三章 过程语句和子程序
    • 3.1 任务、函数和void函数
  • 第四章 连接设计和测试平台
    • 4.1 接口
  • 第五章 面向对象编程基础
    • 4.1 SV中OOP的术语与Verilog的大致对应关系。
    • 4.2 OOP的三大特性
    • 4.3 多态
    • 4.4 类型转换
  • 第六章 随机化
  • 第七章 线程与线程间的通信
    • 7.1 事件
    • 7.2 旗语
    • 7.3 mailbox信箱
  • 第八章覆盖率
    • 8.1 代码覆盖率
    • 8.2 功能覆盖率
  • IC EDA环境虚拟机资源
  • Vim使用命令
  • Makefile使用
  • VCS使用命令

第一章 验证导论

第一章主要就是为了开篇明义的介绍SV,因为阅读此书需要熟悉Verilog,所以不了解Verilog看这本书可能非常吃力,SV可以算是verilog的拓展,连根基都没有肯定看着困难。第一章建议看两遍,第一遍在最开始看,第二遍在看完全书后看。这样可以对全书有一个整体的认识。

1、验证是什么?
首先,最重要的就是要了解验证是什么,对我而言,我研究生期间学习的是IC设计,当时的项目是pcie桥芯片的设计,验证对当时的我来说非常简单,写一个master和slave模块,把各种可能出现的情况都写一遍,没有什么systemverilog,也没有什么参数化模块,主要就是为了测试功能是否正确。然后,别的验证则是研究所来提供的验证平台。其实,从现在回过头来看验证并不是像我当时想象的这么容易,只不过我把验证的各个步骤或者说模块都糅合在了一起。验证是什么,验证就是使用各种手段来验证你的设计是否正确。

2、验证怎么做?
接下来,通过回顾过去的项目,并且在学习了uvm之后,我知道了正确的验证的步骤,设计一个验证平台,其实我不是很喜欢平台这个词。我认为,验证平台就是设计一个有产生激励的模块(generate)、发送激励的模块(driver)、监视数据流的模块(monitor)和对比DUT和predict的模块(checker)组成的IP。SV就是编写验证平台的语言,而uvm则是相当于一个封装好的库,可以直接调用来简化验证平台的构建,让验证工程师专注于测试case。

当然这只是我在初学验证之后的认知,以后还会有不同的理解,各位看看就好。接下来将对各个SV知识点进行介绍。

第二章 数据类型

SV中的数据类型:
双状态数据类型:更好的性能,更低的内存功耗。
队列、动态和关联数组:减少内存消耗,自带搜索和分类功能。
类和结构:支持抽象数据结构。
联合和合并结构:允许对同一数据有多种视图。
字符串:支持内建的字符序列。
枚举类型:方便代码编写增加可读性。
这一章的内容相当于是参杂了c++和verilog的相关知识,verilog中并不存在枚举和类,也不存在数组的概念。这一部分更偏向与c++,如果学过c的话看起来会很容易。

2.1 内建数据类型

四值逻辑和二值逻辑
四值逻辑类型:integer、logic、reg、net-type
二值逻辑类型:byte、shortint、int、longint、bit

有符号类型和无符号类型
有符号类型:byte、shortint、int、longint、integer
无符号类型:bit、logic、reg、net-type
标红为较为常用逻辑类型

SV相对于verilog添加了logic数据类型,而logic数据类型可以说是SV中最常用的了,主要是要知道reg、wire和logic的使用field的选择。一般SV中不使用reg和wire,与DUT连接的SV端口只使用logic,这样就不用区分是reg还是wire。
wire: 线网,常用于assign引导的连续赋值的组合逻辑语句。
reg:寄存器,常用于always表示的时序逻辑里面。
logic:既可用于reg表示的寄存器变量又还可像wire一样被连续赋值,一般情况下logic可以取代reg和wire的大多数使用场景。

2.2 数组

定宽数组、动态数组、队列、关联数组、链表这些部分与c++相似但不完全相同,这一部分理解起来容易。在SV中,定宽数组、动态数组使用的较多,剩下的可以稍作了解,等看完全书后,再多看看有所取舍。
定宽数组: int din[16] / int din[0:15]
多维数组:int dout[4][8] / int dout[0:3][0:7]
动态数组:其数组大小在申明时可以不确定,在程序运行时才肯定具体的大小。动态数组使用需要new[]来分配空间。
队列:在使用过程中可随意增加减少元素个数,队列不需要new。
合并数组:bit [3:0][7:0] din_a 必需完整申明数组大小
非合并数组:bit [7:0] din_b[4]

2.3 自定义数据类型和枚举类型

枚举:创建了一种强大的变量类型,它仅限于一些特定名称的集合。
enum {RED,BLUE,GREEN} color;
在定义枚举类型时我们使用的关键字是enum,与class关键字类似,只不过前者是定义枚举类型,后者是定义类类型。

Struct: 结构体,就像是打包封装,把一些有共同特征(例如一个数据的各个field)的变量封装在内部,通过一定方法访问修改内部变量。具体一点说,结构体是让一些很散的数据变得很整,为了便于管理。

wire struct { //结构体线网声明,定义为线网类型时,结构体的所有成员必须都是四态类型的 logic [31:0] a, b;logic [ 7:0] out;
} trans;

和c++的区别就是,里面的成员变量的数据类型是verilog相关的。

2.4 类型转化

这一部分较为重要,因为在之后学到面向对象编程基础时,父类指针和子类指针赋值问题时需要考虑类型的转化。在这一章,只需要记得就行。

第三章 过程语句和子程序

3.1 任务、函数和void函数

这一部分就是verilog和c++的混合,任务(task)和函数(function)的区别可以看博主数字IC知识点中的总结,在这不再赘述。需要注意的是,函数和任务中与c++中的函数不同点在于,其可以指明形参的输入(input)和输入(output),引用不是使用&而是使用ref参数。

第四章 连接设计和测试平台

重点!!!
从这章开始,就进入SV与verilog和c++不同的地方了,首先就是使用接口让验证部分(TB)和被测设计(DUT)进行通信,通过接口将软件世界和硬件世界进行连接。

4.1 接口

在SV中存在有以下:module、struct、interface和class。接口(interface)是SV中特有的类型。它具有以下优缺点:

优点:
1、interface可以简化连接,在没有interface时,在top module中需要例化各个模块并一个个声明信号的连接,引入interfac则不需要在一个个去连接,减少了连接出错的可能性。
2、当需要增加一个新的信号时,只需要在interface中声明一次即可,不需要在更高层模块声明。因为,当更高层次在设计中需要修改时,只需要在interface中修改即可,不需要在顶层进行修改。

缺点:
1、使用interface后需要同时使用接口名加上信号名,可能会使得模块更冗长。
2、两个不同接口之间的连接比较困难,比如interface A 包含了interface B所有的信号,还增加了其他信号,则需要拆分出独立信号并正确驱动。

接口的定义和使用:
1、 interface的端口列表中只需要定义时钟复位等公共信号,在变量列表中定义各个需要跟DUT和TB连接的logic变量。
2、 interface在例化时,和module的例化方式一样
3、 接口需要时钟块clocking和采样的时钟信号,来做信号的同步和采样。

clocking的作用是为了实现接口输出和采样信号与时钟(clk)的同步,以保证验证平台在合适的时间点完成信号交互,消除了信号竞争问题。对于设计中的竞争问题,看数字IC知识点中的总结,在这不再赘述。在验证仿真过程中,仍然也会存在时序竞争的问题,以下主要讨论在验证仿真中的时序问题。这个问题的根源在于设计与测试平台的事件混合在同一个时间片中。为了解决这一问题,SV引入了一种新的时间片划分方式并且引入了program(程序块)用于测试平台。说实话,这部分目前我并没有看明白,因为在芯片验证漫游指南这本书中该部分讲述的更为详细,这部分内容我认为是仿真中事务的执行过程,可能需要在实际工作中相互映照才能了解的更深,这部分看不懂先放着。

第五章 面向对象编程基础

这一章和c++的OOP并无不同之处,若学过c这章过一遍就行了。而面向对象编程的高级技巧指南中,我认为关键的部分也在这里一并介绍了。

4.1 SV中OOP的术语与Verilog的大致对应关系。

类(class):类是包含变量和子程序的基本构建块,在verilog中对应的是module。
对象(object):类的实例。在Verilog中,需要实例化一个模块才能使用它。
句柄(handle):指向对象的指针。句柄就像对象的一个地址,通过改地址访问对象。
方法(method):任务或函数中操作变量的程序性代码。

4.2 OOP的三大特性

封装:把数据以及对数据的操作封装在一起,也就是对应类中的成员变量和方法。
继承:让一个类获得另一个类当中的属性和方法的方式称作继承。
多态:在派生类中多个子程序共用一个名字的现象称为“多态”,有继承才会有多态。

4.3 多态

创建新对象,使用对象,静态变量、全局变量等知识点请直接看书,在我看来需要进行思考的是多态的使用。
理解多态首先要理解虚方法,虚方法指得是当父类当中的function/task为virtual function/task时,子类如果继承了父类并同名改写了父类中方法的内容, 那么此时一个父类的句柄指向子类对象时也可以访问到子类当中被改写的方法。

对于多态,实际就是由于父类中的虚方法,导致多个子类继承父类并分别去同名改写该方时会得到不同的结果状态,多态有两个实现的必要条件:
1、父类当中的方法必须为虚方法。
2、继承的子类必须同名的改写了改方法。
同时需要注意,子类中的new函数首先应该调用父类的new函数,即super.new(),如果父类new函数不带参数,则可以省略调用(系统会自动帮助调用)。

4.4 类型转换

SV类型转换分两种方法,一种叫静态类型转换,另一种称之为动态类型转换。
静态类型转换的使用频率不高,且具有一定的危险性,我认为还是少用的好。

动态类型转换有两种情况,从父类到子类的类型转换称为向下类型转换,从子类到父类的类型转换称为向上类型转换,前者是安全的的,后者是不安全的。
【SV】中$cast 的用法已经进行了整理。

第六章 随机化

随机化是验证中最重要的一个部分,因为其可以生成更多的激励用于测试,并且检测出一些没有想到的缺陷。这一章主要是关键词的使用,关键词并不难学,主要是在设计验证是约束的范围和使用。书中无法体现这部分的困难,所以这章看起来容易,但是确实验证最关键的一个部分。
需要考虑设计输入的各个方面:
1、 器件配置
2、 环境配置
3、 原始输入数据
4、 封装后的输入数据
5、 协议异常
6、 延时
7、 事务状态
8、 错误(error)和违规(violation)

这一章所有的关键词如下:
1、rand关键字声明随机变量(指定范围内均匀分布)。
2、周期性关键字randc(数据类型只能是bit或者enum)。
3、constraint语句约束块。
4、randomize将对象中的随机变量赋值。
5、seed随机种子。
6、dist数值分布操作符(randc的随机变量不能设置权重)。
7、:=指定的数值具有相同的分布权重;:/指定的数值均分权重。
8、constraint_mode()控制约束的打开和关闭

第七章 线程与线程间的通信

这章有两个知识点:
线程: fork…join、fork…join_any和fork…join_none
线程间的通信:事件、旗语和信箱
线程部分请去看数字IC知识点中的总结。线程间的通信因为在练手过程中使用的并不多,所以只能给出概念,其实这部分很重要。

7.1 事件

event事件是静态对象,用于线程之间的同步。
事件触发操作符:->
等待事件操作符 :@ 为边沿触发,wait() 为电平敏感;
triggered函数,用于检查一个事件是否被触发过,而不要求事件等待与触发的先后顺序,是对 @ 等待事件的增强
wait(event_name.triggered) 如果当前的仿真时间范围内,事件曾被触发过,则语句不会被阻塞,否则,该语句会一直等待事件被触发。

7.2 旗语

semaphore可以实现对同一资源的访问控制

方法 释义
new() 创建一个带单个或多个钥匙的旗语,默认为0
get() 获取一个或多个钥匙的旗语,默认为1
put() 返回一个或多个钥匙的旗语,默认为1
try_get() 获取一个旗语而不被阻塞,返回1表示有足够多的钥匙,返回0表示钥匙不够

7.3 mailbox信箱

mailbox数据传输的媒介,mailbox可以在不同的线程之间传递信息,将一个线程中的数据,通过mailbox传递给另一个进程;当mailbox中没有数据时,线程将等待。
mailbox可以设置一定的深度,当信箱中的信息数量达到信箱的深度,信箱满,此时不能在信箱中存放东西。

mailbox和队列queue有相近之处
mailbox是一种对象,因此也需要使用new()来例化。如果size是0或者没有指定,则信箱是无限大的,可以容纳任意多的条目。

方法 释义
put() 把数据放入信箱
get() 把数据从信箱移除
peek() 可以获取对信箱里数据的拷贝而不移除它
try_put() 把数据存入信箱而不发生阻塞
try_get() 或try_peek() 试图获得信箱数据而不发生阻塞
num() 返回信箱中的数据条目

第八章覆盖率

覆盖率是用来衡量哪些设计特征已经被测试程序测试过的一个指标。其可以分为:代码覆盖率和功能覆盖率。

8.1 代码覆盖率

代码覆盖率:工具会自动搜集已经编写好的代码,这部分不是关注的重点,在功能覆盖率之前需要使用工具完成。常见的代码覆盖率如下:
行覆盖率(line coverage):记录程序的各行代码被执行的情况。
条件覆盖率(condition coverage):记录各个条件中的逻辑操作数被覆盖的情况。
跳转覆盖率(toggle coverage):记录单bit信号变量的值为0/1跳转情况,如从0到1,或者从1到0的跳转。
分支覆盖率(branch coverage):又称路径覆盖率(path coverage),指在if,case,for,forever,while等语句中各个分支的执行情况。
状态机覆盖率(FSM coverage):用来记录状态机的各种状态被进入的次数以及状态之间的跳转情况。

8.2 功能覆盖率

功能覆盖率是由自定义的度量,主要是衡量设计所实现的各项功能,是否按预想的行为执行,需要符合设计说明书的功能点要求。
这部分由两个部分组成:面向数据的覆盖率和面向控制的覆盖率。
面向数据的覆盖率由覆盖组(coverage groups)、覆盖点(coverage points)和交叉覆盖(cross coverage)完成。
面向控制的覆盖率可以检测行为序列通过断言覆盖率(assertion coverage)来完成。
覆盖组(coverage groups):一种用户自定义的结构类型,一旦被定义就可以创建多个实例就像类(class)一样,也是通过new()来创建实例的。覆盖组可以定义在module、program、interface以及class中。
覆盖点(coverage points):一个覆盖组可以包含多个覆盖点,每个覆盖点有一组显式bins值,bins值可由用户自己定义,每个bins值与采样的变量或者变量的转换有关。一个覆盖点可以是一个整型变量也可以是一个整型表达式。
交叉覆盖(cross coverage):在覆盖点或变量之间指定的,必须先指定覆盖点,然后通过关键字cross定义覆盖点之间的交叉覆盖。

IC EDA环境虚拟机资源

这部分是使用别的博主构建的EDA环境虚拟机,我自己尝试过构建VCS+Verdi环境,但是有现成并且更完善的虚拟机当然直接用就更好了。以下贴出虚拟机使用流程和虚拟机下载地址。
https://blog.csdn.net/weixin_40377195/article/details/115439048
百度云链接:
链接:https://pan.baidu.com/s/1td8w8zUJNykfNrPP8rBKZQ
提取码:0bd3
–来自百度网盘超级会员V5的分享
该虚拟机开机密码为:2020
在学完了SV之后,当然不算结束,这只是其中的一小部分而已,到真正使用还有很多需要学习的东西,vim使用命令、makefile使用和VCS使用命令。接下来将对这些命令进行介绍。

Vim使用命令

这部分学习起来比较容易
gvim 使用教程.

Makefile使用

这部分可以当工具书看,需要用前看看。
链接:https://pan.baidu.com/s/1qVUOqsr2ucuJesOIHOBSFQ
提取码:u9rn
–来自百度网盘超级会员V6的分享

VCS使用命令

这一部分也是需要前看看,本人并未进行实战。
VCS命令详解(一):编译命令.
VCS命令详解(二):仿真命令.

SystemVerilog学习总结相关推荐

  1. [SV]SystemVerilog学习笔记之struct union

    SystemVerilog学习笔记(四) 一.结构体(struct) 1.1.结构体声明(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct { // 通过var进行 ...

  2. SystemVerilog学习笔记(可综合的部分)(一)

    SystemVerilog学习笔记(一) 1. Verilog-1995的数据类型 2. 网络(net)类型 3.变量(variable)类型 4.向量(packed arrays) 5.数组(unp ...

  3. [Systemverilog学习笔记] Thread Communication-Event、Semaphore、mailbox

    [Systemverilog学习笔记] Thread Communication-Event.Semaphore.mailbox 学习目标: 通过下文了解Event.Semaphore.mailbox ...

  4. SystemVerilog学习之路(6)— 最小时间和时间片

    SystemVerilog学习之路(6)- 最小时间和时间片 一.前言 delta-cycle(无限最小时间):默认情况下,时钟对于组合电路的驱动会添加一个无限最小时间(delta-cycle)的延迟 ...

  5. SystemVerilog学习笔记

    SystemVerilog学习笔记(会持续更新~) 文章目录 SystemVerilog学习笔记(会持续更新~) SV数据类型 固定数组 固定数组的声明格式 一维数组与二维数组 固定数组的一些操作 固 ...

  6. [笔记] systemverilog学习笔录

    2015-08-20 周四 晴 http://blog.chinaaet.com/detail/40060 SystemVerilog中包含并发断言和即时断言两种类型的断言.所谓并发断言就是在时钟边沿 ...

  7. 【数字IC验证快速入门】14、SystemVerilog学习之基本语法1(数组、队列、结构体、枚举、字符串...内含实践练习)

    导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...

  8. IC验证——SystemVerilog学习

    一般来说,在数字IC验证中,编写testbench文件会采用verilog,但随着设计越来越复杂,为了更方便例化模块,面向对象编程的SystemVerilog(以下简称SV)越来越流行. 下文部分图片 ...

  9. SystemVerilog学习笔记1 ---《数据类型》

    1. 数据类型 1.1 logic 变量没有声明类型时,默认为logci verilog中有两种基本的数据类型:变量和线网(net).都为4状态(0.1.X.Z) SystemVerilog中将Ver ...

最新文章

  1. getdate函数_SQL日期函数和GETDATE解释为带有语法示例
  2. Ubuntu下压缩解压文件
  3. Lesson 13.2 模型拟合度概念介绍与欠拟合模型的结构调整策略
  4. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用37
  5. sublime3在windows下面无法关联.py文件解决方案(转载)
  6. ip和端口的本质与作用,网络协议栈
  7. Windows Server 版本信息及支持期 Win10系统各版本服务起止日期。
  8. 培养用户习惯才是软件的唯一出路!
  9. npm ERR! Unexpected end of JSON input while parsing near '...Comment: https://open'
  10. Atitit 软件的俩大要点 提升可读性 提升扩展性 目录 1. 命名可读性 1 2. 提升扩展性法 1 3. 项目常见扩展法 2 1.结构可读性 表驱动代替if else 减少层次 Dsl
  11. ZXing条码扫描----竖屏解决方案
  12. Java中的retainAll()函数笔记
  13. 默然日记20150207
  14. 键盘选中一行或多行的快捷键
  15. Excel VBA内部函数大全
  16. PG之pg_repack使用
  17. 在 Node.js 中操作 Redis
  18. 学什么技术专业最有前途?
  19. 树莓派3 中文输入法安装教程
  20. 在Eclipse中配置CheckStyle

热门文章

  1. 基于(plc)portal v14的三级传送带设计
  2. asp.net入门书籍
  3. 应用层操作gpio的3种方法之一:通过sysfs文件系统
  4. 接入GoogePay 退款APi
  5. python tkinter出牌洗牌
  6. 元宇宙的六大核心技术
  7. 125啦读书导航新版上线啦
  8. 一整只烧鹅价格=烧鹅上庄价格+烧鹅下庄价格这个关系不因货币变掉而变
  9. element-ui日期选择器设置禁止选择时间(禁止选择今天之前或包含今天)
  10. Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localizati论文精读及资源整理