SystemVerilog 中的随机化激励
- 格式:pdf
- 大小:159.06 KB
- 文档页数:7
一个牛人的S y s t e m v e r i l o g总结 Prepared on 22 November 2020S y s t e m v e r i l o g 数据类型l合并数组和非合并数组1)合并数组:存储方式是连续的,中间没有闲置空间。
例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个32bit的数据。
表示方法:数组大小和位,必须在变量名前指定,数组大小必须是【msb:lsb】Bit[3:0] [7:0] bytes;2)二维数组和合并数组识别:合并数组:bit [3:0] [7:0] arrys;大小在变量名前面放得,且降序二维数组:int arrays[0:7] [0:3] ;大小在变量名后面放得,可降序可升序位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素个数。
3)非合并数组一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。
非合并数组:字的地位存放变量,高位不用。
表示方法:Bit[7:0] bytes;4)合并数组和非合并数组的选择(1)当需要以字节或字为单位对存储单元操作。
(2)当需要等待数组中变化的,则必须使用合并数组。
例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。
Bit[3:0] [7:0] barray[3]; 表示合并数组,合并数组中有3个元素,每个元素时8bit,4个元素可以组成合并数组可以使用barry[0]作敏感信号。
l动态数组随机事物不确定大小。
使用方法:数组在开始是空的,同时使用new[]来分配空间,在new[n]指定元素的个数。
Int dyn[];Dyn = new[5];Ref int array[ ]);If(len<0)begin$display(“Bad len”);Returun;rant,.request,.rst,.clk);Test t1(arbif);EndmodulelModport背景:端口的连接方式包含了方向信息,编译器依次来检查连续错误;接口使用无信号的连接方式。
SystemVerilog语言简介SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。
SystemVerilog由Accellera开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。
下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。
1. 接口(Interface)Verilog模块之间的连接是通过模块端口进行的。
为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。
不幸的是,在设计的早期,我们很难把握设计的细节。
而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。
另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。
SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。
接口在关键字interface和endinterface之间定义,它独立于模块。
接口在模块中就像一个单一的端口一样使用。
在最简单的形式下,一个接口可以认为是一组线网。
例如,可以将PCI总线的所有信号绑定在一起组成一个接口。
通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。
随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。
当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。
下面是一个接口的使用实例:实际上,SystemVerilog的接口不仅仅可以表示信号的绑定和互连。
SystemVerilog for Testbench1、并发性和控制(Concurrency and Control)并发(Concurrency)可以允许你从一个父进程中同时运行多个并行的进程。
它给你的需要执行并行的验证环境带来更多的主动性和灵活性。
一个典型的例子是,给设计加激励,之后检查并行的结果。
这使你的tb能及时果断地作出反应,以便修改激励(甚至在模拟完也可)。
用fork-join结构来实现并发(Concurrency)。
父进程的join-back依赖于并行进程是否完成。
Mailbox:对于进程内部的通信,一种叫做mailbox的结构允许任何进程将消息发送到其他的任何进程。
接受的进程也能够使用wait命令和发送的进程来同步。
Semaphores:信号量(semaphores)是为了防止一个资源被许多个并行的进程争抢的情况。
比如在一个信号在任何时刻只能有一个进程执行它。
Events:进程中的事件(events)用 -> 操作符来触发。
这些被触发的事件被其他的进程用事件控制结构来接受,为的是使得触发进程同步。
2、带约束的随机激励(Random Stimulus Generation with Constraints)验证的过程是要证明你的设计是全面测试过的。
随机激励确保测试角落情形的到达和测试。
这是一个重要的组成部分,以确保验证的时间和精力是最有效的方式进行的。
SystemVerilog提供一个非常强有力的机制来产生随机刺激。
它是基于类的对象(class-object)随机化,这意味着一个类的对象随机变量自动通过调用预定义的随机方法与对象相关联。
约束(Constraints)进一步增强随机化的功能。
他们有两个主要优点:(1)您可以添加任意权重的刺激,使某些激励信号比其他的信号更频繁地产生,也就是你可以设置一个激励产生的分布函数,(2)您可以使用现有的设计来改变这种状态权重,从而为下一个状态做限制。
systemverilog验证方法SystemVerilog验证方法引言在现代芯片设计中,验证是一个非常重要的环节。
SystemVerilog 是一种常用的硬件描述语言,有许多验证方法可以帮助设计人员有效验证设计的正确性。
本文将详细介绍一些常用的SystemVerilog验证方法。
1.仿真验证方法•使用仿真工具进行功能验证–利用Simulator工具来模拟设计行为以进行功能验证。
验证工程师可以编写testbench来生成输入数据,驱动设计的输出,并进行断言验证。
–通过创建各种激励来测试设计中的不同情况,包括边界情况、异常情况和极端情况等。
•波形分析验证–利用仿真工具生成波形,并分析波形来验证设计的正确性。
可以检查信号的时序关系、逻辑等,并比较期望结果和实际结果。
波形分析验证可以在不同抽象级别进行,包括电平验证、逻辑状态验证和功能验证等。
2.形式验证方法形式验证是一种使用形式工具来验证设计是否满足规范的方法。
形式工具基于设计的数学模型进行验证,可以全面而快速地验证设计的正确性。
•模型检查方法–使用形式工具对设计进行形式化建模,并使用模型检查器来验证设计是否满足特定的属性。
设计人员需要编写属性规范来描述设计的期望行为,并利用模型检查器来自动验证属性是否满足。
•定理证明方法–使用形式工具来进行数学定理的证明来验证设计的正确性。
设计人员需要将设计抽象为一个形式化的数学模型,并利用定理证明器来验证设计是否满足特定的性质。
3.边界扫描方法边界扫描方法是一种将设计周围的接口边界进行扫描以验证设计的方法。
•验证接口协议–针对设计中使用的接口协议,可以编写验证环境来验证接口协议是否正确地被设计所遵循。
验证环境可以利用随机算法生成各种接口交互情况,并验证设计的响应是否满足接口协议规定的规范。
•验证接口互连–针对设计中的各个接口之间的互连,可以编写验证环境来验证互连是否满足设计的要求。
验证环境可以生成接口交互的各种情况,并验证互连的正确性和稳定性。
一个牛人的Systemverilog总结Systemverilog数据类型l 合并数组和非合并数组1)合并数组:存储方式是连续的,中间没有闲置空间。
例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个32bit的数据。
表示方法:数组大小和位,必须在变量名前指定,数组大小必须是【msb:lsb】Bit[3:0] [7:0] bytes ;2)二维数组和合并数组识别:合并数组: bit [3:0] [7:0] arrys; 大小在变量名前面放得,且降序二维数组: int arrays[0:7] [0:3] ; 大小在变量名后面放得,可降序可升序位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素个数。
3)非合并数组一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。
非合并数组:字的地位存放变量,高位不用。
表示方法:Bit [7:0] bytes;4)合并数组和非合并数组的选择(1)当需要以字节或字为单位对存储单元操作。
(2)当需要等待数组中变化的,则必须使用合并数组。
例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。
Bit[3:0] [7:0] barray[3] ; 表示合并数组,合并数组中有3个元素,每个元素时8bit,4个元素可以组成合并数组可以使用barry[0]作敏感信号。
l 动态数组随机事物不确定大小。
使用方法:数组在开始是空的,同时使用new[]来分配空间,在new[n]指定元素的个数。
Int dyn[];Dyn = new[5]; //分配5个元素空间Dyn.delete() ; //释放空间l 队列在队列中增加或删除元素比较方便。
l 关联数组当你需要建立一个超大容量的数组。
关联数组,存放稀疏矩阵中的值。
表示方法:采用在方括号中放置数据类型的形式声明:Bit[63:0] assoc[bit[63:0]];l 常量:1)Verilog 推荐使用文本宏。
ChinalntegratedCircultSystemVerilog中的随机化激励神州龙芯集成电路设计公司杨鑫徐伟俊陈先勇夏宇闻摘要:随着集成电路的验证工作日渐复杂,对验证的可靠性提出了越来越高的要求。
传统的验证工作中也使用随机化激励以便减轻测试代码编写的工作量,以提升验证的可靠性。
在SystemVerilog更强调了利用随机化激励函数以提高验证代码的效率和验证可靠性的重要性。
本文以VMM库为例,阐述了如何在SystemVerilog中使用随机化函数来编写高效率的测试代码,重点介绍了可重用验证函数库的使用方法,以帮助读者理解如何使用SystemVerilog高效率地完成复杂的设计验证。
关键字:VMMSystemVerilog激励随机化1.前言随着电路工艺设计技术的不断发展,集成电路的逻辑设计变得越来越复杂,随之对验证工作提出了更高的要求。
由于投片(tip-out)的费用较高,很有必要在投片前对芯片设计进行全面、可信的验证,以尽量减少“设计———测试———投片———调试———发现Bug修改设计”这一流程的迭代次数。
因此在集成电路芯片的设计中,尤其是复杂逻辑设计中,对测试工作的效率和可靠性提出了更高的要求。
在传统的验证方法中,也有将激励随机化的方法,这样可以用较少的测试代码生成较多、较全面的测试激励。
这些方法减少了人为因素的干扰,能有效地提高验证的工作效率和可靠性。
在SystemVerilog中,强调在验证中使用可重用的验证IP,包括如何生成随机化激励。
对于如何尽可能地使用已有的验证IP,以及编写符合标准的可重用验证组件,SystemVerilog提供了一整套的工作机制,这使得符合规范的随机化激励组件能够很好地在多个设计间复用,这更进一步地提高了验证工作的效率和可靠性。
2.在验证中使用随机化激励在验证中,可以依照DUT(DesignUnderTest,被测设计,以下简称DUT)的验证要求来设计定向的激励,并对照DUT的预期响应,用人工的方法来判断设计是否正确。
2009年12月第28卷 第12期理论与方法基于OPNET 的校园网网络性能仿真张 锋 叶丽娜(解放军炮兵学院 合肥 230031)摘 要:为有效推进教学改革,充分发挥校园网的教学保障作用,文章基于OPN ET 仿真平台,对某校园网进行了建模、实现了对校园网相关网络性能的仿真,并给出了仿真结果。
通过对仿真数据分析,对网络的实时性、可靠性、稳定性等性能进行了评估。
其次对校园网扩容方案进行了建模仿真,给出了扩容意见与建议,为优化网络设计提供了重要的依据。
关键词:OPN ET ;校园网;网络性能中图分类号:TN915.41 文献标识码:AC ampus net net w ork perform ance simulation based on OPNETZhang Feng Ye Lina(The Artillery Academy of PLA ,HeFei 230031,China )Abstract :In order to advance the reform of teaching effectively ,make t he best use of campus network in teaching sup 2port.,based on OPN ET artificial platform ,we modeled a certain campus network ,imtitated t he relevant network per 2formance of campus network and get t he imitation result s.From t he analysis on t he data of t he imitation result s ,firstly ,we get t he evaluation of t he real 2time character ,dependability ,stability of t he network.Secondly we built models and make imitation of dilatation scheme of campus network ,gave suggestions on dilatation ,and offered important basis for optimizing t he network design.K eyw ords :OPN ET ;campus net ;network performance 作者简介:张锋,讲师,主要研究方向为信息与通信工程。
system verilog 中randc用法-回复System Verilog中的randc用法System Verilog是一种硬件描述语言,用于设计和验证现代集成电路。
其中一个非常有用的特性是randc(random count)关键字,它可以在随机数生成过程中控制出现次数。
在本文中,我们将详细介绍randc关键字的用法,并提供一些具体的示例和注意事项。
一、randc简介randc是System Verilog中的一个关键字,它用于控制随机数生成的次数。
一般来说,当我们使用关键字rand时,系统会根据约束条件生成随机数。
然而,有时我们希望某些随机数只出现有限次数,而不是无限次数。
这时,我们可以使用randc关键字来限制生成随机数的次数。
二、randc语法randc关键字的语法如下所示:randc expression;其中,expression是一个任意类型的表达式,用于指定控制随机数次数的条件。
expression必须是一个非负整数,表示randc关键字所生成随机数的最大生成次数。
当生成的随机数达到expression指定的次数后,randc关键字将不再生成随机数。
三、randc示例下面我们将提供一些使用randc关键字的具体示例,以帮助读者更好地理解其用法。
1. 随机生成一个10位二进制数,其中1的个数最多为5。
randc bit [9:0] random_num;constraint count_ones {random_num.countones() <= 5;}......在上面的示例中,我们使用了randc关键字和countones()方法来生成一个10位的二进制数random_num,并设置了一个约束条件count_ones,限制该二进制数中1的个数不超过5个。
这样,我们就能够生成多个满足约束条件的随机数。
2. 随机生成一个8位十进制数,其中奇数的个数最多为3。
randc int unsigned [7:0] random_num;constraint count_odds {random_num.count() with (item 2 == 1)<= 3;}......在上面的示例中,我们定义了一个8位无符号十进制数random_num,并设置了一个约束条件count_odds,限制该十进制数中奇数的个数不超过3个。
基于SystemC和SystemVerilog的联合仿真平台设计卢艳君【摘要】采用SystemC建模高抽象级模型、SystemVerilog进行验证工作,是解决验证工作量随着SoC复杂度提高而增加问题的有效手段.为了实现两种语言的联合仿真,提出了一种基于SystemC和SystemVerilog的联合仿真平台的实现,平台采用UVM验证方法学,采用标准化的组件结构与TLM通信方案,采用官方的UVMC库解决了SystemC与SystemVerilog之间的数据通讯问题,能够产生定向或约束性的随机激励.实际在UVM验证平台中完成对于AHB主设备接口的验证,结果显示,所设计的平台可以行之有效地实现联合仿真.【期刊名称】《黑龙江科技信息》【年(卷),期】2017(000)027【总页数】3页(P16-18)【关键词】SystemVerilog;SystemC;UVMC;联合仿真【作者】卢艳君【作者单位】广州民航职业技术学院,广东广州 510403【正文语种】中文随着SoC技术的不断发展,设计的复杂程度不断提高,并且新型的IP核设计流程、软件件协同仿真等机制的出现,使得IC的验证复杂度大大增加,验证已经占用整个IC开发流程的70%左右[1]。
针对IC行业发展的问题,新型的硬件描述与验证语言得以应用,使用SystemC语言进行硬件建模,同时基于SystemVerilog进行验证工作的方案越来越流行,其中SystemC可以提供事务级、高抽象度的建模方法,而应用SystemVerilog可以利用灵活的机制以及强大的进行规范而全面的验证,各自具有其独有的特点,两种语言二者结合起来,可以提高效率,缩短开发时间、增强验证效果。
然而,两种语言之间存在数据以及控制通信的障碍,因此如何解决二者的适配问题至关重要。
针对这一问题,本文提出了一种基于UVMC的联合仿真平台实现,能够很好的解决两者的适配问题。
SystemVerilog与SystemC之间适配的实现,其根本是缘于硬件描述语言(HDL,Hardware Description Language)与软/硬件协同设计语言(S/HCD,Software/Hardware Co-Design)之间的语法等效性。
使用VMM和DPI技术验证复杂多媒体SOC 芯片祝丹, 高勇, 陈辉, 张亚静, 李树杰中星微电子zhudan@摘要现代高端的多媒体芯片通常是复杂的SOC。
这类芯片的验证面临着许多挑战:第一,验证的工作量越来越大,迫切需要提高验证工作的效率,及验证平台的可重用性与可维护性。
第二,设计复杂度的增加,提升了验证工作的复杂度,从而对验证激励的随机产生提出了很高的要求。
第三,人工比对输出结果的工作非常繁琐并且容易遗漏问题,从而使自动比对成为验证系统的核心功能之一。
SystemVerilog和C/C++都是支持面对对象的编程语言,允许在更高抽象层进行建模,帮助提高验证工作的效率。
其中SystemVerilog提供对覆盖率和断言的支持以及与DUT的无缝集成,而DPI技术提供了SystemVerilog和C/C++之间的高性能链接。
中星微电子一直致力于多媒体芯片的开发,在VC08XX项目的验证过程中,我们使用了Synopsys的VMM验证方法学以及SystemVerilog的DPI技术,显著的缩短了项目开发周期,提高了芯片验证的全面性,确保了芯片的功能正确性。
关键词:SoC,功能验证,VMM,DPI1. 引言在验证过程中,验证方法学扮演着十分重要的角色。
尤其是对于高集成度和高复杂度的SOC的验证,好的验证方法学,首先可以显著的提高验证平台的可重用性,缩短功能验证的时间,节省验证资源,其次可以使验证平台具有输出结果自动比对等功能,同时还使各个验证组件结构清晰,任务划分和集成更加易于进行。
VMM是当前业内公认的验证方法标准,目前Synopsys已将其捐赠给EDA标准化组织 Accellera,Accellera正在VMM及VMM applications的技术基础上制定验证互操作性的标准。
VMM根据功能和抽象层次,将验证平台分成功能不同的模块,提高了验证平台的重用性和抽象层次。
Synopsys根据VMM验证方法学,用SystemVerilog实现了一套可继承的基类库使用OOP技术,验证工程师可以更快建立起复杂的验证平台,并使其具有激励受约束随机产生(Constraint-Random),DUT输出结果自动比对(Self-Checking),功能覆盖率驱动(Coverage-Driven)等高级功能。
SystemV erilog简介设计SystemV erilog简介★北京航空航天大学夏宇闻【l】国集成电路ChinaIntegratedCircuit摘要:美国电气和电子工程师协会(IEEE)最近(2005年11月9日)批准了SystemV erilog硬件描述语言的新标准.新标准是为了适应目益复杂的系统芯片(SoC)设计在原V erilog 一2001的基础上扩展的.按新标准开发的EDA工具必将大幅度地提高SoC的设计和验证效率.本文对新标准的扩展做了简要的介绍,希望引起国内IC设计界对这种功能强大语言的重视.月lJ吾SystemV erilog是IEEE最近推出的硬件描述和验证语言,它是在原V erilog(IEEE1364—1995和一2001)基础上扩展的新语言.这种新语言将设计和验证所需的语言组合成同一种语言.而且Sys—temV erilog还是V erilog一2001的超集.因此,目前的V erilog用户使用SystemV erilog不存在任何问题.SystemV erilog一问世就拥有大量承诺支持它的供应商,这一切都预示着SystemV erilog会有良好的市场前景.SystemV erilog与V erilog有许多重要的区别.第一,SystemV erilog提供了完整的仿真模型,它将每个时隙细分成11个有序的段,并规定了每个段内必须发生的事件.这样就可以避免当仿真包含反应性测试平台,覆盖率分析工具和相互作用的第三方c模型在内的各种模型时,有可能发生的某些不确定性.第二,SystemV erilog具有类似c++语言的一些高级数据类型和功能,如:结构体,联合体,打包和非打包的数组,动态存储器分配和动态进程等,更适合测试平台的开发和系统级建模.第三,仿真和静态验证工具可以使用相同的声明集合.第四,Sys—temV erilog的新扩充还包括了接口块,断言函数等. 这些扩展使得SystemV erilog可以在更高的抽象层次上,更方便地为复杂IP之间的连接,测试验证和查错建立模型,显着地提高了代码的可读性,可维护性,设计和验证效率,极大地提高了编写测试平台的能力.SystemV erilog由OVI(OpenV erilogInternation—a1)和VI(VHDLInternatioan1)两个国际标准化组织合作成立的Accellera集团推出,主要用于数字系统芯片的设计和验证流程.由于SystemV eHlog具有与高级编程语言(如C语言)直接连接调试的强大功能,为系统级软硬件协同设计验证提供了极大的方便,因此对包括软硬件在内的现代复杂SoC设计有非常深远的意义.读者若想全面深入地理解和掌握语法的要点,不但需要认真阅读SystemV erilogLRM(语法手册), 还需要上机练习才行.为了帮助读者用最少的时间初步了解SystemV erilog标准所做的扩展,作者将从下面30个方面,对最近批准的SystemV erilog标准作简要的介绍.1)数组在V erilog中可以声明数组类型,reg和线网类型还可以具有矢量位宽.在对象名前面声明的位宽表示变量的位宽,在对象名后面声明的维数表示数编者注:IEEE刚刚于2005年11月9日批准SystemV erilog硬件描述语言的新标准之际,夏宇闻老师为我刊编写了本文.具体介绍了这一标准语言,相信一定能受到广大设计人员,尤其是SOC设计人员的欢迎.r笛R1蝴,_曩岛程曩曩■~,.…..一……由国集成电路ChinaIntegratedCircuit组的个数.举例如下:reg[7:O】rl[1:256】;//声明rl为256个8位的变量在Systemverilog中设计者可使用不同的术语表示数组:使用"打包数组(packedarray)"这一术语表示在对象名前面声明的数组的维数;使用"非打包数组(unpackedarray)"这一术语表示在对象名后面声明的数组的维数.打包数组可以由下面的数据类型组成:bit,logic,reg,wire以及其它的线网类型.无论是打包数组还是非打包数组都可以声明成多维的.举例如下:bit[7:0】a;//打包数组a为bit类型(双值)只有一个包(包由字节,即8位,组成)bitb[7:O】;//非打包数组b为bit类型(双值)(一位),共有8位从b[O】到b[7】bjt[0:11][7:0卜;//打包数组c(每包12个字节),只有一个包bit[3:0】【7:0】d[1:1O】;//d的每个包由4个字节(8位)组成,d共有l0个非打包的包上例中非打包数组大小的定义([1:10】)放在打包数组(d)定义之后,这就允许将整个打包数组(4个字节)作为单一的元素进行引用.在上面的例子中,d[1】引用非打包数组的第一个元素,该元素由4 个字节组成.2)枚举类型V erilog~法中没有枚举类型.标识符必须显式地声明为线网,变量或参数,并赋值.SystemV erilog 允许使用类似于C的语法定义枚举类型.枚举类型具有一组被命名的初始值.缺省情况下,初始值从0 开始递增,但是设计者也可以显式地指定初始值. 枚举类型的例子如下:enum{red,yellow,green}RGB;//red=2'b0,yellow=2'b01.green=2'blO;enum{W AIT=2'b01,LOAD,DONE}states;//LOAD=2'bl0.DONE=2'bl1:设计者还可以使用typedef为枚举类型指定一个名字,从而允许这个枚举类型可以在许多地方使hHn.Ij,^^?^IIr,tmr-r,^m设计用.例如:typedefenum{FALSE=I'b0,TRUE}boolean; booleanready;booleantest——complete;3)结构体和联合体V erilog语法中没有结构体或联合体,而结构体或联合体在把几个声明组合在一起的时候非常有用. SystemV erilog增加了结构体和联合体,其语法类似于C.struct{reg[15:0】opcode;reg[23:0】addr;}IR;//声明IR是一个结构体,由两部分组成:16位的操作码opcode和24位的地址addrunion{intI:shortrealf=}N;结构体或联合体中的域可以通过在变量名和域名字之间插入句点()来引用:IR.opcode=1;//设置IR变量中的opcode域N.f=O.O;//将N变量中的f域设置成浮点数的值O.O设计者可以使用typedef为结构体或联合体的定义指定名字,举例如下.typedefstruct{reg[7:0】opcode;reg[23:0】addr;}instruction;//命名的结构体,instruction是一个由两部分//(16位的操作码opcode和24位的地址addr)组成的指令instructionIR://结构体实例,定义IR具有指令(instruction)同样的结构结构体可以使用值的级联来完整地赋值,例如:instruction={5,200];//表示操作码为5,地址为200 结构体可以作为整体传递到函数或任务,也可以从函数或任务传递过来,也可以作为模块端口进行传递.4)接口(Interface)V erilog模块之间的连接是通过模块端口进行的.为了给构成设计的各个模块定义端口,设计者必须对所做的硬件设计有详细的认识.但在设计的初期,设计者很难把握设计的细节.而一旦模块的端口定义完成后,端口的配置就很难改变.另外, 设计中的许多模块往往具有相同的端口名,在V er—ilog语言中,设计者必须对每个模块进行相同的定义和连接,这增加许多无谓的工作量.SystemV erilog提供了一个全新的,高层抽象的连接定义块,这个连接块被称为接口(Interface).接口块在关键字interface和endinterface之间定义,它独立于模块.接口在模块中就像独立端口一样使用. 在最简单的形式下,接口可以认为是一组线网.例如,可以将PCI总线的所有信号绑定在一起组成一个接口.借助于接口块的定义,编写代码时若遇到许多个实例互相连接的情况,可以不必逐一建立各模块对应端口间的连接,大大加快了设计工作.随着设计的深入,设计细节逐渐变得清晰,许多模块的接口需要添加和修改.而对接口块所做的修改,可在使用该接口块的每个模块中反映出来,而无需逐个修改每个模块的接口,大大节省了相关模块接口修改的工作量.下面是接口的使用实例: interfacechip—bus;//定义接口chip—bus wireread_request,read_grant;wire【7:0】address,data;endinterfacemoduleRAM(chip—busio,//RAM模块的端口中包含已定义的接口chip—bus,具体接口名为io inputclk);//可以使用io.read—request引用接口中的一个信号endmodU1emoduleCPU(chip——busio,inputclk);//CPU模块的端口中也使用了已定义的接口chip—bus,具体名为iomoduletop;regclk=0:chip—busa;//接口的实例引用,说明a是与chip—bus同样的接口RAMmem(.io(a),clk);//将接口a连接到mem实例模块的io接口CPUcpu(.io(a),clk);//将接口a连接到cpu实例模块的io接口endmodule实际上,SystemV erilog的接口不仅仅可以表示信号的绑定和互连.由于SystemV erilog的接口中可以包含参数,常量,变量,结构,函数,任务,initial块, always块以及连续赋值语句,所以SystemVerilog的接口还可以包含内建的协议检查,以及使用该接口的每个模块共用的功能.5)随机激励信号的产生在设计中,总是有一些边角情况是比较不容易发生,或是不容易想到的,因此借助随机产生的测试激励,可以帮助验证边角情况.V erilog已经具有$random来产生随机数,但设计者并无有效办法控制该随机数的范围与顺序.在SystemV erilog3.1里, 增加了rand与randc两个对象类,用于设定随机数产生的条件.下例中设计者声明一个名为Bus的类, 并规定地址总线的最低的两位必须为0.而在使用时,利用rand类里的randomize子类,产生50个随机数据与地址,大大简化了V erilog原来产生随机数的手段.classBus;randbit[15:0】addr;randbit[31:0】data;constraintword_align{addr[1:0】=='2b0;} endclassrepeat(50)beginif(bus.randomize0==1)$displayfIIaddr=%16hdata=%hha",bus.addr,bus.data);else$display("Randomizationfailed.\n");end6)时间单位和精度在V erilog中,表示时间的值使用一个数来表示,而不带有任何时间单位.例如:forever#5clock=~clock;单从这一语句中,设计者无法判断5代表的是5ns?5ps?还是5us.V erilog的时间单位和精度是作为每个模块的属性,在模块代码前用编译器指令,timescale来设置.使用这种方法存在固有的缺陷, 因为编译器指令的执行依赖于源代码的编译顺序, 编译器总是将它遇到的最后一个,timescale设置的时间单位和精度作为标准.那么,若有些模块代码没有用,timescale设置时间单位和精度,当这种源代码前缺少时间单位定义的模块与有,timescale设置的模块一起仿真时,就有可能出现完全想象不到的结果.●,●●^.Ih…^…i……一SystemV erilog为了能更方便地控制时间单位,做了两个重要的改进.1)时间值可以显式地指定为某一个单位.时间单位可以在S,ms,ns,ps或fs之间选择,时间单位作为时间值的后缀出现.例如: forever#5nsclock=~clock;2)SystemV erilog允许使用新的关键字(timeu—nits和timeprecision)来指定时间单位和精度.这些声明可以在任何模块中指定,同时也可以在全局空间中指定.时间单位和精度必须是10的幂,范围可以从S到fs.例如:timeunits1ns;timeprecision10ps;7)抽象数据类型V erilog提供了面向底层硬件的线网,寄存器和变量数据类型.这些类型代表了4态逻辑值,通常用来在底层J二对硬件进行建模和验证.线网数据类型还具有多个强度级别,并且能够为多驱动源的线网提供解析功能.SystemV erilog包括了C语言的char和int数据类型,它允许在V erilog模型和验证程序中直接使用c和c++代码.V erilogPLI不再需要整合总线功能模型,算法模型和C函数.SystemVerilog还为V er—ilog加入了几个新的数据类型,以便能够在更抽象的层次上为硬件电路建模.char:两态的有符号变量,它与C语言中的char数据类型相同,可以是一个8位整数(ASCII)或shortint(Unicode):int:两态的有符号变量,它与C语言中的int数据类型相似,但被精确地定义成32位; shortint:两态的有符号变量,被精确地定义成l6位;longint:两态的有符号变量,它与C语言中的long数据类型相似,但被精确地定义成64位; byte:两态的有符号变量,被精确地定义成8位;bit:两态的可以具有任意位宽的无符号数据类型,可以用来替代V erilog的reg数据类型; logic:四态的可以具有任意位宽的无符号数据类型,可以用来替代V erilog的线网或reg数据类型,但具有某些限制;shortreal:两态的单精度浮点变量,与C语言的float类型相同;void:表示没有返回值,可以定义成函数的返回值,与C语言中的含义相同.SystemV erilog的bit和其他数据类型允许用户使用两态逻辑为设计建模,两态逻辑模型的仿真速度快,效率高.由于V erilog语言没有两态数据类型, 因此许多仿真器将这种功能作为仿真器的选项.有些仿真器不支持两态逻辑数据,所以有时在必须用三态或四态逻辑建模的设计中强制使用两态逻辑, 仿真器还会出现问题.而SystemV erilog的bit数据类型能够极大提高仿真器的性能,同时在需要的时候仍然可以使用三态或四态逻辑.用改变数据类型的方法来代替仿真器的逻辑状态选项,使得设计模型能适应多种仿真器.SystemV erilog的logic数据类型比V erilog的线网和寄存器数据类型更加灵活,它使得在任何抽象层次上为硬件建模变得更加容易.logic类型能够以下面的任何一种方法赋值:任意次的过程赋值语句赋值,能够替代V erilog的reg类型;单一的连续赋值语句赋值,能够有限地替代V erilog的wire类型;连接到单一原语的输出,能够有限制地替代V erilog的wire类型;由于logic数据类型能够被用来替代V erilog的reg或wire(具有限制),这就使得设计者能在更高的抽象层次上建模,并且随着设计的深人,能不断地添加设计细节而不必改变数据类型的声明.logic数据类型不能表示信号的强度,也不具有线逻辑的解析功能,因此logic数据类型比V erilog的wire类型能更有效地仿真和综合.8)有符号和无符号限定符缺省情况下,V erilog的net和reg数据类型是无符号类型,integer类型是有符号类型变量.V er—ilog一2001标准允许使用signed关键字将无符号类型显式地声明成有符号类型.SystemV erilog添加了类似的能力,它可以通过unsigned关键字将有符号数据类型显式地声明成有无符号数据类型.例如:值得注意的是unsigned在V erilog中是保留字,但并没有被V erilog标准使用.9)用户定义的类型V erilog不允许用户定义新的数据类型.Sys—temV erilog通过使用typedef提供了定义新的数据类型方法,这与C语言类似.用户定义的类型可以与其它数据类型一样地在声明中使用.例如: typedefunsignedintuint;uinta.h:用户定义的数据类型可以在它的定义之前使用,只要它首先在空的typedef中说明,例如: typedefint48;//空的typedef,即虽然定义了int48,但究竟int48定义成什么?//还需要在其他地方进行完整的定义int48c;//虽然int48具体如何定义并未确定,但可以把c定义为是int48类型的.10)在命名块中声明变量V erilog允许变量在命名的begin—end或fork—join语句组中声明.对于命名的语句组来说,在块内定义的变量是本地的,但它们可以用层次化命名方法引用它们.在SystemV erilog中,变量既可以在命名的块中也可以在未命名的块中声明,对在未命名的块中声明的变量,不能使用层次名来访问,所有的变量类型,包括用户定义的类型,枚举类型,结…IIII【l】国集成电路斗』■ChinaIntegratedCircuit构体和联合体都可以在begin—end或fork-join命名的语句组中声明.11)常量在V erilog中有三种特殊类型的常量:parame—ter,specparam和localparam.而在SystemV erilog中, 允许使用const关键字声明常量.例如: constcharcolon=":":12)可重定义的数据类型SystemV erilog扩展了V erilog的参数(parame—ter)功能,使其可以包含数据类型.若模块定义了参数,用于表示数据类型,则在引用该模块的实例时,可通过参数传递重新定义每个实例中的数据类型. 例如:modulefoo;#(parametertypeVAR—TYPE=shortint;). (inputlogic[7:0】i,outputlogic[7:0】o);V AR_TYPEJ=0;//如果不重新定义,j的数据类型为shortintmodulebar;logic[3:0】i,o;foo#(.VAR_TYPE(int))ul(i,o);//重新将V AR—TYPE定义成int类型endmodule13)模块端口连接在V erilog中,可以连接到模块端口的数据类型被限制为线网类型以及变量类型中的reg,integer和time.而在SystemVerilog中,则去除了这种限制,任何数据类型都可以通过端口传递,包括实数,数组和结构体.14)用字母赋值ht}n.IhAAAAA!,,im,1,,n在V erilog中,用字母赋值时候有一些约定.而SystemV erilog则为用字母赋值作了下面的改进:变量的所有位可以方便地用字母(,0,,1,,z或,X)赋值.填充一个任意位宽的矢量,而无需显式地指定矢量的位宽,例如:bit【63:0]data;data=,1;//将data的所有位(共64位)都设置成1 15)字符串(string)SystemV erilog添加了可变长度的字符串数据类型,使用者不需声明字符串数据的长度,编译工具会自动判断.而SystemV erilog也提供了常用字符串处理函数,例如putcO,getc0,atoi0,itoa0等,而口些字符串处理函数功能以前必须通过PLI函数才能实现.16)强制类型转换V erilog不能将一个值强制转换成不同的数据类型.SystemV erilog通过使用<数据类型>'操作符提供了数据类型的强制转换功能.这种强制转换可以转换成任意类型,包括用户定义的类型.例如:int'(2.03.0)//将计算结果转换为int类型m~ype'(foo)//将转换为m~ype类型在强制转换操作符前指定一个10进制数可以用来确定转换后的矢量位宽,例如:17'(x一2)∥将结果转换为17位宽也可以将结果转换成有符号值,例如:signed'(x)//将x转换为有符号值17)操作符V erilog没有C语言的递增(++)和递减(一)操作符.而SystemV erilog加人了几个新的操作符:++和~:递增和递减操作符;+=,一=,术=,/=,%=,&=,=,I=,<<=,>>=,<<<= 和>>>=赋值操作符;18)具有唯一性和优先级的条件语句在V erilog中,如果没有遵循严格的编码风格,它的if-else和case语句会在RTL仿真和RTL综合间具有不一致的结果.如果没有正确使用full_case和parallel—case综合指令还会引起一些其它的错误.SystemV erilog~够显式地指明什么时候条件语句的分支是唯一的,或者什么时候需要计算优先级. 设计者可以在if或case关键字之前使用unique或requires关键字.这些关键字可以向仿真器,综合编译器,以及其它工具指示设计者期望的硬件类型.工具使用这些信息来检查if或case语句是否正确地为期望的逻辑建立了模型.例如,如果使用unique 限定了条件语句,那么在不希望的case值出现的时候仿真器就会发布警告信息.bit[2:0】a;uniqueif((a--O)lI(a==1))Y=inl;elseif(a==2)Y=in2;elseif(a==4)Y=in3;//值3,5,6,7会引起一个警告priorityif(a[2:1】==0)Y=inl;//a是0或1elseif(a[2】==0)Y=in2;//a是2或3elseY=in3;//如果a为其他的值uniquecase(a)0,1:Y=inl;2:Y=in2;4:Y=in3;endcase//值3,5,6,7会引起一个警告prioritycasez(a)2'bOO?:Y=inl;//a是0或12'b077:Y=in2;//a是2或3default:Y=in3;//如果a为其他的值endcase来跳转到新的语句,包括:retum,break,continue和goto.在V erilog中除了通过使用disable语句跳转到语句组的尾部外,没有提供任何其它跳转语句.使用disable语句执行中止和继续功能要求加入块的名字,并且会产生不直观的代码.SystemV erilog加入了C语言的break和continue关键字,这两个关键字不要求使用块名字.另外,SystemV erilog还加入了一个retum关键字,它可以用来在任何执行点上退出一个任务或函数.break:退出一个循环,与C语言相同;continue:跳转到一个循环的尾部,与C语言相同;retum表达式:退出一个函数;retum:退出一个任务或void类型的函数. SystemV erilog没有包含C语言中的goto语句.20l块名字和语句标签在V erilog中,设计者可以通过在begin或fork关键字之后指定名字来为begin—end或fork-jion语句组命名.这个指定的名字代表整个语句块.Sys—temV erilog还允许在end或iion关键字之后指定一个匹配的块名字.这种机制很容易将end或jion与对应的begin或fork联系起来,尤其是在一个长的块或嵌套的块中.块结尾处的名字是可选的,但如果使用的话,它必须与块起始处的名字相同.例如:begin:foo//在begin之后的块名字fork:bar//具有名字的嵌套的块jion:bar//必须具有相同的名字end:foo//必须具有相同的名字SystemV erilog还允许像c语言一样为单个语句19)跳转语句设置标签.语句标签放置在语句的前面,用来标识在语句的执行过程中,c语言提供了几种方式这条语句.例如:initialbegintestl:read—enable=0;test2:for(i=0;i<=255;i++)end21)对事件控制的增强V erilog使用@标记来控制基于特定事件的执行流,SystemV erilog增强了@事件控制.●有条件的事件控制@标记的一个基本应用就是推断具有使能输入的锁存器.下面的例子演示了锁存器建模的基本风格.always@(dataoren)if(en)Y=data;这种编码风格对仿真来说是效率很低,因为即使在使能无效的时候,数据输入的每次改变都会触发事件控制,都要消耗仿真时间.SystemV erilog在事件控制中加入了一个赶条件.只有iff条件为真的条件下,事件控制才会被触发.通过将使能判断移入到事件控制里面,使得只有在锁存器输出能够改变的时候事件控制才会被触发.例如:always@(aoreniffen----1)Y a:●事件控制中的表达式V erilog允许在@事件控制列表中使用表达式,例如:always@((ab))always@(memory[address])在第一个例子中,是当操作数发生改变的时候还是只有当运算结果发生改变的时候才会触发事件控制?在第二个例子中,是当memory的地址发生变化的时候还是只有当memory的值发生变化的时候才会触发事件控制?当@事件控制中包含表达式的时候,IEEEVerilog标准允许仿真器进行不同的优化.这就可能导致在不同的仿真器间有不同的仿真结果,可能还会导致仿真与综合之间的结果不一致. ht●n.,^-^-^-Jr,lr,ma^,'^mSystemV erilog加入了一个changed关键字,在事件控制列表中它被用作一个修饰符.@(changed(表达式))能够显式地定义只有当表达式的结果发生改变的时候才会触发事件控制.例如:always@(changed(ab))always@(changedmemory[address])●事件控制中的赋值V erilog不允许在事件控制中使用赋值.Sys—temV erilog允许在事件控制中使用赋值表达式.事件控制仅仅对赋值表达式右侧的变化敏感.例如: always@(v=a$b)22)新的a1ways过程块V erilog使用always过程块来表示时序逻辑,组合逻辑和锁存逻辑的RTL模型.综合工具和其它软件工具必须根据过程起始处的事件控制列表以及过程内的语句来推断always过程的意图.这种推断会导致仿真结果和综合结果之间的不一致.Sys—temV erilog增加了三个新的过程来显式地指示逻辑意图.always—if:表示时序逻辑的过程块; always—comb:表示组合逻辑的过程块; always—latch:表示锁存逻辑的过程块.例如:always—comb@(aorborse1)beginif(se1)Y=a;elseY=b:end软件工具能够检查事件控制敏感列表和过程的内容来保证逻辑的功能匹配过程的类型.例如,工具能够检查一个always—comb过程能够敏感过程内读取的所有外部值,对逻辑的每一个分支的相同变量进行赋值,并且检查分支是否覆盖了所有可能的条件.如果任何一个条件没有满足,软件工具均会报告该过程没有正确建模组合逻辑.__________________————IL—一设计23)动态过程V erilog~过使用fork-jion提供了一种静态的并发过程.每个分支都是一个分离的,并发的过程.过程块中,fork-jion后的任何语句必须在组内的每一个过程完成后才会执行.例如:initialbeginf0rksend~packet—task(1,255,0);send—packet—task(7,128,5);watch—result—task(1,255,0);watch—result—task(7,128,5);iion//所有的任务必须完成后才会到达这里endSystemV erilog通过process关键字加入了一个新的,动态的过程.它为过程产生分支,然后继续执行而无需等待其他过程完成.过程不会阻塞过程或任务内的语句执行.这种方式能够为多线程过程建模. 例如:initialbeginprocesssend—packet—task(1,255,0);processsend—packet—task(7,128,5);processwatch—result—task(1,255,0);processwatch—result—task(7,l28,5);end//所有的过程并行运行24)并行处理硬件设计常遇到需要并行处理的情况,此时在资源分配和同步操作上需要认真安排时序.由于并行处理一般由硬件实现,硬件可以由设计者自行安排,不存在实现的问题.但编写测试模块,则是希望代码简明扼要,可读性好,仿真效率高.在同步仿真模块的编写时,原V erilog的folk-join语句可以让指定的一组动作同时启动,但必须等所有的动作都完成后,才能结束.SystemV erilog添加了join—none与ioin—any声明,可以让一组同时启动的动作,各自停止而不受其他动作的影响(ioin—none),或者当其中一个动作完成后整组动作都停止(join—any).而巾国集成电路ChinaIntegratedCircuit在资源共享使用方面,最常见的是多个硬件模块同时对共享资源作读写操作.若安排的读写顺序有错误,将出现严重问题SystemV erilog添加了semaphore,mailbox等类来协助资源的共享使用.25)任务和函数的增强SystemV erilog为V erilog的任务和函数作了几个增强.●静态和自动的存储缺省情况下,在V erilog任务或函数内的所有存储都是静态的.V erilog一2001允许将任务和函数声明成自动的.在SystemV erilog中:1)静态任务和函数内的特定数据可以显式地声明成自动的.声明成自动的数据在块中具有完整的生命周期,并且在任务和函数调用的入口处初始化;2)自动的任务或函数中的特定数据可以显式地声明成静态的.自动任务或函数中声明成静态的数据在块的本地范围内具有静态的生命周期.●从任何点返回V erilog在任务或函数中执行到endtask或end—function关键字的时候返回.函数的返回值是给函数名赋的最后一个值.SystemV erilog加入了一个return 关键字,使用这个关键字,一个任务或函数可以在任何点上返回.●多语句V erilog要求任务或函数只具有一个语句或语句块.多条语句必须组合到单一的begin—end或fork-jion块中.SystemV erilog去除了这种限制.因此,多条语句可以在一个任务或函数中列出而无需使用的begin—end或fork-jion.每有分组的语句就像在begin—end中一样顺序执行.设计者还可以产生没有语句的任务或函数定义.●void函数V erilog要求函数具有一个返回值,函数的调用接收这个返回值.SystemV erilog加入了void数据类型,这个数据类型可以作为函数的返回值类型. void函数可以像V erilog任务一样进行调用,而无需。
Verilog仿真的激励文件中如何控制仿真结束是一个在数字电路设计和验证过程中非常重要的问题。
本文将探讨一些常用的方法和技巧,帮助读者更好地掌握这一关键技术。
1. 使用$finish系统任务Verilog语言提供了一个系统任务$finish,可以用来结束仿真过程。
当激励文件中的某个条件满足时,可以调用$finish任务,终止仿真过程。
这个条件可以是一个特定的时钟周期数,也可以是某个特定的状态达到。
2. 使用$stop系统任务除了$finish任务外,Verilog还提供了$stop任务来结束仿真过程。
$stop任务可以带一个整数参数,表示仿真结束的状态码。
这样可以在激励文件中根据需要来控制仿真结束的条件和状态。
3. 设计专用的结束条件在激励文件中,可以根据仿真的具体需求,设计专门的结束条件。
比如在测试一个模块的功能时,可以设置一个计数器,当某个特定的输入序列经过一定数量的时钟周期后,触发结束条件,终止仿真过程。
这种方法可以更灵活地控制仿真的结束条件。
4. 使用PLI/ VPI接口Verilog语言提供了PLI(Programming Language Interface)和VPI(Verilog Procedural Interface)接口,允许用户编写C/C++程序来控制仿真过程。
通过这些接口,用户可以在激励文件中调用自定义的C/C++函数,实现更加灵活和复杂的仿真结束条件和控制逻辑。
5. 结合仿真工具的特性不同的仿真工具可能有不同的特性和扩展功能,可以根据具体的仿真工具来选择合适的方法和技巧来控制仿真结束。
比如一些仿真工具提供了丰富的命令行控制接口,可以通过命令行参数或者特定的命令来控制仿真的结束条件。
总结在Verilog仿真中,控制仿真结束的方法有很多种,可以根据具体的需求和场景来选择合适的方法和技巧。
需要特别注意的是,在设计结束条件和控制逻辑时,要考虑到仿真的完整性和准确性,以及仿真结果的可靠性。
相信各位设计/验证工程师在写verilog testbench的时候都会需要产生随机数,如果你直接调用系统自带的$random系统函数的话,你会发现每次仿真产生的随机数序列是一样的,这是因为调用随机数系统函数时没有指定随机数种子,系统会直接调用默认的种子,所以每次产生随机数都用了同样的种子,那么随机数序列也就是一样的。
下面提供两种产生每次都不一样的随机数序列的方法:1.在vcs脚本中产生随机种子在vcs脚本中添加:set seed =''set seed =$$$$+ntb_random_seed=$seed \这种方式只需要在bench中用$urandom就可以每次都产生不一样的随机数,如果要配置种子,则使用命令:run +seed=12342.在bench中产生随机种子testbench中加入以下代码:import "DPI-C" function int c_random();initial begin:random_seed_capif($value$plusargs("SEED=%d",seed))begin$display(“use the outside seed”);endelse beginseed = c_random();$display(“the random seed = %d”,seed);endend在bench中使用random_dat=$random(seed)就能产生不重复的随机数序列。
如果需要指定随机数种子,在run命令中加上:+SEED=1234就能指定这次仿真产生的随机数序列是以1234为种子。
文件:“c_random.c”#include<stdlib.h>#include<time.h>#include<unistd.h>#include"svdpi.h"#include"vpi_user.h"#include"veriuser.h"long int c_random(){long int seed;time(&seed);seed=seed*getpid(); srand(seed);return(rand());}。
SystemVerilog基本语法总结(中)Systemverilog 语法总结(中)上⼀个博客分享了SV基本的概念,这⼀博客继续分享,等下⼀个博客分享⼀个公司的验证的笔试题⽬。
l 事件背景:Verilog中当⼀个线程在⼀个事件上发⽣阻塞的同时,正好另⼀个线程触发了这个事件,则竞争就出现了。
如果触发线程先于阻塞线程,则触发⽆效(触发是⼀个零宽度的脉冲)。
解决⽅法:Systemverilog 引⼊了triggered()函数,⽤于检测某个事件是否已被触发过,包括正在触发。
线程可以等待这个结果,⽽不⽤在@操作符上阻塞。
例⼦:event e1,e2;Initial begin->e1;@e2;endInitial begin->e2;@e1;end上⾯的代码,假设先执⾏第⼀个块,再执⾏第⼆个块。
第⼀个块会阻塞在@e2(阻塞先执⾏),直到e2触发,再运⾏(触发后执⾏);在执⾏第⼆个块时,会阻塞在@e1,但是e1已经触发(触发先执⾏,阻塞后执⾏,触发是个零宽度的脉冲,会错过第⼀个事件⽽锁住)解决⽅法:⽤wait(e1.triggered())来代替阻塞@e1,如果先触发,也可以执⾏。
l 等待多个事件最好的办法是:采⽤线程计数器来等待多个线程。
l 旗语get()可以获取⼀个或多个钥匙,put()可以返回⼀个或多个钥匙。
try_get()获取⼀个旗语⽽不被阻塞。
l 信箱背景:如何在两个线程中传递信息?考虑发⽣器需要创建很多事物并传递给驱动器的情况。
问题:如果使⽤发⽣器的线程去调⽤驱动器的任务。
这样,发⽣器需要知道驱动器的层次化路径(类的层次化),降低了代码的可重⽤性;还迫使发⽣器和驱动器同⼀速率运⾏,当⼀个发⽣器需控制多个驱动器时会发⽣同步问题。
解决办法:把驱动器和发⽣器当成各个处理事物的对象,之间通过信道交换数据。
信道允许驱动器和发⽣器异步操作;引⼊问题:你可能倾向于仅仅使⽤⼀个共享的数据或队列,但这样,编写实现线程间的读写和阻塞代码会很困难。
randcase用法randcase是一种SystemVerilog中的随机化函数,可在测试中生成随机的测试用例。
它可以用于生成各种不同的测试场景,包括边界条件和异常情况。
使用randcase时,需要定义一个case语句,并为每个case分配一个权重。
权重越高的case被选中的概率越大。
下面是一个例子: ```randcasecase 10: // 权重为10// 测试用例1case 20: // 权重为20// 测试用例2case 70: // 权重为70// 测试用例3endcase```在上面的例子中,测试用例3的权重最高,因此被选中的概率最大。
测试用例1的权重最低,因此被选中的概率最小。
randcase还可以使用其他的参数来生成更复杂的测试用例。
例如,可以使用$urandom_range函数来生成随机的数字。
下面是一个例子:```randcasecase 10: // 权重为10// 测试用例1var1 = $urandom_range(1, 100);case 20: // 权重为20// 测试用例2var1 = $urandom_range(101, 200);case 70: // 权重为70// 测试用例3var1 = $urandom_range(201, 300);endcase```在上面的例子中,使用了$urandom_range函数来生成一个随机的数字,用于测试用例中的变量var1。
根据权重的分配,测试用例3中的变量var1生成的数字范围最大,而测试用例1中生成的数字范围最小。
总的来说,randcase是一种非常有用的随机化函数,可以帮助测试人员生成更多、更复杂的测试用例,以发现代码中的潜在问题。
system verilog的random用法SystemVerilog的Random用法随着数字逻辑设计领域的发展,随机性测试在设计验证中扮演着至关重要的角色。
SystemVerilog是一种硬件描述语言,提供了一种强大而灵活的随机性测试功能,被广泛应用于FPGA和ASIC的设计验证中。
本文将介绍SystemVerilog中random的用法,以及如何使用random实现随机性测试。
一、random用法概述在SystemVerilog中,random是一种用于产生随机数的关键字。
它可以用于声明变量、生成随机数、以及约束随机数生成范围。
通过结合constraint和randomize的用法,可以实现对设计的全面随机性测试。
二、random变量的声明与使用要声明一个random变量,可以在变量声明的前面加上关键字rand。
例如,声明一个随机变量rand_var:rand int rand_var;声明一个随机32位无符号整数:rand bit [31:0] rand_unsigned;声明一个随机布尔型变量:rand bit rand_bool;在使用random变量之前,需要首先调用randomize函数对其进行分配。
randomize函数的使用方法如下:randomize(rand_var);若要限定随机数的范围,可以使用constraint约束。
例如,限定随机数的范围在0和100之间:constraint rand_var_range {rand_var inside {[0:100]};}通过设置constraint,可以对随机数生成的范围进行精确控制。
在randomize函数中使用constraint:randomize(rand_var) with {rand_var_range};三、使用random实现随机性测试在设计验证中,随机性测试是一种重要的手段,可以有效地发现设计中的漏洞和潜在错误。
systemverilog与验证⽅法读书笔记⿊盒验证指的是只通过其边界信号来验证⼀个模块或者设计的功能。
在⽩盒验证中,可以不需要参考模型,因为可以通过在设计内部或者外部输出信号放置监控器和断⾔来保证设计操作的正确性。
形式验证技术主要有等价性检查和属性检查.验证⼀个设计需要回答两个问题:“Doesitwork?”(DUT能够正常⼯作么?)(在验证计划中可以分解成:测试什么功能点?怎么测?最后功能对不对?)和“Arewedone?”(我们做完了么?)。
第⼀个问题属于最基本的验证概念,也就是说设计能否符合设计者的意图;第⼆个问题就是问我们的验证是否充分和完备,验证是否达到收敛。
基于断⾔验证和覆盖率驱动验证就是解决这两个问题主要的⽅法学。
断⾔验证(AssertionBasedVerification,ABV)主要的⽬的是保证设计和设计期望之间是⼀致的。
覆盖率驱动验证的⽅法最重要的特点是基于随机激励产⽣。
随机激励⽣成是提⾼效率的最主要的原动⼒。
覆盖率驱动验证⽅法学把下⾯⼏个概念和技术融合到了⼀块::事务级验证、约束随机激励产⽣、⾃动化结果⽐较、覆盖率统计分析和直接测试。
⼀个覆盖率驱动的验证项⽬的开发周期包括下⾯⼏个阶段。
(1)开发验证计划(2)搭建验证环境(3)测试运⾏环境(4)运⾏随机测试⽤例(5)针对边界情况创建直接测试/s/blog_4bc2e9450100o9lt.htmlSystemVerilog还为Verilog加⼊了⼏个新的数据类型,以便能够在更抽象的层次上建模硬件。
char:可以是⼀个8位整数(ASCII)或short int(Unicode);int:⼀个两态的有符号变量,32位;shortint:⼀个两态的有符号变量,16位;longint:⼀个两态的有符号变量,64位;byte:⼀个两态的有符号变量,8位;bit:⼀个两态的可以具有任意向量宽度的⽆符号数据类型,可以⽤来替代Verilog的reg数据类型;logic:⼀个四态的可以具有任意向量宽度的⽆符号数据类型,可以⽤来替代Verilog的线⽹或reg数据类型,但具有某些限制;不能⽤在双向总线和多驱动的情况shortreal:⼀个两态的单精度浮点变量,与C语⾔的float类型相同;void:表⽰没有值,可以定义成⼀个函数的返回值,与C语⾔中的含义相同。
SystemVerilog随机控制和随机函数一、随机序列产生事务序列的另一个方法是使用SV的randsequence结构,这对于随机安排组织原子测试序列很有帮助。
initial beginfor(int i = 0; i < 15; i++) beginrandsequence(stream)stream: cfg_read := 1 | //权重分布io_read := 2 |mem_read := 5;cfg_read : {cfg_read_task;} |{cfg_read_task;} cfg_read;io_read : {io_read_task;} |{io_read_task;} io_read;mem_read : {mem_read_task;} |{mem_read_task;} mem_read;endsequenceendend还可以使用randcase来建立随机决策树,但是没有变量可供追踪调试。
initial beginint len;randcase1: len = $urandom_range(0,2);// 10% : 0,1,28: len = $urandom_range(3,5);// 10% : 0,1,21: len = $urandom_range(6,7);// 10% : 0,1,2endcase$display("len=%0d", len);endrandsequence和randcase是针对轻量级的随机控制的应用,可以通过定义随机类取代上述随机控制的功能,并且由于类的继承性使得在后期维护代码时更加方便。
randsequence的相关功能在协调激励组件和测试用例时可能会用到,而randcase则对应着随机约束中的dist权重约束和if-else条件约束的组合。
二、随机函数随机函数pre_randomize()和post_randomize()•有时需要在调用randomize()之前或之后立即执行一些操作,例如在随机前设置类例的一些随机变量(上下限、条件值、权重),或者在随机化之后需要计算随机数据的误差、分析和记录随机数据等。
SystemVerilog中的随机化激励神州龙芯集成电路设计公司杨鑫 徐伟俊 陈先勇 夏宇闻[摘要]:随着集成电路的验证工作日渐复杂,对验证的可靠性提出了越来越高的要求。
传统的验证工作中也使用随机化激励以便减轻测试代码编写的工作量,以提升验证的可靠性。
在SystemVerilog更强调了利用随机化激励函数以提高验证代码的效率和验证可靠性的重要性。
本文以VMM库为例,阐述了如何在SystemVerilog中使用随机化函数来编写高效率的测试代码,重点介绍了可重用验证函数库的使用方法,以帮助读者理解如何使用SystemVerilog高效率地完成复杂的设计验证。
关键字:VMM SystemVerilog 激励随机化1. 前言随着电路工艺设计技术的不断发展,集成电路的逻辑设计变得越来越复杂,随之对验证工作提出了更高的要求。
由于投片(tip-out)的费用较高,很有必要在投片前对芯片设计进行全面、可信的验证,以尽量减少“设计——测试——投片——调试——发现Bug修改设计”这一流程的迭代次数。
因此在集成电路芯片的设计中,尤其是复杂逻辑设计中,对测试工作的效率和可靠性提出了更高的要求。
在传统的验证方法中,也有将激励随机化的方法,这样可以用较少的测试代码生成较多、较全面的测试激励。
这些方法减少了人为因素的干扰,能有效地提高验证的工作效率和可靠性。
在SystemVerilog中,强调在验证中使用可重用的验证IP,包括如何生成随机化激励。
对于如何尽可能地使用已有的验证IP,以及编写符合标准的可重用验证组件,SystemVerilog提供了一整套的工作机制,这使得符合规范的随机化激励组件能够很好地在多个设计间复用,这更进一步地提高了验证工作的效率和可靠性。
2. 在验证中使用随机化激励在验证中,可以依照DUT(Design Under Test,被测设计,以下简称DUT)的验证要求来设计定向的激励,并对照DUT的预期响应,用人工的方法来判断设计是否正确。
但也可以使用随机化激励来驱动DUT,并使用特定的机制来完成响应的自检测。
利用随机化来产生激励可以看作一种近似的自动化激励产生,因为随机化足够长的时间后,所生成的激励可以覆盖绝大部分的待验证特性。
但是纯粹的随机化激励效率并不高,因为其中正确的,或是有意义的激励只占很少一部分。
必须使用一定的约束条件限制随机化的范围,从而产生大量随机而有意义的激励。
3 在SystemVerilog中使用随机化激励SystemVerilog极大地扩展了验证的编写方式,SystemVerilog引入了面向对象的概念,强调基于已有验证库或验证IP,按照面向对象的方法编写可重用的验证组件。
VMM(Verification Methodology Maunul for SystemVerilog,以下简称VMM)是由Synopsys 公司推介的一套SystemVerilog验证解决方案,其中提供了VMM库以供用户在VCS环境下使用。
下文将结合VMM的使用,阐述在SystemVerilog中如何使用随机化激励。
3.1 VMM的验证结构层次VMM使用了一套层次化的验证结构,它将整个验证分为测试、验证平台和DUT三个主要部分,各个分立的测试(Test)通过一个相对稳定的验证平台(Test-Bench)来完成对DUT 的测试,其总体结构如下图所示:在整个结构中,测试平台是最为关键的部分,它负责响应测试的控制,对DUT施加激励,收集DUT的响应,并根据预期值判断、统计和报告测试情况。
其内部也分为若干层次,其中在激励的施加路径上,包括用于产生事务级激励的激励发生器(Generator),用于接收和处理、解析事务的事务处理器(Transactor),以及为事务处理器提供DUT驱动的驱动(Driver)等。
事务处理器和相关驱动是与DUT相关的,提供了测试平台对DUT的抽象和底层信号连接。
激励生成器则是测试平台中的激励源,编写适当的激励发生器,就能够方便灵活地产生各种所需的激励。
3.2数据与事务传统的测试中,数据(data)和激励事务(transaction)一般是一一对应的简单映射关系,这样使得数据(data)不仅难于使用,而且不易维护和更改。
在SystemVerilog中,事务(transaction)被看作是一个对象,使用面向对象的思想来封装数据,这既增强了数据的稳定性和可靠性,而且使事务的相关数据可以灵活地扩展或更改。
在VMM中,提供了基类VMM_DATA作为所有数据型类的基础,利用它我们可以方便地封装所需的数据,例如我们可以声明一个简单的事务bus_trans,用来表示一次总线传输:enum _trans =READ, WRITE;class bus_trans extends vmm_data;rand _trans Trans;rand bit [7:0] ChipSel;rand bit[19:0] Addr;[31:0] Data;rand bitendclass在该例子中,所有属性都被标识为可以随机化——即标明了类型:rand。
实际上如果没有特殊需求,应当将事务的所有属性都应将其标识为可随机化,这是为了能够让激励生成器能够最大限度地生成各种类型的事务。
同时所有的事务属性都应当是共有属性(Public),这样才能通过外部来引用或改变事务的各个属性。
在事务的类声明中,可以根据需要添加一些约束,以便保证所生成的事务是所需要的。
例如可以在上述例子的事务中加入一个约束,以要求片选信号ChipSel只能取1、8、16三个值:class bus_trans extends vmm_data;…{ChipSel inside {1, 8, 16};}constraint chip_selectendclass事务的约束中有些是必须遵守(must-obay)的,例如要求某些属性必须为非零等,这些约束是不能被关闭(turn-off)的,而其他的约束则是应当遵守(should-obay)的,在必要时,可以通过一些操作将其关闭,这些需要根据具体需要来指定。
在测试平台的编写中,事务的定义很重要,只有恰当地定义各种事务,才能有效地完成测试。
在编写事务类时,可以利用其各种面向对象的特性,例如可以使用继承和派生的方式衍生出新的事务类,在需要时重载或重写约束以达到新的边界情况等。
3.3使用工厂模式的激励发生器事务的实例化和随机化都是在激励发生器中完成的,在编写激励发生器时,需要控制激励事务的产生和约束控制等,以便在适当的情况下产生适当的事务。
激励发生器的编写也应该使用面向对象的思想,将事务和相关的操作封装到一个类中。
以便于管理和使用。
在VMM中,提供了基类VMM_XACTOR,用来封装所有与事务处理相关的对象。
激励发生器应当从VMM_XACTOR派生得到,而与此相关的事务处理器等也应从VMM_XACTOR 派生而来。
例如,可以声明如下一个最简单的激励发生器:class bus_master extends vmm_xactor;…main();tastforever beginnew();=bus_trans transtrans.randomize();=voidthis.chan.put_t(trans);endendtaskendclass这样就可以产生并随机化事务,然后将其通过通道传输到下游的事务处理器。
但是,使用这种简单的实例化方的激励发生器仍然不够灵活,其中一个主要问题是:如何通过激励发生器为事务添加新的约束块。
通过添加新的约束块来产生必须的激励事务是非常有效的控制方式,但采用上述控制方式的激励发生器要做到这一点却并不容易。
因为对于这种激励发生器,如果需要添加新的约束,就必须改写激励发生器的源代码。
这将极大地影响其使用的灵活性。
因此这里需要使用面向对象思想的又一思想:工厂模式(factory Pattern)。
使用工厂模式的思想来建立激励发生器,使之成为一个生产“事务”的“工厂”,而生产所需的“原料”则由更高层次的测试来控制和提供。
例如,编写形如下面所示的激励发生器:class bus_master_factory extends vmm_xactor;bus_trans trans = new();run();tastbeginwhile(run)bus_trans tr;trans.randomize();void=trans.copy());$cast(tr,process(tr);endendtaskendclass该激励发生器在运行时将会不断地将其属性trans随机化,然后将随机化的结果复制成一个新的实例,最后将这个新复制的实例经过处理发送到下游。
在整个流程中,其起点是类属性trans,该属性在该激励发生器实例化时会自动实例化,但是,在启动任务run()之前,外界,也就是更高层次的测试是可以将其替换成其他新实例的,只要新实例是属性trans所属类bus_trans的同类实例或派生类实例即可。
这样的话,如果需要加入新的约束,只需派生出相关的新类,在新类中加入所需约束,并用新类的实例替换工厂实例即可得到所需的效果。
例如,在下面所示的例子中,根据原有的事务类派生出了新类,并在新类中增加了约束,最后在测试中替换了原工厂实例:class my_bus_trans extends bus_trans;=0;}constraint new_constraint{addr[19:18]endclassprogram testverif_envenv;initial beginenv = new();env.build();beginnew();my_bus_trans my_trans =my_trans;=env.src[0].transendenv.run();endendprogram在该例中,在验证环境完成初始化之后,整个验证环境运行前,使用my_bus_trans类的实例my_trans替换了验证环境env中的激励发生器src[0]的工厂实例trans。
使用工厂模式的激励发生器大大提高了激励发生器使用时的灵活性,激励发生器应尽量使用工厂模式。
5 受控随机化激励生成依照所需激励的不同,可以编写出各种不同的激励发生器,其具体形态和复杂度也相差很大。
在VMM中,根据激励发生器的特性,可以将激励发生器大致分为:基元发生器(Atomic Generator),场景发生器(Scenario Generator),多流发生器(Mutil-Stream Generator)以及基于状态的发生器(State-Dependent Generator)。
下面就简要介绍一下各种发生器的特点和基本用途。