![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
SystemVerilog
文章平均质量分 62
主要介绍SystemVerilog语言的主要用法,语法等内容,还有IEEE SystemVerilog等。
Alfred.HOO
专注于IP和SOC验证
展开
-
systemverilog中立即断言和并发断言
assert原创 2022-07-17 09:17:47 · 2208 阅读 · 0 评论 -
Verilog中reg和SystemVerilog中logic的区别
关于reg和logic的区别,在SystemVerilog验证测试平台编写指南中有所提出原创 2022-07-10 21:08:54 · 2400 阅读 · 0 评论 -
SystemVerilog仿真速率提升
做动态仿真验证通常会遇到要等待仿真结果的情况,特别是在调试某个测试用例的时候。很多时候,工程师们会自然地认为仿真速度大部分依赖于跑仿真任务的服务器本身的性能,以及EDA仿真工具的能力。而实际上,高效的验证环境以及代码质量也是影响仿真速度的关键因素。...原创 2022-06-26 19:15:41 · 578 阅读 · 0 评论 -
【IEEE_SV-7.3】联合体的使用方法
7.3 Unions联合体是一种使用指定成员数据类型,表示可以被访问的单个存储块的数据类型。一次只能使用联合体中的一种数据类型。默认情况下,联合体是非合并的,这意味着没有必要表示该联合体成员的存储方式。动态类型和chandle类型只能在标记的联合体中使用。联合声明的语法见语法7-2。13)当struct或union为合并时,也应使用合并关键字。16)只有在带标签的联合体中声明一个void struct_union_member才是合法的。仅在未合并的结构中声明random_qualifier是合原创 2022-04-10 23:17:51 · 933 阅读 · 0 评论 -
【IEEE_SV-7.1/7.2】结构体的使用方法
7. Aggregate data types7.1 General本条款描述以下内容:— 结构定义和用法— 联合体的定义和使用— 合并数组、非合并数组、动态数组、关联数组和队列— 数组查询和操作方法7.2 Structures结构体表示可以作为一个整体引用的数据类型的集合,或者组成结构的各个数据类型可以按名称引用。默认情况下,结构是非合并,这意味着数据类型有一个依赖于实现的打包。非合并的结构可以包含任何数据类型。结构声明遵循C语法,但在"{"之前没有可选的结构标记。结构声明的语法如语法7原创 2022-04-07 20:37:12 · 692 阅读 · 0 评论 -
SystemVerilog中$sformat和$formatf的用法
systemverilog中sformat和sformatf的用法有哪些?1.基本使用方法首先查看一下这两个函数什么含义。看下这段代码:string inside_string;string outside_string;$sformat(inside_string, “1.value==%0d” , 100);$display(“1.%0s”, inside_string);outside_string=$sformatf(“2.value==%0d” , 100);$display(“2原创 2022-04-05 19:28:55 · 9403 阅读 · 0 评论 -
【IEEE_SV-7.9】关联数组方法汇总
7.9 Associative array methods除了索引操作符,还提供了几个内置的方法,允许用户分析和操作关联数组,以及迭代其索引或键。7.9.1 Num() and size()Num()和size()方法的语法如下:function int num();function int size();Num()和size()方法返回关联数组中条目的数量。如果数组为空,则返回0。int imem[int];imem[ 3 ] = 1;imem[ 16'hffff ] = 2;imem原创 2022-04-05 19:27:51 · 4063 阅读 · 1 评论 -
【IEEE_SV-7.8】关联数组用法
7.8 Associative arrays动态数组对于处理数量动态变化的连续变量集合很有用。当集合的大小未知或数据空间稀疏时,关联数组是更好的选择。关联数组在被使用之前不会分配任何存储空间,并且索引表达式不限于整数表达式,而可以是任何类型。关联数组实现其声明类型的元素的查询表。要用作索引的数据类型用作查找键并强制排序。明关联数组的语法如下:data_type array_id [ index_type ];这里data_type是数组元素的数据类型。可以是适用于固定大小数组的任何类型arra原创 2022-04-05 19:26:44 · 3285 阅读 · 0 评论 -
【IEEE_SV-7.11/7.12】数组查询函数和数组操作方法
7.11 Array querying functionsSystemVerilog提供了返回数组信息的系统函数。这些是left,left,left,right,$low, $high, $increment, $size, dimensions和dimensions和dimensions和unpacked_dimensions。这些函数将在20.7中描述。7.12 Array manipulation methodsSystemVerilog提供了几个内置的方法来方便数组的搜索、排序和缩减。调用这原创 2022-04-05 19:25:37 · 1532 阅读 · 0 评论 -
【IEEE_SV-21.3.3】数据格式化为字符串
21.3.3 Formatting data to a string数据格式化为字符串$swrite任务家族和\$sformat系统任务的语法见语法21-6。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OaxkL6uc-1648898936800)(https://img2022.cnblogs.com/blog/2601779/202204/2601779-20220402190236782-706733908.png)]$swrite任务家族是基于$fwrite原创 2022-04-02 19:29:41 · 570 阅读 · 0 评论 -
【IEEE_SV-9.2】initial、always和final过程语句的用法
9.2 Structured procedures结构化语句SystemVerilog中的所有结构化过程都是在以下结构之一中指定的:—initial过程,用关键词initial表示(参考9.2.1)—always过程,用以下关键词表示:always(参考9.2.2.1)always_comb(参考9.2.2.2)always_latch(参考9.2.2.3)always_ff(参考9.2.2.4)—final过程,用关键词final表示(参考9.2.3)—task—function这原创 2022-02-19 15:59:30 · 2612 阅读 · 0 评论 -
【IEEE_SV-7.10】队列Queues
队列是大小可变,同类元素的有序集合。队列支持对所有元素常量时间访问,常量时间插入和在对列的开始和末尾删除的操作。队列中的每个元素通过一个序号标识,这个序号代表了元素在对列中的位置,0代表第一个元素,$代表最后一个元素。队列是和可以自动增长和收缩的一维的非合并数组类似。因此,与数组一样,可以使用索引、连接、切片操作符语法和相等操作符对队列进行操作。队列与非合并数组使用相同的语法进行声明,但是指定$作为数组的大小。可以通过指定队列的可选右边界(最后一个索引)来限制队列的最大大小。队列的值可以通过赋值形式或非原创 2022-01-16 19:19:43 · 4568 阅读 · 0 评论 -
【IEEE_SV-7.5】动态数组Dynamic arrays
7.5 Dynamic arrays动态数组是非合并数组,它的大小可以在仿真运行时可以被设置或改变。未初始化的动态数组大小是零。动态数组的大小是通过new构造函数或数组赋值设置。动态数组支持所有的数据类型作为元素类型,包括数组。动态数组的维度在数组声明中表示。任何在数组声明中的非合并维度可能是一个动态数组维度。例如:bit [3:0] nibble[]; //4bit向量的动态数组integer mem[2][]; //2个动态integer类型的子数组组成的固定大小的非合并数组注意为了让一个原创 2022-01-16 17:05:14 · 3188 阅读 · 0 评论 -
【IEEE_SV-11.5.1】SystemVerilog中的向量位选择和部分选择寻址
首先说一下SystemVerilog中标量和向量的区别声明为reg、logic或bit(或匹配的用户定义类型或隐式为逻辑)而没有范围规范的数据对象应被视为1位宽,并被称为标量。这些类型之一的多位数据对象应通过指定一个范围来声明,称为向量。向量是标量的压缩数组。11.5.1 Vector bit-select and part-select addressing位选择从向量,压缩数组,压缩结构,参数或拼接从提取特定的位。该位可以使用一个表达式来寻址,该表达式应在一个自行确定的上下文中求值。如果位选择地原创 2022-01-09 21:29:05 · 2159 阅读 · 3 评论 -
SystemVerilog中logic var reg wire的区别
在Verilog中,所有的线网和变量都是使用四态值,因此没必要也不能清晰的区分信号类型。为了增强灵活性,SystemVerilog中定义信号同时具有类型和数据类型两个属性。类型指示信号是属于线网(net)还是变量(var)。SV使用所有的Verilog线网类型,并且没有进行任何拓展。需要注意的是,线网类型必须配合使用四态数据类型,一般情况下省略数据类型,默认为四态。数据类型指示线网或者变量的值系统。对于四态数据类型就是0、1、Z或X,对于两态数据类型就是0或1。关键字logic是一个数据类型。当原创 2022-01-09 19:12:56 · 2339 阅读 · 0 评论 -
【IEEE_SV-6.5】SystemVerilog中的线网和变量的区别和联系
6.5 Nets and variables数据对象有两组:变量和线网。这两组不同之处在于它们被赋值和保持值的方式不同。线网可以由一个或多个驱动连续赋值,原语输出或通过模块输出端口写入。多个驱动的结果值是由线网类型的分辨函数决定。线网不可以使用过程赋值。如果端口一侧的线网被另一侧的变量驱动,则里面隐含了一个连续赋值。force语句可以覆盖线网的值。当释放的时候,线网的值返回为原来的值。变量可以由一个或多个过程赋值,包括过程连续赋值写入。最后写的值决定了变量里面最终的值。或者,变量可以被一个连续赋值或一原创 2022-01-09 18:29:45 · 869 阅读 · 0 评论 -
SystemVerilog中字符串String类型的基础知识(一)
1.字符串变量的长度是字符串中字符的个数。2.字符串类型的变量是动态的,因为他们的长度在仿真的过程中可能发生变化。3.通过对字符串变量的索引,可以对字符串中的单个字符读或写。4.字符串的行为类似于长度为8bits倍数的packed arrays.5.赋给不同大小的整型变量的packed arrays的字符串要么被截断为变量的大小,要么在必要时在左边用0填充。6.字符串数据类型的变量可以是任意长度。7.当将字符串赋给字符串类型或在字符串类型操作数的表达式中使用时,字符串字面值会隐式转换为字符串类型原创 2021-12-20 22:53:15 · 8868 阅读 · 0 评论 -
systemverilog中门类型-2-双向通过开关bidirectional pass switches
双向通过开关主要有tran/rtran/tranif0/tranif1/rtranif0/rtranif1当tranif0,tranif1, rtranif0, or rtranif1设备关闭时,它们应该阻塞信号。当打开时,它们应该通过信号。而tran and rtran 设备不能被关闭,它们一直通过信号。实例tranif1声明语法:tranif1 t1 (inout1,inout2,control);1.延迟规格The delay specifications for** tranif1, tr原创 2021-11-01 22:53:28 · 4922 阅读 · 0 评论 -
systemverilog中门类型-1-三态门three state gates
三态门主要有bufif0/bufif1/notif0/notif1三态门使能们实例声明语法:gate_instantiation ::= enable_gatetype [drive_strength] [delay3] enable_gate_instance { , enable_gate_instance } ;enable_gatetype ::= bufif0 | bufif1 | notif0 | notif1enable_gate_instance ::= [ name_of_inst原创 2021-10-31 18:43:42 · 3214 阅读 · 1 评论 -
systemverilog中进程管理-2-线程的停止
你需要在测试平台中创建线程,也会需要停止线程。verilog中的disable语句可以用于停止systemverilog中的线程。SystemVerilog提供了两大类process的控制方式,分别为wait和disable。disable语句常用的多种方式包括:disable block_name、disable task_name和disable fork等,调用disable语句将会终止指定的进程。1.利用disable block_name停止一个线程initial begin beg原创 2021-10-31 16:40:45 · 2651 阅读 · 0 评论 -
systemverilog中进程管理-1-线程的发起
在实际的硬件中,时序逻辑通过时钟沿来激活,组合逻辑的输出则随着输入的变化而变化。所有这些并发的活动在verilog的寄存器传输级上是通过initial和always块语句,实例化和连续赋值语句来模拟的。每个线程总是会跟相邻的线程通信。systemverilog中常见的线程间的通信有标准的verilog事件event,事件控制@,wait语句,systemverilog信箱和旗语等。线程是可以独立运行的程序。线程的理解:1.线程需要被触发,可以结束或者不结束;2.在module中的 initial原创 2021-10-31 16:39:38 · 312 阅读 · 0 评论 -
systemverilog中输入/输出系统任务和系统函数---$sformat和$sformatf使用方法及其区别
文件I/O任务和函数(IEEE Standard for SystemVerilog—21)将数据格式化为字符串(IEEE Standard for SystemVerilog—21.3.3)variable_format_string_output_task$sformat ( output_var , format_string [ , list_of_arguments ] )1、系统任务$sformat与系统任务$write相似,但是有一个主要的不同。2、与输出系统任务$display和$原创 2021-10-24 21:27:00 · 7782 阅读 · 0 评论 -
systemverilog中位向量系统函数---$countbits/$countones/$onehot/$onehot0/$isunknown
systemverilog中位向量系统函数有如下五个:1、$countbits ( expression , control_bit { , control_bit }此函数$countbits()的作用是计算位向量中指定的0 1 x z的数量;返回值位一个整数,这个整数就是指定的control_bit的数量。例如:$conutbits(expression, '1),返回表达式中1的数量;$countbits(expression, '0, '1),返回表达式中0和1的数量;$countbit原创 2021-10-24 19:09:11 · 9726 阅读 · 0 评论 -
sysytemverilog中系统函数$test$plusargs与$value$plusargs的用法
systemverilog可以采用define与parameter等方式定义变量,但是需要在编译前完成变量的定义,编译之后不能修改。当需要改变编译条件时,经常需要重新编译。并且一旦编译通过,在编译阶段指定的宏定义在整个仿真运行过程中一直有效,因此,如果需要修改宏定义,则需要重新进行编译,从而降低了仿真的效率。为此,可以使用testtesttestplusargs和valuevaluevalueplusargs进行解决,该函数的调用发生在仿真运行(run)阶段。这样仅需要对设计进行一次编译即可。从而实现在不原创 2021-10-24 15:36:05 · 487 阅读 · 0 评论 -
systemverilog中的函数function和任务task
在verilog中,任务task和函数function之间有明显的区别,例如任务可以消耗时间而函数不能,函数里面不能带有诸如#100的时延语句或诸如@(posedge clock)、wait(ready)的阻塞语句,也不能调用任务,还有verilog中的函数必须有返回值,并且返回值必须被使用,例如用到赋值语句中。关于verilog中任务task和函数function的具体用法和区别参考我写过的一篇文章;verilog中的任务task和函数function用法及区别systemveilog中函数和任务的原创 2021-10-24 12:58:38 · 4895 阅读 · 0 评论 -
systemverilog中$cast类型向下转换和虚方法
当使用继承来扩展类的功能的时候,需要一些OOP技巧来控制对象和功能。如果将子类句柄赋值给父类句柄时,编译器则认为赋值是合法的,但分别利用子类句柄和父类句柄调用相同对象的成员时,将可能有不同的表现。例如:class Transaction; rand bit [31:0] src; function void display(input string = ""); $display(%s Transaction: src = %d", prefix, src); endfunctionend原创 2021-10-22 21:59:32 · 550 阅读 · 0 评论 -
systemverilog、c、verilog与systemc之间的相互调用方法
第一种,verilog中调用c函数verilog通过PLI(Program Language Interface)调用c函数。这些用户定义的系统任务和函数的名称必须以美元符号"$" 开头。大家用得比较多的PLI函数有$display, $finish等。例如:c函数如下:#include <stdio.h>void hello () { printf("\nHello, world\n");}调用c函数的verilog代码如下:module hello_verilog ();原创 2021-10-21 23:04:27 · 3671 阅读 · 2 评论 -
systemverilog中常见的数据类型
systemverilog中数据类型二值逻辑:byte/int/shortint/longint/ bit四值逻辑:integer/ logic/reg/net-type(wire、tri)有符号:byte/int/shorting/longint/integer无符号:bit/logic/reg/net-type(wire、tri)二值有符号:byte/int/shortint/longint二值无符号:bit四值有符号:integer四值无符号:logic/reg/net-typ原创 2021-10-20 22:07:55 · 1161 阅读 · 0 评论 -
systemverilog中隐式转换和显式转换(静态转换和动态转换)
systemverilog中隐式转换和显示转换(动态转化和静态转换)显式转换包含动态转换和静态转换动态转换:例如 unsigned’(signed_vec)静态转换:例如 $cast(target, source)这两种转换均需要操作符号和系统函数介入,因此称为显示转换;以下转换没有操作符号和系统函数接入,因此称为隐身转换;logic [3:0] x_vec = 'b111x;bit [2:0] b_vec;b_vec = x_vec; 上面转换中由四值无符号类型转换为二值无符号类型,结果原创 2021-10-20 21:59:48 · 1610 阅读 · 0 评论 -
systemverilog中automatic的用法
verilog在20世纪80年代被创建的时,最初的目的用来描述硬件。**因此语言中的所有对象都是静态分配的。**特别是,子程序参数和局部变量是被存放在固定位置的,而不像其他编程语言那样存放在堆栈区里。在verilog-1995中,如果你试图在测试程序里的多个地方调用同一任务,由于任务里的局部变量会使用共享的静态存储区,所以不同的线程之间会窜用这些变量。在verilog-2001中,可以指定任务、函数和模块使用自动存储,从而迫使仿真器使用堆栈区存储局部变量。systemverilog中module,pr原创 2021-10-18 07:27:12 · 5214 阅读 · 1 评论 -
systemverilog中ref的用法
ref是对变量(不能是net)的应用,它的值是该变量最后一次赋的值。如果将一个变量连接到多个ref端口,就有可能产生竞争,因为多个模块的端口都有可能更新同一个变量。input端口是输入端口;output是输出端口;还有inout端口。inout端口用于双向连接。如果使用多个inout端口驱动一个信号,sv将会根据所有驱动器的值,驱动强度来计算最终的值。1122...原创 2021-10-18 07:26:37 · 6416 阅读 · 1 评论 -
systemverilog中线程间通信方法---事件event/旗语somaphore/信箱mailbox
测试平台中的所有线程都需要同步并交换数据。例如在最基本的层面,一个线程等待另一个,多个线程可能会同时访问同一资源;在最高的层面上,线程间需要彼此交换数据。systemverilog线程间的通信有三种:1)事件 event在verilog中,当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争的可能性便出现了。如果触发线程先于阻塞线程,则触发无效。systemverilog引入了triggered()函数,可用于查询某个事件是否触发,包括在当前的时刻。线程可以等待这个函数的结果,而原创 2021-10-18 14:52:25 · 1488 阅读 · 0 评论 -
systemverilog中rand机制的 $urandom_range()函数
使用SystemVerilog中的rand机制, 经常会用到$urandom_range()这个函数, 得到一个无符号的整型数.语法:$urandom_range(int unsigned maxval,int unsigned minval = 0);有两个参数,一个上限参数和一个可选的下限参数。功能:返回一个在maxval和minval之间的无符号整数example:val = $urandom_range(7,0); //结果是[0,7]val = $urandom_range(0,7)原创 2021-10-17 10:55:41 · 10374 阅读 · 0 评论 -
systemverilog中@和wait的区别
在SystemVerilog中,用来触发事件时,使用->;用来等待事件使用@或者wait。那么@和wait有什么区别呢?在Verilog中当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争就出现了。如果触发线程先于阻塞线程,则触发无效(触发是一个零宽度的脉冲);例如:verilog中使用@等待某个event产生竞争`timescale 1ns/10fsmodule event_test(); event a; //使用关键字event来声明一个事件a i原创 2021-10-17 10:45:58 · 4580 阅读 · 0 评论 -
systemverilog中创建线程的方法fork join/join_any/join_none以及区别
测试平台通过已有的结构如事件、@事件控制、wait和disable语句、以及新的语言元素(如旗语和信箱),来实现线程间的通信、同步以及线程的控制。标准的Verilog对语句有两种分组方式,使用begin…end或fork…join。begin…end中的语句以顺序方式执行,而fork…join中的语句则以并发的方式执行。后者的不足必须等fork…join内所有语句都执行完后才能继续块内后续的处理。因此verilog测试平台中很少用法它。SystemVerilog引入了两种新的创建线程的方法,使用fo原创 2021-10-17 09:41:45 · 833 阅读 · 0 评论 -
systemverilog中new()和new[]有什么区别?
在systemverilog中new()和new[]有什么区别?new()为一个对象分配空间,初始化变量,并返回保存对象的地址。new[]设定动态数组的大小。动态数组在编译时不知道元素个数,也就是数组的宽度,在运行仿真才知道。相同点:他们都申请内存并且初始化变量。不同点:最大的不同在于调用new()函数仅创建了一个对象,而new[]操作则建立一个含有多个元素的数组。例如:new()用在systemverilog中OOP的构造函数;构造函数除了分配内存外,还初始化变量,在默认情况下,将变量设置成原创 2021-10-17 09:17:56 · 3647 阅读 · 1 评论