SystemVerilog
文章平均质量分 63
SystemVerilog
卢卡喵
这个作者很懒,什么都没留下…
展开
-
SV中的浅拷贝和深拷贝
1.浅拷贝浅拷贝: 句柄拷贝,不复制对象,只复制了句柄。只拷贝对象中的数据变量,而对于对象中的数据操作(一般为任务和函数)和其中定义的其他类的句柄,采用类似“引用”的方式,浅拷贝前后共用同一内存空间。可以使用new操作符进行复制。如果一个类包含指向另一个类的句柄,只有最高级的对象被new操作符复制,下一层的对象都不会被复制class Transaction; bit [31:0] addr,crc,data[8]; statistics stats; static原创 2022-04-28 22:48:48 · 3067 阅读 · 3 评论 -
systemverilog-内嵌约束randomize()with{}、soft 约束、local::
SV允许使用 randomize()with{} 来增加额外的约束,这和在类里增加约束是等效的。当没有soft修饰时,约束发生冲突则报错;当soft修饰时,则以外部约束的优先级高于内部class chnl_generator extends uvm_component;rand int pkt_id = 0; rand int ch_id = -1; rand int data_nidles = -1; rand int pkt_nidles = -1; rand in原创 2022-01-06 16:44:50 · 6561 阅读 · 0 评论 -
systemverilog-虚方法
1.虚方法在OOP中多个子程序使用一个共同的名字的现象叫做“多态”。虚方法就是一个基本的多态结构。默认情况下,子类覆盖的方法并不会继承父类的同名方法,只有通过super.method() 的方式显示执行,才会达到继承父类方法的效果。类的继承是继承父类的成员变量和成员方法子类对象中即有从父类继承而来的,也有子类扩展的方法和变量子类中重写的方法对父类是不可见的要想子类重写父类的方法能被父类看到,那就需要虚方法。class Transaction; rand bit[31:0] src,dst原创 2021-12-08 22:13:56 · 854 阅读 · 0 评论 -
systemverilog-参数化的类
参数化的使用是为了提高代码的复用率在硬件设计中,参数往往是整形,例如端口数目或者位宽在验证环境中,参数的使用更加灵活,可以使用各种类型来做类定义时的参数参数化的类在类定义时添加参数 #(type T= int),如果不指定参数类型,则默认采用int类型将原代码int用参数T来代替参数化的类将可以在后期例化时使用不同的参数,来存储不同的数据类型class Stack #(type T = int); local T stack[100]; local int top; fu...原创 2021-12-08 22:11:55 · 1886 阅读 · 0 评论 -
systemverilog-$cast向下类型转换
文章目录1.句柄与对象2.静态转换和动态转换2.1 静态转换2.2 动态转换在看绿皮书时,对 $cast 理解的很浅显,在查阅了更多相关内容,甚至发现理解还有误,所以下面对它进行详细的总结。1.句柄与对象1.句柄:指向对象的指针2.对象:对象是类的一个实例BadTr bad;//创建类的句柄bad = new();//创建对象2.静态转换和动态转换SV类型转换分为两种方法,一种是静态类型转换,另一种是动态类型转换。2.1 静态转换静态转换即需要在转换的表达式前加上单引号即可,该方式不会原创 2021-12-08 22:10:53 · 1224 阅读 · 0 评论 -
systemverilog-覆盖率
文章目录1.覆盖率类型2.代码覆盖率3. 断言覆盖率4.漏洞率曲线5.功能覆盖率5.1功能覆盖策略5.2功能覆盖率建模5.3覆盖组-covergroup1.covergroup的采样触发2.covergroup使用事件触发5.4数据采样1.bin的创建和使用6.条件覆盖率7.翻转覆盖率8 忽略的bin和非法的bin9.交叉覆盖率10.覆盖选项10.1 单个实例覆盖率10.2 覆盖组注释10.3 次数限定10.4覆盖率目标10.5 covergroup方法1.覆盖率类型覆盖率是衡量设计验证完备性的一个通用原创 2021-12-08 22:09:12 · 2133 阅读 · 0 评论 -
systemverilog-线程的使用与通信
@[TOC]1.并发线程1.fork-join、fork-join_any 和 fork-join_none//父线程fork statement 1;//子线程 statement 2;//子线程 statement 3;//子线程join | join_any |join_nonestatement 4;join 子线程并行执行,必须在线程statement4执行之前完成join _any 子线程并行执行,必须有一个子线程完成,线程statement4才原创 2021-12-06 22:43:59 · 464 阅读 · 0 评论 -
systemverilog-随机化技术
随机化技术1.什么需要随机化2.随机变量类型和方法3.随机化约束constraint3.1关系操作符约束(>、<、=、>=、<=)3.2 范围操作符约束(inside)3.3条件约束(if-else;- >)3.4 双向约束3.5内嵌约束randomize()with{}4.权重分布5.数组约束5.1约束数组中的元素5.2利用**randc**变量产生唯一元素值的数组5.3 随机化句柄数组随着设计变得越来越大,要产生一个完整的激励集来测试设计的功能也变得越来越困难。解决的办原创 2021-12-06 22:42:26 · 1133 阅读 · 0 评论 -
systemverilog-OOP:封装、继承和多态
类的封装、继承和多态1.面向对象的三个基本特征1.1 类与结构体的差异2.封装3.继承3.1 成员访问权限4.多态1.面向对象的三个基本特征对象:万物皆对象类:类就是具有相同属性和行为的对象的抽象的集合实例:对象就是类的实例封装可以隐藏实现细节,使得代码模块化;继承可以扩展已经存在的代码模块,两者的目的都是为了代码重用,多态为了实现另一个目的——接口重用。1.1 类与结构体的差异结构体(struct)可以自定义一个类型,类也是一种类型,那类与结构体的异同在于:二者本身都可以定义数据成员原创 2021-12-06 22:41:29 · 1575 阅读 · 0 评论 -
systemverilog-static和automatic
在systemverilog中module,program,function和task默认都是static的,可以在module,program,function和task加入automatic用作动态。在class中是automatic的。static 变量为静态的,在整个程序执行过程中都存在,并且无论被实例多少次,在内存中只存在一份,每次实例都是指向这一个地址,共享一个变量automatic是每次实例均产生一个新的内存,互相不共享,是单独、不同的static 和 automatic 除原创 2021-12-05 23:27:24 · 957 阅读 · 0 评论 -
systemverilog-function和task
function and task1. function 和 task的异同2.function3.task4.automatic 和 static在system verilog的class中定义的方法分为两种:function 和 task。下面将介绍它们的特点和声明方式,以及它们之间的异同。1. function 和 task的异同特点functiontask执行与消耗不可以内置耗时语句,被调用时是立即返回的,不消耗仿真时间可以内置耗时语句,消耗仿真时间形参变量函原创 2021-12-05 23:26:26 · 2178 阅读 · 0 评论 -
systemverilog-接口interface
文章目录一、为什么使用接口二、测试平台testbench与DUT之间的通信三、modport一、为什么使用接口随着设计的日益复杂,设计中的不同功能的设计会被切割成不同的模块,模块与模块之间通信端口随着设计的复杂程度增加而变得很多,这个时候如果仍然采用每个端口——连接的方式,对代码的维护也变得很困难。接口就起到一根粗电缆线作用,连接这设计与验证环境二、测试平台testbench与DUT之间的通信//子模块module arbiter( output logic [1:0] grant, in原创 2021-12-05 23:24:59 · 604 阅读 · 0 评论 -
systemverilog-数组和队列
文章目录1.定宽数组1.1 定宽数组的声明与初始化1.2 Packed array(合并数组)1.3 Upacked array(非合并数组)2.动态数组3.关联数组4.数组的方法4.1 数组定位方法4.2 数组的排序方法4.3 数组缩减5.队列1.定宽数组Verilog要求在声明定宽数组时必须给出数组的上下界,在system verilog中可以只给出数组宽度。1.1 定宽数组的声明与初始化对于定宽数组采用单引号加大括号来初始化数组**’{ }**可以在大括号前标上重复次数来对多个元素重复赋值原创 2021-12-04 23:08:18 · 3195 阅读 · 0 评论 -
systemverilog-结构体struct
结构体结构体相当于是一组数据类型的封装,是一组变量的集合,可以作为一个整体进行操作;但结构体的功能比类少,所以还不如直接在测试平台中使用类。语法:struct{ int a,b; logic[7:0] add0; logic[23:0] add1;} struct1;struct1 是这个struct的名字,引用变量时的格式为:<struct_name>.<variable_name>对结构体中add1变量进行赋值struct.add1 = 24'hF0000原创 2021-12-04 23:06:20 · 1509 阅读 · 2 评论 -
system verilog-枚举类型enum
学习中,感觉绿皮书中对枚举的介绍不是很详细,有很多疑惑,因此在此对细节总结一下。枚举类型enum是System Verilog中使用频率极高的数据类型之一,验证中作内置判断类型。enum的语法使用typedef便于用户自定义枚举类型的共享使用,可以用一个枚举类型来声明多个变量,如果枚举类型没有伴随typedef,那么该枚举类型是一个匿名枚举类型。1.如果枚举没有初始化,默认是int 型,则从第一个标识符开始,顺次赋给标识符0、1、2 …initial begin typedef enum {s原创 2021-12-04 23:04:07 · 2901 阅读 · 2 评论 -
system verilog-变量类型
1.四值变量与二值变量变量类型分为:四值变量和二值变量四值变量:0、1、x、z四值变量描述reg2bit 主要用在assign语句中,起连接作用,类似金属线wire2bit 主要用在initial和always语句中,对线路建模integer32bit 有符号位time64bitlogic2bit 对reg类型的增强,可以被连续赋值语句驱动,可用在assign、initial、always语句二值变量:0、1二值变量描述原创 2021-12-04 23:03:00 · 820 阅读 · 0 评论