SystemVerilog 语言编程
文章平均质量分 71
此专栏会不定期更新,旨在帮助刚入行的同仁,以及基本功欠缺的同仁,夯实基础,从归纳和总结对比中,掌握学习和理解Systemverilog 这门编程语言。希望对大家有所帮助!
那么菜
仗剑天涯,谁来也不怕
展开
-
SystemVerilog/Verilog中的仿真延时建模之门延时
提到门延时,就必须重提分布延迟。分布延迟指模块内信号从(或者(今天我们着重看门延迟。如果信号从0/1/z变化到x,那么此时的门传输延迟为上述三种延迟最小的.另外,在进行仿真时,有些逻辑门的输出不可能会出现高阻态z,所以对于这些逻辑门实际上就不存在关断延迟了,类似的逻辑门有:and、nand、、nor、xor、xnor、buf和not等。并且这两种形式结合不同的延迟类型经常会混合使用。原创 2024-05-08 11:28:35 · 1018 阅读 · 0 评论 -
SystemVerilog/Verilog中的仿真延时建模之模块路径延时(specify)
并行连接表示每条延迟路径只有一个源端和目的端,其语法格式如下:(=>) =;其中delay_value可以为1~3个延迟量表达方式,延迟量也可以采用"最小值:典型值:最大值"的形式,如果延迟量多于两个,则可以使用小括号将延迟量包括其来,延迟量之间用逗号分隔.一般只包含*>和=>连接的路径,在其中仅描述简单的源端到目的端的延迟,属于基本模块路径延迟表示形式.原创 2024-05-08 12:08:53 · 1058 阅读 · 0 评论 -
浅谈芯片验证中的仿真运行之 timescale (三)小兵大将
不小看任何一个小问题,有时候,绊住你的可能是一个小小的微不足道。前两小节,我们简略的讲述了timescale 这个关键字,大家觉得怎么样?是不是还算简单。可不要骄傲哦。来道题试试看!原创 2022-01-27 20:03:37 · 981 阅读 · 0 评论 -
浅谈芯片验证中的仿真运行之 timescale (五)提防陷阱
在module a中定义的变量 t1=5us ,在a的timescale 1ns/1ps下,会被解析成5000,原因就是*细节点中提到的,“若指定单位,则仿真工具会转化为当前仿真单位的数值”,当前仿真单位是ns,所以"5us"会被解析成"5000"这个“数”。在timescale 1ps/1fs中,结果是clk每隔1fs 翻转一次(内部执行:首先将500改写为500ps, 然后将500ns改写为500000ps, 相除,结果为0.001ps, 等于1fs, 那么1fs 翻转一次)原创 2024-07-20 11:22:57 · 599 阅读 · 0 评论 -
#systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
仿真调度系列文章,已经编写10篇,写到这里,相比大家都已经对VCS仿真工具的运行机制,有了大体了解。学无止境,而且真正的仿真调度行为控制,是每个EDA厂商自己产品的高度机密。言外之意,我们要抱着谦虚的态度说:我们只是懂了一点点。原创 2024-07-20 09:39:22 · 301 阅读 · 0 评论 -
【开天辟地】SystemVerilog中task和function的生命周期属性(一)递归视角
本节,主要探讨systemverilog语言中task和function关键字生命周期属性问题。原创 2022-06-17 15:16:51 · 837 阅读 · 0 评论 -
【开天辟地】SystemVerilog中task和function的生命周期属性(二)重入视角
在上一篇文章,我们从递归函数的角度视野,首先在verilog语言中分析这个棘手的递归问题,分析了现象是如何发生的。而后在systemverilog 原因中,通过具体的例子,讲述如何避免这个问题。有人会说,现在的仿真验证平台都是UVM的,这些问题或许在SV仿真平台中更多会遇到,大可不必研究。话不能说那么满,有些时候,在UVM平台中,充分借鉴SV平台的一些优点,可以快速的解决一些问题,倘若通过UVM机制,或许比较麻烦。......原创 2022-06-18 21:57:33 · 771 阅读 · 0 评论 -
【盘古醒来】仿真平台中的几个关键字层次关系梳理
上面的图示中,一定程度上诠释了,各个层次的引用关系。比如,在module中,我们可以创建module,program,interface,变量等等,但是不是绝对包含所有的从属关系。接下来的几篇文章,将依据该图示,进行一一讲解。...............原创 2022-06-16 16:34:29 · 578 阅读 · 0 评论 -
#systemverilog# 之 event region 和 timeslot 仿真调度(九)assign 赋值 和 always 组合赋值的调度区别
有时候,我们会发现一个问题,举个最简单的例子:比如将两个信号进行简单的异或运算。该逻辑运算,我们可以使用 assign 数据流建模完成,也可以使用always 组合逻辑过程赋值语句实现。load_3 : load_0 更新在active region, 而 load_2 更新在 NBA region, 那么 当执行语句。load_3 发生在 Active region 和 NBA region。load_3_1数据的更新发生在两个 Active region。不慌,今天,我们举个例子,来验证这一点。原创 2023-09-04 22:47:09 · 346 阅读 · 0 评论 -
#systemverilog# 之 event region 和 timeslot 仿真调度(八)assign 赋值必在Active域调度?
仿真调度原创 2023-08-27 23:05:39 · 453 阅读 · 0 评论 -
#systemverilog# 之 event region 和 timeslot 仿真调度(七)Active/NBA 咋跳转的?
激活后,发现均是非阻塞赋值,那么非阻塞赋值的左侧变量更新,肯定是在下一个NBA 域,也就是NBA(2),因为没有Active(2) 存在,所有 NBA(2)紧挨着NBA(1)出现。在NBA(1) 和 NBA(2)中间,没有active(2) 出现,大家不要固性思维,觉得每个调度域,会按照Active -> NBA 这样完整的跳转运行。其实,该电路非常简单,恰好在NBA(1) 和 NBA(2) 之间,没有相应的Active(2) 事件进行调度,所以也就没有展示出Active(2) 域。这样解释,应该合理吧。原创 2023-08-27 22:41:50 · 985 阅读 · 0 评论 -
#systemverilog# 之 event region 和 timeslot 仿真调度(六)疑惑寄存器采样吗
想必大家在刚开始尝试写Verilig HDL代码的时候,都是参考一些列参考代码,有些来自于参考书,有些来自于网上大牛的笔记,甚至有写来自于某宝FPGA开发板的授权代码。我们发现,由于clk_div2_nonblk 采用的非阻塞赋值,那么其变化区间,应该是位于clk 的变化区间的下一个紧挨着NBA 域。这里,我们再新增一个时钟,该时钟也是clk 的二分频,但是代码采用的非阻塞赋值的方式,具体代码如下。这里,我们新增一个时钟,该时钟是clk 的二分频,但是代码采用的阻塞赋值的方式,具体代码如下。原创 2023-08-26 21:14:44 · 786 阅读 · 0 评论 -
#systemverilog# “类”翱翔在systemverilog的天空(Ⅱ)关于理解new() 和 super.new() 函数
/ 通过调用我们自己写的构造函数 function new()...endfunction: new 函数,首先创建一个 transaction 对象并为其分配空间, 其次初始化变量,最后返回对象入口地址给句柄。指针的内容是一个地址。在类“base”中,我们定义了它的构造函数new(),一个简单的$display语句。super.new( ): 继承类中new()函数默认一开始就会调用其父类中的new()函数(super.new( )).在本例中,我们在new函数中传递参数data,以初始化类中的变量。原创 2023-08-06 13:40:26 · 640 阅读 · 0 评论 -
#systemverilog# 说说Systemverilog中《ref》那些事儿
草稿#systemverilog# 说说Systemverilog中《ref》那些事儿草稿#systemverilog# 说说Systemverilog中《ref》那些事儿草稿#systemverilog# 说说Systemverilog中《ref》那些事儿草稿#systemverilog# 说说Systemverilog中《ref》那些事儿草稿#systemverilog# 说说Systemverilog中《ref》那些事儿草稿#systemverilog# 说说Systemverilog中《ref》那些原创 2023-08-06 10:43:28 · 503 阅读 · 0 评论 -
#systemverilog# 说说Systemverilog中《automatic》那些事儿(关于for循环+fork...join_none相结合变量应用研究)
相反,声明在fork...join_none 内部二级作用域的自动变量或者普通变量,线程结束之后,变量也就不复存在,不可以被上一级的线程继续使用。今天,我们谈谈另一个问题,也是应用比较多的场合:在for循环+fork...join_none 发起线程的时候,相关自动变量的如何使用问题。如果我们实际使用过程中,不将 变量 j 声明为 automatic 类型,那么fork...join_none 发起的线程中,j 是无法得到不同 i 变量数值的。那总有什么区别之处吧?可是,实际场合,我们会发现如下的用法。原创 2023-08-05 07:41:41 · 566 阅读 · 0 评论 -
#systemverilog# 说说Systemverilog中《automatic》那些事儿(关于for循环内置变量研究)
上面的截图,是来自于前面的文章,当时留下的疑问,今天和大家是实践一下小细节问题。原创 2023-07-29 10:08:35 · 271 阅读 · 0 评论 -
#systemverilog# 说说Systemverilog中《automatic》那些事儿
前面我们学习了有关systemverilog语言中有关《static》的一些知识,同static 关系比较好的哥们,那就是 《automatic》。今天,我们了解认识一下。原创 2023-07-29 07:50:43 · 747 阅读 · 0 评论 -
#systemverilog# 说说Systemverilog中《static》那些事儿(内存管理篇2)
一、C语言的内存分配C语言主要分为:BSS、Data、Text、Heap(堆)、Stack(栈)静态内存分配:BSS、DataBSS段Data段程序执行代码:TextText段动态内存分配:Heap(堆)、Stack(栈)Heap(堆)堆扩张堆缩减Stack(栈)栈栈示例。原创 2023-07-28 20:03:10 · 176 阅读 · 0 评论 -
#systemverilog# 说说Systemverilog中《static》那些事儿(内存管理篇1)
其实,绿皮书中也曾提到:自动的内存管理系统是SystemVerilog的整体组成部分。对象、字符串、动态数组、以及联合数组的内存是动态分配的。当创建对象的时候,SystemVerilog会分配更多的内存。当对象不再需要的时候,SystemVerilog自动地释放内存以便这些内存能够被重新使用。。如果没有自动的内存管理,SystemVerilog的多线程、重进入环境会增加许多导致用户出错的机会。一个手工的内存管理系统(就像C语言的malloc和free所提供的那样)是不够的。fork // 主线程。原创 2023-07-28 19:43:13 · 247 阅读 · 0 评论 -
草稿#systemverilog# 说说Systemverilog中《static》那些事儿(生命周期属性篇)
其实将一个任务函数或块声明成static或者automatic还是为了决定其内部数据的生命周期属性,这与静态方法的static有本质上的不同。注意第二句话"具有自动变量生命周期的静态方法",也就是说这个任务虽然是静态任务,但是其内部数据的缺省情况下的生命周期是自动的。原创 2023-07-27 23:23:49 · 430 阅读 · 0 评论 -
#systemverilog# 说说Systemverilog中《static》那些事儿(实战篇)
在上一篇文章《文章中,从理论上,阐述了static 和automatic 关键字的概念,我们从理论学习上,想必大家都有了自己的认识。今天,我们实战角度,通过最简单的例子,讲述这些用法,方便大家有更深刻的理解。原创 2023-07-27 22:28:05 · 310 阅读 · 0 评论 -
#systemverilog# 说说《队列》那些事儿
最近不断使用到systemverilog 语言编程中的队列语法。今天抽时间,尽肯能全的整理一下队列的相关用法,一是加固基础打牢,而是在代码编写过程中,提高代码水平。队列是一种复合数据结构,可以用来存储多个数据的容器,但同时又拥有自己的优势特性。正如绿皮书所言,队列的引入,使得SV语言在建模时,更加灵活自如,它在功能上同时兼容了动态数组和链表。可以随意插入元素,可以随意弹出元素。另外,队列还提供了许多内建方法。队列不需要new 方式创建。原创 2023-07-25 22:57:38 · 533 阅读 · 0 评论 -
#systemverilog# 关于关键字 之 event 了解这些够了(二)->和 ->> 区别
在上一篇文章,我们学习了event 的相关语法和举例,清晰的说明了具体场合的使用规则。今天,我们着重看一下 -> 和 ->> 的区别,进而在以后的工作过程种,能为大家带来一些便利。使 用 -> 要特别注意:等待事件和触发事件的先后顺序。这种问题尤其在 同一个 time-slot 场景,对顺序要求特别注意。可以看出,触发a 事件的时候,等候事件@a 并不在其对象序列中,错失良机。那么 ->> 呢,我们看看。原创 2023-07-16 12:13:24 · 730 阅读 · 0 评论 -
#systemverilog# 关于关键字 之 event 了解这些够了(一)
触发机制:-> 、->>等待机制:@、wait(event.triggered)、wait_order(ev1,ev2,ev3...)综上示例,@和wait都可以有效的阻塞事件,如果触发线程和阻塞线程在同一时刻发生,则使用wait(event_name.triggered)的线程会被触发,结束阻塞,而使用@event的线程则不会被触发,处于阻塞状态。原创 2023-07-16 11:39:21 · 676 阅读 · 0 评论 -
#systemverilog# 进程控制问题#(五)关于 disable fork陷阱篇3
今天,我们以几个例子的形式,展示fork..join/join_any/join_none + disable fork 语句的组合方式,分别查看了仿真结果。其实,实际应用中,更多的场合是 使用 fork...join_none/join_any + disable fork 组合的方式。这一点,大家一定要注意。另外,我们通过最后一个例子,也通过实践,加强了对前面文章《#systemverilog#进程控制问题#(六)进程监视》中讲述的内容的理解。原创 2023-07-15 17:28:38 · 751 阅读 · 0 评论 -
#systemverilog# 进程控制问题#(五)关于 disable fork陷阱篇1
请注意一种特殊情况:当begin...end 嵌套与 fork...join 中时,且他们之间没有其它任何额外进程,此时begin...end 中的语句还是顺序执行,此时相当于一个单进程。此例子就是一个典型的顺序块和并行块混合的例子。仿真结果: 只有thread_2_2_1 和 thread_2_2_2_1 线程被killed, 其它正常运行和退出。此例子就是一个典型的顺序块和并行块混合的例子。动态进程:fork...join_any 、fork...join_none 发起;原创 2023-07-09 22:45:36 · 651 阅读 · 0 评论 -
#systemverilog# 进程控制问题#(三)wait fork 最全使用场景及分析总结(续)
前面,对wait fork 的使用场景,进行了系统的分析和总结。不过在实际应用过程中,发现了一些问题,今天展示给大家,共商大计!原创 2023-07-08 16:02:10 · 597 阅读 · 0 评论 -
#systemverilog#进程控制问题#(六)进程监视
当再次经过100个timeunit时,调用kill()终止了process_2的继续执行,从这里可以看出,要终止一个进程,除了disable、disable fork之外,还可以调用process.kill()。调用status()可以获取到process_1和process_2进程的执行状态,在100个timeunit的时候,process_1已经执行结束,而process_2则处于阻塞状态;图9展示了这三个method的用法,通过self()获取进程的句柄,然后传递给定义的两个process类;原创 2023-07-07 22:07:42 · 331 阅读 · 0 评论 -
#systemverilog#进程控制问题#(二)终止进程
上图中,例子包含3个event,3个event分别在3个并发进程中进行触发,event_1在第50个timeunit被触发,event_2在第30个timeunit被触发,event_3在第100个timeunit的时候被触发。这句话该怎么理解呢?这两种block都是工程项目中常用的block,但是,大家可能都不知道block也是可以命名的,就像我们每个人的名字一样,名字是我们每个人的一个标识。其中,proc_4子进程中还含有一个子进程proc_4_1,此进程就是initial语句块的子进程的子进程。原创 2023-07-07 22:06:05 · 320 阅读 · 0 评论 -
#systemverilog# 关于随机约束之 约束块
声明约束块的语法如下:是约束块的名字。使用constraint_mode()(参见12.8节)方法,这个名字可以用来使能或关闭一个约束(2)是一个表达式语句的列表,它用来限制一个变量的取值范围或者定义变量间的关系。是任意SystemVerilog表达式,或者是约束专用操作符->和dist(参见12.4.4节和12.4.5节)中的一个。函数可以具有某种限制(参见12.4.11节)。不允许使用具有边带效应的操作符,例如++和--。原创 2023-07-02 21:49:27 · 397 阅读 · 0 评论 -
#systemverilog# 关于随机约束之 概述
约束驱动的测试生成方法使得用户能够自动地为功能验证产生测试。随机约束测试比一个传统的、直接的测试方法更有效率。通过通过指定约束,我们可以很容易地为难于到达的边界条件产生测试。SystemVerilog允许用户以一种紧凑、明了的方式指定约束。约束接下来会被一个求解器处理,这个求解器用来产生满足约束的随机值。典型情况下,随机约束在一个面向对象的数据对象之上指定。它将需要被随机化的数据建模成包含随机变量和用户定义约束的对象。约束确定了可以被赋值给随机变量的有效值。class Bus;endclassus。原创 2023-07-02 20:59:59 · 256 阅读 · 0 评论 -
#systemverilog# 关于打印数据格式控制及特殊字符
转义字符“%”后跟格式说明字符用于指定输出打印格式,除了(%m, %l, and %%)以外,每个%所指定的输出打印格式在后面都应该有一个对应的表达式参数,当存在多个格式说明的时候,格式说明与表达式参数按位置关系形成一一对应。其中%u不区分’x’和’z’数据,并将其映射为’0’;%z严格区分x和’z’数据,将其分别映射为’x’,‘z’。(2)‘%m’和‘%l’ 分别可以显示打印语句所在当前模块的模块名,和该模块所在的仿真所构建的运行库路径信息,对于调试跟踪来说非常有用,其效果参见以下代码例。转载 2023-07-02 15:37:44 · 705 阅读 · 0 评论 -
#systemverilog# 关于关键字 之 unique 分支执行结构
使用关键字unique定义的SystemVerilog约束称为唯一约束。在随机化中,使用唯一约束可以生成变量集的唯一值或数组的唯一元素。在变量之间生成唯一的值在数组中生成唯一元素(固定大小数组、动态数组、关联数组和队列)原创 2023-06-04 21:31:07 · 620 阅读 · 0 评论 -
#systemverilog# 关于随机约束之 unique 关键字
在随机约束中,我们可以使用关键字 unique。使用关键字unique定义的SystemVerilog约束称为唯一约束。在随机化中,使用唯一约束可以生成变量集的唯一值或数组的唯一元素。这里着重解释一下变量集:是同一类型随机变量的集合。在unique 定义的变量集内,生成唯一的随机数值在数组中生成唯一元素,数组包括:固定大小数组、动态数组、关联数组和队列。原创 2023-07-02 12:34:36 · 1543 阅读 · 0 评论 -
#systemverilog# 之 event region 和 timeslot 仿真调度(三)Verdi 辅助查看
通过今天的学习,我们知道:event region 是event sequence 的全集。我们打开了 event region feature 也就开启了event sequence 的功能。原创 2023-06-17 11:34:23 · 744 阅读 · 0 评论 -
#systemverilog# 关于流操作符>>和<<引发的思考
对于流操作符,相比大家都不陌生,在实际项目中运用特别广泛。今天我们通过几个小例子,来回顾和深层认识一下该操作符。概念流操作符(bit-stream),表示方式为{>>{}}和{原创 2023-06-07 22:11:31 · 2132 阅读 · 0 评论 -
#systemverilog# 关于关键字之 priority 分支执行语句
另一篇介绍unique if的文章(Link)原创 2023-06-04 21:37:04 · 150 阅读 · 0 评论 -
#systemverilog# 关于关键字 之 参数:parameter、specparam、localparam
在Verilog中,parameter既不属于变量范畴也不属于线网范畴,经常用来定义一个标志符代表一个常量,所以参数的值在仿真运行的过程中不能进行修改。但是通过使用参数,可以提高程序的可读性、可复用性和可维护性。目前常用的参数主要分为两大类:module参数:parameter、localparamspecify参数:specparam在使用参数时还需要注意以下几点:parameter、specparam、localparam必须在elaboration阶段有确定的值;原创 2023-05-28 21:45:20 · 1331 阅读 · 0 评论 -
#systemverilog# SV验证语言的数据类型总结
typedef语句可以用来创建新的类型,可以把parameter和typedef语句放到一个程序包package里,以使它们能被整个设计和测试平台所共用,用户自定义的最有用的类型是双状态的32比特的无符号整数,在测试平台中,很多数值都是正整数,例如字段长度或事务次数,所以把对uint的定义放到通用定义程序包中,这样就可以在仿真程序的任何地方使用它。转载 2023-05-28 10:40:15 · 693 阅读 · 0 评论 -
#systemverilog# 之 event region 和 timeslot 仿真调度(五)实战
经过之前文章的学习,想必大家对systemverilog 仿真调度的理解,应该八九不离十了。今天,我们结合实际中的例子,来实战一下,对之前的理解,做一个考核。我们拿《UVM实战》中的2.2.1章节的例子,来讲解。原创 2023-05-17 20:53:26 · 706 阅读 · 0 评论