SystemVerilog 中的随机化激励

合集下载

一个牛人的Systemverilog总结

一个牛人的Systemverilog总结

一个牛人的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语言简介(doc26)-25页精选文档

SystemVerilog语言简介(doc26)-25页精选文档

SystemVerilog语言简介SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。

SystemVerilog由Accellera开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。

下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。

1. 接口(Interface)Verilog模块之间的连接是通过模块端口进行的。

为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。

不幸的是,在设计的早期,我们很难把握设计的细节。

而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。

另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。

SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。

接口在关键字interface和endinterface之间定义,它独立于模块。

接口在模块中就像一个单一的端口一样使用。

在最简单的形式下,一个接口可以认为是一组线网。

例如,可以将PCI总线的所有信号绑定在一起组成一个接口。

通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。

随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。

当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。

下面是一个接口的使用实例:实际上,SystemVerilog的接口不仅仅可以表示信号的绑定和互连。

受约束的随机化

受约束的随机化

endclass
module top; Transaction tr =new; initial begin :random_repeat #20 repeat (32) begin if ( tr.randomize() == 1 ) $display("addr = %16h data = %h\n", tr.addr,tr.data); else $display("Randomization failed.\n"); end end :random_repeat endmodule
组合的约束举例:以太网中payload等于13-14个字节 序列的约束举例:当一个申请之后,应答需要在4-10个周期内给出
简单的例子
例子说明: 随机变量使用rand/randc修饰词 使用约束constraint确定变量的 范围 调用类的randomize函数来执行 随机化,如果遇到随机化问题, randomize函数返回0 普通随机数rand 循环随机数randc
需随机化的设计配置:
随机约束的简介
随机约束目的:
使用随机激励能够节省人力和时间,但是纯粹的随机激励是接近无限 空间的,没有实际使用价值。所以限制和规定随机激励的自由度,以 产生既随机又让人感兴趣的测试场景 能够表达复杂的场景 可以灵活地、动态地控制随机数 可以产生组合的或者序列的约束
随机约束特点: 约束块的位置: Nhomakorabea部class A; rand integer x; constraint c { x < 0; } endclass class B extends A; constraint c { x > 0; } endclass

systemverilogfortestbench

systemverilogfortestbench

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验证方法引言在现代芯片设计中,验证是一个非常重要的环节。

SystemVerilog 是一种常用的硬件描述语言,有许多验证方法可以帮助设计人员有效验证设计的正确性。

本文将详细介绍一些常用的SystemVerilog验证方法。

1.仿真验证方法•使用仿真工具进行功能验证–利用Simulator工具来模拟设计行为以进行功能验证。

验证工程师可以编写testbench来生成输入数据,驱动设计的输出,并进行断言验证。

–通过创建各种激励来测试设计中的不同情况,包括边界情况、异常情况和极端情况等。

•波形分析验证–利用仿真工具生成波形,并分析波形来验证设计的正确性。

可以检查信号的时序关系、逻辑等,并比较期望结果和实际结果。

波形分析验证可以在不同抽象级别进行,包括电平验证、逻辑状态验证和功能验证等。

2.形式验证方法形式验证是一种使用形式工具来验证设计是否满足规范的方法。

形式工具基于设计的数学模型进行验证,可以全面而快速地验证设计的正确性。

•模型检查方法–使用形式工具对设计进行形式化建模,并使用模型检查器来验证设计是否满足特定的属性。

设计人员需要编写属性规范来描述设计的期望行为,并利用模型检查器来自动验证属性是否满足。

•定理证明方法–使用形式工具来进行数学定理的证明来验证设计的正确性。

设计人员需要将设计抽象为一个形式化的数学模型,并利用定理证明器来验证设计是否满足特定的性质。

3.边界扫描方法边界扫描方法是一种将设计周围的接口边界进行扫描以验证设计的方法。

•验证接口协议–针对设计中使用的接口协议,可以编写验证环境来验证接口协议是否正确地被设计所遵循。

验证环境可以利用随机算法生成各种接口交互情况,并验证设计的响应是否满足接口协议规定的规范。

•验证接口互连–针对设计中的各个接口之间的互连,可以编写验证环境来验证互连是否满足设计的要求。

验证环境可以生成接口交互的各种情况,并验证互连的正确性和稳定性。

一个牛人的Systemverilog总结

一个牛人的Systemverilog总结

一个牛人的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 推荐使用文本宏。

SystemVerilog中的随机化激励

SystemVerilog中的随机化激励

ChinalntegratedCircultSystemVerilog中的随机化激励神州龙芯集成电路设计公司杨鑫徐伟俊陈先勇夏宇闻摘要:随着集成电路的验证工作日渐复杂,对验证的可靠性提出了越来越高的要求。

传统的验证工作中也使用随机化激励以便减轻测试代码编写的工作量,以提升验证的可靠性。

在SystemVerilog更强调了利用随机化激励函数以提高验证代码的效率和验证可靠性的重要性。

本文以VMM库为例,阐述了如何在SystemVerilog中使用随机化函数来编写高效率的测试代码,重点介绍了可重用验证函数库的使用方法,以帮助读者理解如何使用SystemVerilog高效率地完成复杂的设计验证。

关键字:VMMSystemVerilog激励随机化1.前言随着电路工艺设计技术的不断发展,集成电路的逻辑设计变得越来越复杂,随之对验证工作提出了更高的要求。

由于投片(tip-out)的费用较高,很有必要在投片前对芯片设计进行全面、可信的验证,以尽量减少“设计———测试———投片———调试———发现Bug修改设计”这一流程的迭代次数。

因此在集成电路芯片的设计中,尤其是复杂逻辑设计中,对测试工作的效率和可靠性提出了更高的要求。

在传统的验证方法中,也有将激励随机化的方法,这样可以用较少的测试代码生成较多、较全面的测试激励。

这些方法减少了人为因素的干扰,能有效地提高验证的工作效率和可靠性。

在SystemVerilog中,强调在验证中使用可重用的验证IP,包括如何生成随机化激励。

对于如何尽可能地使用已有的验证IP,以及编写符合标准的可重用验证组件,SystemVerilog提供了一整套的工作机制,这使得符合规范的随机化激励组件能够很好地在多个设计间复用,这更进一步地提高了验证工作的效率和可靠性。

2.在验证中使用随机化激励在验证中,可以依照DUT(DesignUnderTest,被测设计,以下简称DUT)的验证要求来设计定向的激励,并对照DUT的预期响应,用人工的方法来判断设计是否正确。

基于OPNET的校园网网络性能仿真

基于OPNET的校园网网络性能仿真

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 作者简介:张锋,讲师,主要研究方向为信息与通信工程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)。

下面就简要介绍一下各种发生器的特点和基本用途。

相关文档
最新文档