systemverilog验证学习笔记
System-Verilog-与功能验证分析
功能验证技术和方法学概要
功能验证技术和方法学概要
激励产生形式 1)用户直接输入,即直接测试(direct test)。 2)种子随机生成,即随机测试(random test)。 3)用户可控的随机输入,即约束随机测试 (constraint random test)
实际项目中我们通常三者结合着去检查比对结果。
功能验证技术和方法学概要
功能验证流程 验证过程可以被分解成三个主要阶段: 1)制定验证策略和验证计划; 2)创建验证平台,运行和调试; 3)覆盖率分析和回归测试。
功能验证技术和方法学概要
制定验证策略和验证计划
功能验证技术和方法学概要
创建验证平台,运行和调试;
System Verilog 与功能验证
功能验证技术和方法学概要
为什么需要IC验证 IC设计复杂度巨大,规模已达上亿门级。 70%验证, 30%设计。 验证是IC设计的关键部分。
功能验证技术和方法学概要
功能验证技术和方法学概要
什么是验证 验证是确保设计和预定的设计期望一致(吻合) 的过程。
功能验证技术和方法学概要
覆盖率驱动验证 覆盖率驱动验证方法学涉及以下技术: 事务级验证、约束随机激励产生、自动化结果 比较、覆盖率统计分析和直接测试。
功能验证技术和方法学概要
事务级验证 事务级验证允许在一个更高的抽象层次来创建 验证场景。 信号级VS事物级:低效VS高效,简单VS复杂。
功能验证技术和方法学概要
功能验证技术和方法学概要
覆盖率分析和回归测试
功能验证技术和方法学概要
Systemverilog的一个牛人总结
Systemverilog的一个牛人总结SystemVerilog是一种硬件描述语言,用于设计和验证硬件系统。
它是Verilog的扩展版本,提供了更丰富的特性和功能,使得硬件设计变得更加灵活和高效。
在SystemVerilog的大家庭中,有许多牛人通过深入研究和实践,掌握了该语言的精髓,并在硬件设计和验证领域取得了杰出的成绩。
下面是对SystemVerilog牛人的一些总结:1. 对SystemVerilog语言精通:牛人对SystemVerilog语言的语法和语义有着深入的理解,并能充分利用其强大的特性来设计和验证复杂的硬件系统。
他们熟悉SystemVerilog中各种数据类型、控制结构、模块化设计、接口和并发编程等方面的内容,并能灵活运用这些知识来解决实际问题。
2. 良好的编码风格和规范:牛人在编写SystemVerilog代码时,注重良好的编码风格和规范,使得代码易读、易于维护。
他们遵循一致的命名规则,使用有意义的变量名和模块名,编写清晰的注释,避免使用过于复杂的语法和结构,以及注意代码的可重用性和可扩展性。
3. 高效的调试和验证技巧:SystemVerilog牛人具备高效的调试和验证技巧,能够快速定位和解决设计和验证中的问题。
他们熟悉仿真工具的使用方法,能够利用断点、波形查看器、覆盖率分析等功能来分析和调试代码。
此外,他们还熟悉常见的验证方法和技术,如约束随机测试、功能覆盖率分析和形式化验证等,以确保设计的正确性和完整性。
4. 广泛的项目经验:SystemVerilog牛人在硬件设计和验证领域有着广泛的项目经验,涉及多个行业和应用领域。
他们参与过各种规模和复杂度的项目,从小规模的IP设计到大型的SoC设计和验证。
通过这些项目的实践,他们积累了丰富的经验和技巧,能够在不同的项目中灵活应对各种挑战。
5. 持续学习和研究的态度:SystemVerilog牛人具备持续学习和研究的态度,不断追求自我提升和突破。
Verilog学习笔记
Verilog学习笔记作者:桂。
时间:2017-06-24 11:07:40前⾔Verilog是硬件描述语⾔,不算FPGA的核⼼部分,以前没有接触过,找了本书翻看⼀下(《Verilog数字系统设计教程第三版》),顺便记录⼀些基础知识,从第三章开始。
第三章:模块结构、基本数据类型、基本运算符 A-模块的结构0、模块基本定义⼀个基本的模块就是:module name(in1,in2,...out1,out2,...)//内部逻辑endmodulw模块基本定义涉及两个要点:1)其他模块作为input的调⽤;2)I/O位宽的设定。
1、always⽤法情形⼀:有 always @(a or b) beginif(a) q<=b;else q<=0;end这个块是每当 a b发⽣变化时执⾏还是a或者b中有⼀个是1或2个都是1时执⾏?答:每当A,B变化时,这个块就执⾏。
ALWAYS后⾯的叫敏感参数列表,不表⽰信号值,⽽是信号变化触发这个块的执⾏。
⼀般的,如果ALWAYS块的敏感参数列表没有带时钟,这个块将被综合成⼀个组合回路。
参照组合回路的真值表。
当输⼊端任何⼀个信号变化时,输出将⽴即做相应的变化。
如果ALWAYS后代的是时钟,那ALWAYS块将被综合成⼀个时序回路。
⼀般情况下,当时钟变化时,ALWAYS块执⾏。
情形⼆:always @(a) begin如果这个a被定义为⼀个reg [4:0]时程序怎么判断执⾏?答:如果综合逻辑没有问题,就是a的每⼀个元素变化时,这个块都要执⾏。
2、assign、wire、always则块的描述语⾔为:module muxtwo(out,a,b,s1)input a,b,s1;//输⼊信号output out;//输出wire ns1,sela,selb; //定义内部连接线assign ns1 = ~s1;assign sela = a&ns1;assign selb = b&s1;assign out = sela|selb;endmodule 其中assign声明语句。
systemverilog验证方法
systemverilog验证方法SystemVerilog验证方法引言在现代芯片设计中,验证是一个非常重要的环节。
SystemVerilog 是一种常用的硬件描述语言,有许多验证方法可以帮助设计人员有效验证设计的正确性。
本文将详细介绍一些常用的SystemVerilog验证方法。
1.仿真验证方法•使用仿真工具进行功能验证–利用Simulator工具来模拟设计行为以进行功能验证。
验证工程师可以编写testbench来生成输入数据,驱动设计的输出,并进行断言验证。
–通过创建各种激励来测试设计中的不同情况,包括边界情况、异常情况和极端情况等。
•波形分析验证–利用仿真工具生成波形,并分析波形来验证设计的正确性。
可以检查信号的时序关系、逻辑等,并比较期望结果和实际结果。
波形分析验证可以在不同抽象级别进行,包括电平验证、逻辑状态验证和功能验证等。
2.形式验证方法形式验证是一种使用形式工具来验证设计是否满足规范的方法。
形式工具基于设计的数学模型进行验证,可以全面而快速地验证设计的正确性。
•模型检查方法–使用形式工具对设计进行形式化建模,并使用模型检查器来验证设计是否满足特定的属性。
设计人员需要编写属性规范来描述设计的期望行为,并利用模型检查器来自动验证属性是否满足。
•定理证明方法–使用形式工具来进行数学定理的证明来验证设计的正确性。
设计人员需要将设计抽象为一个形式化的数学模型,并利用定理证明器来验证设计是否满足特定的性质。
3.边界扫描方法边界扫描方法是一种将设计周围的接口边界进行扫描以验证设计的方法。
•验证接口协议–针对设计中使用的接口协议,可以编写验证环境来验证接口协议是否正确地被设计所遵循。
验证环境可以利用随机算法生成各种接口交互情况,并验证设计的响应是否满足接口协议规定的规范。
•验证接口互连–针对设计中的各个接口之间的互连,可以编写验证环境来验证互连是否满足设计的要求。
验证环境可以生成接口交互的各种情况,并验证互连的正确性和稳定性。
System-Verilog笔记总结
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]; Ref int array[ ]);If(len<0) begin$display(“Bad len”);【Returun;rant,.request,.rst,.clk);Test t1(arbif);Endmodule[l Modport背景:端口的连接方式包含了方向信息,编译器依次来检查连续错误;接口使用无信号的连接方式。
SystemVerilog断言学习笔记复习过程
S y s t e m V e r i l o g断言学习笔记SystemVerilog断言学习笔记1一、前言随着数字电路规模越来越大、设计越来越复杂,使得对设计的功能验证越来越重要。
首先,我们要明白为什么要对设计进行验证?验证有什么作用?例如,在用FPGA进行设计时,我们并不能确保设计出来的东西没有功能上的漏洞,因此在设计后我们都会对其进行验证仿真。
换句话说,验证的目的是彻底地验证被测设计以确保设计没有功能上的缺陷。
而即将介绍的SystemVerilog断言便是一门重要的验证技术,它可以尽早发现设计的缺陷以及提高验证的效率。
二、基本概念1、什么是断言断言是设计属性的描述。
而断言可以从设计的功能描述中推知,然后转换成断言。
那么断言是如何表现的呢?当一个被检查的属性不像我们期望的那样表现时,则该断言失败;当一个禁止在设计中出现的属性发生时,则该断言失败。
2、为什么要使用SystemVerilog断言Verilog HDL也能实现断言,但其存在不足之处:•Verilog HDL是一种过程语言,不能很好地控制时序;•Verilog HDL是一种冗长的语言,随着断言数量的增加,维护代码将变得很困难;•语言的过程性使得测试同一时间段内发生的并行事件相当困难;•Verilog HDL没有提供内嵌的机制来提供功能覆盖的数据。
而SystemVerilog断言具有如下特征:•它是一种描述性语言,可以完美描述时序的状况;•语言本身非常精确且易于维护;•语言的描述性提供了对时间卓越的控制;•它提供了若干个内嵌函数来测试特定的设计情况,并且提供了一些构造来自动收集功能覆盖数据。
可见,使用SystemVerilog断言具有非常大的优势。
三、验证平台一个包含SystemVerilog断言的验证环境如下图所示:注:约束随机测试平台可以用来产生更多真实的验证情景;代码覆盖则是验证完整性的基本衡量标准。
一般情况下,测试平台需要做三件事:•产生激励;•自检机制;•衡量功能覆盖。
systemverilog验证学习笔记
=阻塞串行<=非阻塞并行1)时序逻辑----使用非阻塞赋值2)锁存器----使用非阻塞赋值3)用always块生成的组合逻辑----用阻塞赋值4)在同一个always块中既有时序逻辑又有组合逻辑--- 用非阻塞赋值5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值6)不要在一个以上的always块中对同一个变量赋值7)用$strobe显示用非阻塞赋值指定的变量值8)不要用#0 过程性赋值Modport将信号分组并指明方向函数不能消耗时间,不能有#100@(posedge clk)wait之类的阻塞语句Interface arb_if(input bit clk);Logic [1:0] a,b;Logic rst;Modport test(output a,rst,Input b,clk);EndinterfaceModule arb(arb_if.test arbif);…………Endmodule数组定位Int tq[$],d[]=’{9,1,8,3,4,4};Tq=d.find_index(x) with (item>3); //{0,2,4,5}得到的是脚标Tq=d.find with (item>3); //{9,8,4,4}数组求和Int count,total;Count=d.sum with(item>7); //2:{9,8} 返回结果为元素与7比较表达式返回1为真或者零这里面返回,{1,0,1,0,0,0}求和得2Total=d.sum with ((item>7)*item) ; //{1,0,1,0,0,0}和对应元素相乘求和得17=9加8数组排序d.reverse(); //逆序d.sort(); //从小到大d.rsotr(); //从大到小d.shuffle();时钟块指定同步信号相对于时钟的时序Interface arb_if(input bit clk);Logic [1:0] a,b;Logic rst;Clocking cb @(posedge clk);Output a;Input b;Modport test(output rst,Clocking cb);EndinterfaceModule arb(arb_if.test arbif);Initial beginA<=0;@arbif.cb;$dispiay(………..)Endmodule断言A1:assert(==2’b01)Else $error(“grant not asserted”);四种有输出消息的函数可在断言内部使用$info$waring$error$fatal要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的2~4个时钟周期内,信号b应该为高电平”。
uvm system verilog总结
uvm system verilog总结### UVM System Verilog 总结#### 导语UVM(Universal Verification Methodology)与System Verilog的结合,为芯片设计验证领域带来了革新。
这种方法论不仅提高了验证效率,还增强了验证的可重用性和覆盖率。
本文将全面总结UVM与System Verilog的相关概念、特点以及应用。
---#### 一、UVM与System Verilog概述**1.1 UVM简介**UVM是建立在System Verilog基础上的一个标准化验证方法论,旨在提供一种通用的、模块化的验证平台。
它通过将验证环境分层,实现了环境的可重用性和易于维护性。
**1.2 System Verilog简介**System Verilog是一种硬件描述和验证语言,结合了Verilog和VHDL的优点,并增加了面向对象编程的特性。
它在芯片设计和验证中广泛应用。
---#### 二、UVM的核心特点**2.1 面向对象**UVM采用面向对象的设计思想,将验证环境分为不同的类和层次,便于管理和重用。
**2.2 模块化**UVM的模块化设计使得验证环境可以根据不同的测试需求灵活组合和配置。
**2.3 自动化**UVM支持自动化测试,包括自动生成测试序列、自动检查和报告错误等。
---#### 三、System Verilog在UVM中的应用**3.1 非阻塞赋值**System Verilog的非阻塞赋值在UVM中用于描述硬件行为。
**3.2 面向对象编程**System Verilog的面向对象编程特性使得UVM可以定义基类和派生类,实现代码的复用。
**3.3 功能覆盖**利用System Verilog的功能覆盖(Functional Coverage)特性,UVM 可以全面检查设计功能的覆盖率。
---#### 四、UVM与System Verilog的结合优势**4.1 提高验证效率**UVM与System Verilog的结合使得验证人员可以快速搭建验证环境,提高验证效率。
SystemVerilog验证方法学介绍
前言:芯片验证中虽然传统验证方法尽力保持技术更新步伐以适应设计尺寸以及复杂度的增加,但验证依然是当前SoC以及可重用IP模块设计中面临的最大挑战。
1 SystemVerilog验证方法学介绍芯片验证中虽然传统验证方法尽力保持技术更新步伐以适应设计尺寸以及复杂度的增加,但验证依然是当前SoC以及可重用IP模块设计中面临的最大挑战。
解决这个问题的方法是采用有丰富语义支持的标准语言,以及可重用,覆盖率为驱动的验证方法学。
这是文章中的第一部分:介绍由SystemVerilog硬件设计验证标准语言支持的验证方法学。
此方法学在《VMM for SystemVerilog》一书中有全面介绍。
《VMM for SystemVerilog》致力于如何建立一个可升级,可预期,可重用的验证环境,使得用户能充分利用断言性,重用性,验证平台自动生成,覆盖率,形式分析以及其他先进验证技术特点,从而帮助解决RTL以及系统级中验证技术问题。
如此一个环境能在芯片迈出成功第一步时增加用户验证信心。
《VMM for SystemVerilog》目的是针对所有SoC,IP项目建立一个高效,可控验证过程。
《VMM for SystemVerilog》来源于业界领先的ARM公司,Synopsys公司(新思科技)及其客户经验。
1.1 验证面临挑战随着SoC,IP验证复杂度持续增加,有相应的新验证技术产生,但设计能力与验证所能提供信心之间鸿沟仍然巨大。
多次调查显示有一半到三分之二的SoC项目在第一次流片失败,而功能缺陷的存在是其中主要原因。
这些统计显示了要验证当今设计所具有的固有难度。
复杂模块,尤其在集成到一起后,很难在验证中将芯片实际运用可能遇到的所有条件模拟执行。
预期到所有可能边界条件(corner cases),以及发现设计中深层次设计缺陷是验证面临的关键挑战之一。
非常紧迫的是在规定项目资源以及time-to-market需求情况下,项目过程中花费最小代价尽可能早发现设计缺陷。
SystemVerilogOOP学习笔记
SystemVerilogOOP学习笔记1、OOP术语a.类(class):包含变量和⼦程序(函数或者任务)的基本构建块。
b.对象(object):类的⼀个实例。
c.句柄(handle):指向对象的指针。
d.属性(property):存储数据变量。
e.⽅法(method):任务或者函数中操作变量的程序性代码。
f.原型(prototype):程序的头,包括程序名、返回类型和参数列表。
程序体则包含了执⾏代码。
类是对象的⼀个模板,其内部定义了数据和⽅法。
对象是类的⼀个例化和实现。
注:《SystemVerilog验证测试平台编写指南》中使⽤变量(variable)和程序(routine),⽽没有使⽤OOP中的属性(property)和⽅法(method)。
2、⽤户使⽤对象的三个步骤: a.定义类:1class packet;2 ...3 endclass:packet45class long_packet;6 ...7 endclass:long_packet b.在module、class、function、task等地⽅声明对象:1 packet my_packet;2 packet packet_array[32];3 long_packet my_l_packet;对象标识符(my_packet/packet_array/my_l_packet)是例化该对象的句柄(指向对象的指针)。
当该对象被创建的时候,该句柄有效,默认情况下句柄将为空(null)。
c.通过构造函数new创建对象的例化通过new这个构造函数给对象分配内存空间,并且把⼊⼝地址赋给对象的句柄:1 my_packet=new(168);2 my_l_packet=new();例5.1 简单的Transaction类1class Transaction;2 bit [31:0] addr,crc,data[8];34 function void display;5 $display("Transaction:%h",addr);6 endfunction:display78 function void calc_crc;9 crc=addr^data.xor;10 endfunction:calc_crc1112 endclass:Transaction3、在哪⾥定义类?program、module、package中。
system_verilog 验证小技巧与案例
system_verilog 验证小技巧与案例在SystemVerilog中,验证是非常重要的一步,可以帮助我们检查设计的正确性并确保其按预期工作。
以下是一些SystemVerilog验证的小技巧和案例。
1.使用断言(assertions)进行验证:断言是一种在代码中插入的逻辑语句,用于在运行时检查特定条件。
它们可以帮助我们捕捉设计中的错误和问题。
例如,对于一个FIFO设计,我们可以编写一个断言来检查写入和读取操作是否按照预期进行。
`assert (wr_en === (rd_en === 0));`这个断言会在写使能和读使能同时为1时进行验证,以确保读写操作不会同时进行。
2.使用模拟环境进行验证:在验证过程中,我们通常需要创建一个模拟环境来模拟设计的行为。
这个环境通常包括一个测试程序和设计的驱动程序、监听器和功能模型等。
测试程序主要用于生成输入和验证输出,而驱动程序则负责将测试向设计输入,监听器则用于捕获设计的输出并与期望值进行比较,功能模型则用于模拟设计的行为。
例如,对于一个简单的计数器设计,我们可以编写一个测试程序来递增计数器的值,并验证计数器的值是否按预期递增。
3.使用覆盖率分析:覆盖率分析是一种用于确定设计代码是否已被完全测试的方法。
SystemVerilog提供了覆盖率分析的功能,可以帮助我们确定代码的覆盖率,并找出未被完全测试的部分。
覆盖率分析可以使用covergroup和coverpoints来实现。
covergroup提供了用于组织和管理覆盖率数据的方法,而coverpoints则用于指定要测试的代码的特定部分。
例如,对于一个模块,我们可以使用covergroup来收集每个输入组合的覆盖率,并确定哪些输入组合尚未被测试到。
4.使用随机化测试:SystemVerilog提供了一些功能,例如randomize()和randomize_with(),可用于生成随机输入并对设计进行测试。
system verilog笔记
第三章数据类型3.3 整数数据类型shortint两态SystemVerilog数据类型,16位有符号整数int两态SystemVerilog数据类型,32位有符号整数longint两态SystemVerilog数据类型,64位有符号整数byte两态SystemVerilog数据类型,8位有符号整数或ASCII码字符bit两态SystemVerilog数据类型,用户定义的向量尺寸logic四态SystemVerilog数据类型,用户定义的向量尺寸reg四态Verilog-2001数据类型,用户定义的向量尺寸integer四态Verilog-2001数据类型,32位有符号整数time四态Verilog-2001数据类型,64位无符号整数3.3.1 integral类型integral指的基本的整数数据类型、压缩数组、压缩结构体、压缩联合体、枚举类型和时间类型。
3.3.2 两态(两值)与四态(四值)数据类型具有未知值(X)和高阻值(Z)的类型称为四态类型,包括logic、reg、integer和time。
其它不具有未知值及高阻值的类型称为两态类型,例如bit和int。
int和i nteger的区别是:int是两态逻辑而integer是四态逻辑。
四态值需要一个额外的位来编码X和Z状态。
两态数据类型的仿真速度更快一些,而且占用更少的内存,因而在某些设计风格中成为首选数据类型。
3.3.3 有符号与无符号数据类型整数类型使用整数算术,并且可以是有符号的也可以是无符号的。
这些会影响某些操作码的含义,例如“<”等int unsigned ui;int signed si;缺省情况下,byte、shortint、int、integer和longint是有符号的。
bit、reg、logic 以及这几种类型的数组在缺省情况下是无符号的。
注意:signed关键字是Verilog-2001的一部分。
unsigned关键字在Verilog-2001中是保留关键字,但未被使用。
system verilog语法总结
system verilog语法总结以下是SystemVerilog语法的总结:1. 模块:SystemVerilog程序由一个或多个模块组成,模块是设计的构建块。
模块可以是分层的,可以包含其他模块或模块实例。
2. 端口:模块可以有输入、输出或双向端口。
端口声明指定传入或传出模块的信号的数据类型、方向和大小(如果适用)。
3. 数据类型:SystemVerilog支持各种数据类型,包括整数、实数、布尔值和字符串。
它还提供了数组和结构等复合类型。
4. 变量:在SystemVerilog中,可以使用"reg"或"logic"关键字声明变量。
它们可以是任何支持的数据类型,并且可以使用过程语句赋值。
5. 过程块:SystemVerilog提供了类似"always"、"initial"和"task/function"的过程块。
这些块允许您使用过程语句(如if-else、for循环、while循环等)来定义设计的行为。
6. 连续赋值:连续赋值用于描述模块内的组合逻辑。
它们使用assign关键字,并指定确定左侧信号值的右侧表达式。
7. 运算符:SystemVerilog支持各种运算符,包括算术、位、逻辑、比较和连接运算符。
这些运算符允许您对信号和变量进行操作。
8. 行为建模:SystemVerilog允许使用过程块、任务和函数进行行为建模。
这使您能够使用高级编程结构描述设计的功能。
9. 测试台:测试台是用于验证设计功能的单独模块或一组模块。
它生成输入刺激并监视输出,以确保正确操作。
10. 验证构造:SystemVerilog提供了各种验证构造,如断言、覆盖属性和带有随机刺激生成的测试台。
这些构造有助于验证设计的正确性。
请注意,这只是SystemVerilog语法的简要总结。
根据您的具体要求和用例,还有许多更多的功能和细节可以探索。
systemverilog与验证方法
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验证学习笔记汇总
=阻塞串行<=非阻塞并行1)时序逻辑----使用非阻塞赋值2)锁存器----使用非阻塞赋值3)用always块生成的组合逻辑----用阻塞赋值4)在同一个always块中既有时序逻辑又有组合逻辑--- 用非阻塞赋值5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值6)不要在一个以上的always块中对同一个变量赋值7)用$strobe显示用非阻塞赋值指定的变量值8)不要用#0 过程性赋值Modport将信号分组并指明方向函数不能消耗时间,不能有#100@(posedge clk)wait之类的阻塞语句Interface arb_if(input bit clk);Logic [1:0] a,b;Logic rst;Modport test(output a,rst,Input b,clk);EndinterfaceModule arb(arb_if.test arbif);…………Endmodule数组定位Int tq[$],d[]=’{9,1,8,3,4,4};Tq=d.find_index(x) with (item>3); //{0,2,4,5}得到的是脚标Tq=d.find with (item>3); //{9,8,4,4}数组求和Int count,total;Count=d.sum with(item>7); //2:{9,8} 返回结果为元素与7比较表达式返回1为真或者零这里面返回,{1,0,1,0,0,0}求和得2 Total=d.sum with ((item>7)*item) ; //{1,0,1,0,0,0}和对应元素相乘求和得17=9加8数组排序d.reverse(); //逆序d.sort(); //从小到大d.rsotr(); //从大到小d.shuffle();时钟块指定同步信号相对于时钟的时序Interface arb_if(input bit clk);Logic [1:0] a,b;Logic rst;Clocking cb @(posedge clk);Output a;Input b;Modport test(output rst, Clocking cb);EndinterfaceModule arb(arb_if.test arbif); Initial beginArbif.cb.a<=0;@arbif.cb;$dispiay(………..)Endmodule断言A1:assert(bus.cb.a==2’b01)Else $error(“grant not asserted”);四种有输出消息的函数可在断言内部使用$info$waring$error$fatal要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的2~4个时钟周期内,信号b应该为高电平”。
SystemVerilog 芯片验证8-功能覆盖
4 module adder #(parameter WIDTH = 4) (
5 input clk,
6 input rst_n,
7 input [WIDTH-1:0] a,
8 input [WIDTH-1:0] b,
9 output reg [WIDTH:0] sum);
10
11 always @(posedge clk, negedge rst_n) begin
10 / 50
覆盖组的触发
覆盖组的触发
功能覆盖的主要内容包括采样数据和采样触发条件。当新数据准备好时(例如 发送完一个事务),测试平台便会触发覆盖组。触发覆盖组的主要方式如下。
1 如果代码中不存在标识何时采样的信号或事件,或者一个覆盖组中有多个 实例需要独立触发,这时应该使用 sample 方法显式触发覆盖。
3 状态机覆盖(FSM coverage):即状态机里所有可能发生的状态跳转都要被 遍历到。
4 分支覆盖(branch coverage):即 DUT 的所有模块的每个条件分支是否有 被执行过(包括 if、else 和 case 语句等)。
5 翻转覆盖(toggle coverage):即 DUT 的每个模块的信号(包括端口信号和 内部信号)是否有被翻转过(即每个信号都从 0 到 1 或从 1 到 0 变化过)。 例如异步复位信号 rst_n 只从 0 到 1 翻转过,但没有从 1 到 0 翻转过,那 么这个信号没有被翻转覆盖。
->>done; // 触发事件
23
end
24 endtask
25 endclass
SystemVerilog 芯片验证
2023 年 11 月 21 日
7、systemverilog语法和验证相关流程
1、IC验证环境的基本框图测试平台发生器(generator)用来解释testcase,其实也就是把testcase 翻译成具体的数据包,或者数据码流。
代理这个东西就是把数据分配下去,他与记分板和检测器一起称为功能层。
记分板(scoreboard)用来临时存放一些数据,用于数据的比较。
常与检测器合在一起,共同完成数据的比较,查错。
他们要实现的一个与待测设计相同功能的模块,用于自动比较的。
其实也就是要设计一个能实现相同功能的模块,一般小的模块这部分设计都是由验证工程师自己完成的,如果是复杂的模块由于验证工程师还要关注其他的模块,这块功能可以由其他地方提供,比如一些现成的C语言代码,验证工程师把这个C代码嵌入的验证环境中就可以了,这个地方的实现方式比较多,也是验证的一个精华的地方吧。
主要的debug也就在这个地方实现的。
驱动层(driver)顾名思义,就是用来驱动我们的待测设计(DUT (device under test))。
就是把数据包处理成具体的操作激励,也就是那些波形了。
监测器(monitor)用来采集待测设计(DUT)的输出波形,然后传回scoreboard用于和标准结果比较,验证DUT工作是否正确。
断言(assert)是个好东西,但是如果紧紧依靠验证工程师这个东西是没办法用好的,这个东西非常需要设计人员配合。
Assert功能很强大,也很容易上手,能深层次的发掘设计错误,定位很准确,也正是由于这些优点,所以验证工程师不能非常容易的使用它,因为验证工程师一般可以不需要了解太多的设计细节就可以对设计模块进行验证,但是assert需要比较清楚的了解内部信号,才能将内部信号连接到相应的assert上。
建议IC设计工程师学习哦。
对debug很有帮助的哦。
这个模块在有的验证环境中是不使用。
最后说一下覆盖率的问题。
覆盖率分为功能覆盖率,代码覆盖率,还有人为添加的一些覆盖点的覆盖率。
这个其实就是用来衡量验证工作进行到什么程度了。
systemverilog学习(1)基础
systemverilog学习(1)基础⼀:认识sv1:关键字 verification,assertion,coverage,功能验证,simulation技术,OOP属性2:主要内容 (1)verification plan and environment,验证计划,⽬标 (2)sv constructs;sv的语法 (3)sv testbench 的架构 (4)Interface (5)OOP (6)randomization;随机化 (7)Threads;语句如何执⾏ (8)Interprocess communication ;内部通信 (9)function coverage;功能覆盖率 (10)Assertions3:关于sv的testbench的架构 (1)产⽣stimulus (2)将stimulus应⽤到DUV(design under verification) (3)capture the response (4)check 响应的正确性 (5)对验证的整体⽬标进⾏检查4:soc设计架构 design与verification并⾏ regression:回归测试;在增加新功能时,要保证原有功能不会有问题RTL freeze:前仿5:设计⽅法· (1)Top_dowm (2)Buttom_up (3)reuse:parameter,IP (4)lower power (5)verification Methodology:UVM,OVM,VMM,VIP,AIP⼆:验证环境1:verification plan (1)验证层次的描述:系统级,⼦模块级... (2)⼯具 (3)风险 (4)所要验证的功能 (5)特定的验证⽅法 (6)覆盖率:code,function,assertion (7)testcase: (8)资源 (9)schedule:debug rate2:verification environment (1)测试组成:激励的⽣成,结果的捕获,正确性的检查,覆盖率的衡量 (2)⾼效的 testbench:可重⽤性,验证分层,随机性(Randomize)3:分层的testbench (1)signal layer DUV以及它的连接(interface) (2)command layer driver,receive,写assertion (3)function layer 涉及协议 (4)scenario layer 产⽣随机值 (5)Test layer and functional coverage。
SystemVerilog Lab Guide自学笔记——快速入门SV
reset_n 即可以同步也可以异步。
任务 3:建立 SV 测试程序文件 program automatic test(router_io.TB router);
initial begin $display(“This is my first SV testbench”); reset();
end
测试代码包含在一个独立的程序块中,并声明为 automatic 类型(自 动存储)。测试平台的端口连接表中使用了 modport, (接口名.modport 名 例化名) 将测试程序块与 TB modport 相连。
SystemVerilog Testbench Lab Guide 是 Synopsys 给出的 SV 官方入门指南, 里面包涵源码和实验指导,可以在网上自行下载。
建议先学习《SystemVerilog 验证——测试平台编写指南(第二版)》 书,了解 SV 的语法。
1 SystemVerilog Verification Flow
input valido_n;
input busy_n;
input frameo_n;
endclocking: cb
TB modport 用于与测试程序相连。
modport TB(clocking cb, output reset_n); ()里面包含时钟模块和所有的异步信号
endinterface: router_io
task reset(); router.reset_n <= 1'b0; router.cb.frame_n <= '1; router.cb.valid_n <= '1; ##2 router.cb.reset_n <= 1'b1; repeat(15) @(router.cb);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
=阻塞串行<=非阻塞并行1)时序逻辑----使用非阻塞赋值2)锁存器----使用非阻塞赋值3)用always块生成的组合逻辑----用阻塞赋值4)在同一个always块中既有时序逻辑又有组合逻辑--- 用非阻塞赋值5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值6)不要在一个以上的always块中对同一个变量赋值7)用$strobe显示用非阻塞赋值指定的变量值8)不要用#0 过程性赋值Modport将信号分组并指明方向函数不能消耗时间,不能有#100@(posedge clk)wait之类的阻塞语句Interface arb_if(input bit clk);Logic [1:0] a,b;Logic rst;Modport test(output a,rst,Input b,clk);EndinterfaceModule arb(arb_if.test arbif);…………Endmodule数组定位Int tq[$],d[]=’{9,1,8,3,4,4};Tq=d.find_index(x) with (item>3); //{0,2,4,5}得到的是脚标Tq=d.find with (item>3); //{9,8,4,4}数组求和Int count,total;Count=d.sum with(item>7); //2:{9,8} 返回结果为元素与7比较表达式返回1为真或者零这里面返回,{1,0,1,0,0,0}求和得2 Total=d.sum with ((item>7)*item) ; //{1,0,1,0,0,0}和对应元素相乘求和得17=9加8数组排序d.reverse(); //逆序d.sort(); //从小到大d.rsotr(); //从大到小d.shuffle();时钟块指定同步信号相对于时钟的时序Interface arb_if(input bit clk);Logic [1:0] a,b;Logic rst;Clocking cb @(posedge clk);Output a;Input b;Modport test(output rst, Clocking cb);EndinterfaceModule arb(arb_if.test arbif); Initial beginArbif.cb.a<=0;@arbif.cb;$dispiay(………..)Endmodule断言A1:assert(bus.cb.a==2’b01)Else $error(“grant not asserted”);四种有输出消息的函数可在断言内部使用$info$waring$error$fatal要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的2~4个时钟周期内,信号b应该为高电平”。
用Verilog 语言描述这样一个属性需要一大段代码,而用SVA描述就只需要几行代码。
下面的代码为SVA。
例1:property a2b_p; @(posedge sclk) $rose(a) |-> [2:4] $rose(b); endpropertya2b_a: assert property(a2b_p); a2b_c: cover property(a2b_p);并发断言并发断言的计算基于时钟周期,在时钟边沿根据变量的采样值计算表达式。
它可以放在过程块(procedural block)、模块(module)、接口(interface)或一个程序块(program)的定义中。
并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。
上面的例子就是并发断言SVA提供了3个内嵌函数,用于检查信号的边沿变化。
$rose(布尔表达式或信号名)当信号/表达式的最低位由0或x变为1时返回真值。
$fell(布尔表达式或信号名)当信号/表达式的最低位由1变为0或x时返回真值。
$stable(布尔表达式或信号名)当信号/表达式的最低位不发生变化时返回真值。
断言的建立过程“编写布尔表达式—> 编写序列(sequence)-> 编写属性(property)—> 编写断言(assert property)和覆盖语句(cover property)”唯一性和优先级决定语句在Verilog中,如果没有遵循严格的编码风格,它的if-else和case语句会在RTL仿真和RTL综合间具有不一致的结果。
如果没有正确使用full_case和parallel_case综合指令还会引起一些其它的错误。
SystemVerilog能够显式地指明什么时候一条决定语句的分支是唯一的,或者什么时候需要计算优先级。
我们可以在if或case关键字之前使用unique或requires关键字。
这些关键字可以向仿真器、综合编译器、以及其它工具指示我们期望的硬件类型。
工具使用这些信息来检查if或case语句是否正确建模了期望的逻辑。
例如,如果使用unique限定了一个决定语句,那么在不希望的case值出现的时候仿真器就能够发布一个警告信息bit [2:0] a;unique if ((a==0) || (a==1)) y = in1;else if (a==2) y = in2;else if (a==4) y = in3; // 值3、5、6、7会引起一个警告priority if (a[2:1]==0) y = in1; // a是0或1else if (a[2]==0) y = in2; // a是2或3else y = in3; // 如果a为其他的值unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase // 值3、5、6、7会引起一个警告类Class trans;…………Endclasstrans a;声明一个句柄(指针)a=new();//为一个trans对象分配空间用户定义的new()函数Class trans;Logic [31:0] addr,crc,data[8];Function new;Foreach (data[i])Data[i]=5;EndfunctionEndclass随机化Class packetRand bit [31:0] a,b,c[8];Randc bit[7:0] k;Constraint d{a>10;a<15;}endclasspacket p;initial beginp=new();assert (p.randomize());transmit(p);end指示通过引用传递的参数,参数声明需要以ref关键字开始always_comb过程来建模组合逻辑行为在0时刻结束时自动触发一次always_latch过程来建模锁存逻辑行为always_ff过程可以用来建模可综合的时序逻辑行为它仅能包含一个事件控制过程并且没有阻塞定时控制always_comb过程提供了不同于正常always过程的功能:•具有一个推断的敏感列表•赋值语句左侧的变量不应该被任何其它进程写入。
•在所有的initial和always块被启动以后,过程在时间0处被自动地触发一次,因此过程的输出与输入一致。
SystemVerilog的always_comb过程在下述几个方面上不同于Verilog-2001的always @*:•always_comb在时间0处自动执行,而always @*直到推断的敏感列表中的一个信号发生变化的时候才会执行。
•always_comb敏感于一个函数内容内部的改变,而always @*仅敏感于一个函数自变量的改变。
•在always_comb内部赋值左侧的变量(包括来自被调用函数内容中的变量)不应该被其它进程写入,而always @*则允许多个进程写入相同的变量。
•always_comb中的语句不应该包含阻塞语句、具有阻塞定时或事件控制的语句,或者fork...join语句。
如果always_comb过程内的行为没有代表组合逻辑,例如推断出了锁存器,软件工具执行额外的检查来发布警告信息。
Fork……join所有并行语句执行完毕才执行后续Fork…….join_none 执行块儿内语句的同时父线程后面的程序继续进行Fork…..join_any当块内第一个语句完成后,父线程才继续执行。
停止单个线程Parameter timeout=1000;Task check(trans tr);ForkbeginFork: check_stopBeginWait(tbus.cb.addr==tr.addr);$display(“……….”);End#timeout $display(“……….”);Join_anyDisable check_stop;EndJoin_noneEndtask事件信箱扩展的类Class badtr extands transaction;Rand bit bad_crc;Virtual function void calc_crc;Super.calc_crc();//super调用基类里面的函数………..EndfunctionEndclass:badtr回调测试程序在不修改原始累得情况下注入新代码可以用来注入错误放弃事务延迟事务将事务放入记分板收集功能覆盖率等等记分板保存期望事务,找出测试平台接收到的实际事务相匹配的期望事务。
Class scorebroad;Transaction scb[$];Function void save_expect(transaction tr);Scb.push_back(tr);EndfunctionFunction void compare_actual(transation tr);Int b[$];B=scb.find_index(x) with (x.src=tr.src);Case(b.size())0:$display(“no match find”);1:scb.delete(q[0]);Default:$display(“error,multiple matches found”);EndcaseEndfunction: compare_actualEndclass功能覆盖率Program automatic test(busifc.TB.ifc);Class transaction;Rand bit[31:0]data;Rand bit[2:0]port;EndclassCovergroup covport;Coverpoint tr.port;EndgroupInitial beginTransaction tr;Covport ck;Tr=new();Ck=new();Repeat(32)beginAssert(tr.randomize);Ifc.cb.port<=tr.port;Ck.sample(); //收集覆盖率,触发覆盖组@ifc.cb;EndEndEndprogramAuto_bin_max指明了自动创建仓的最大值Covergroup CovPort;Option. Auto_bin_max=2;Coverpoint tr.port;Endgroup分成两个仓bit[2:0]portauto[0:3]auto[4:7]两个仓仓Covergroup Covport;Kind:Coverpoint tr.kind;{ bins zero={0};Bins lo={[1:3],5}; //1:3和5是一个仓Bins hi[]={8:$}; //8到最大值15,8个独立的仓,hi_0,hi_1…….. Bins misc=deflaut; //一个仓代表剩余的值Bins t1=(1,2=>3,4); //翻转覆盖率,表示自重翻转过程Ignore_bins h2={[6,7]}; //被忽略的仓Illegal_bins h3={[6,7]}; //非法的仓,出现会报错}Port:coverpoint tr.port;Cross kind,port; //交叉覆盖率Endgroup发生器Class generationUNI_cell blueprint ;//定义的需要测试的对象的蓝图,可以通过修改起约束或者扩展替换他mailbox gen2drv; //信箱event drv2gen ; //drive 完成时的事件int ncells;…………Function new(Input mailbox gen2drv,Input event drv2gen,……….) 测试发生器代理驱动器 计分板 检测器 断言 监视器 待测设计功 能 覆 盖 率This.gen2drv=gen2drv;This.drv2gen=drv2gen;This.ncell=ncell;……………….Blueprint=new();Endfunction:newTask run();UNI_cell cell;Repeat(ncells)beginAssert(blueprint.randomize());$cast(cell,blueprint.copy()); //基类句柄指向拓展对象Gen2drv.put(cell); //事务放进信箱发送给驱动器@drv2gen;endEndtask:runEndclass:generation驱动类Typedef class Drive_cbs;Class driveMailbox gen2drv;Event drv2gen;vUtopiaRx Rx; //发送的数据的接口Drive_cbs cbs[$]; //回调队列Int portid;Extern function new(Input Mailbox gen2drv,InputEvent drv2gen,Input vUtopiaRx Rx,Input Int portid;)Extern task run();Extern task send();Endclass:driveTask drive::run()UNI_cell cell;Bit drop=0;Rx.cbr.data<=0;………. //初始化端口Forever beginGen2drv.peek(); //从信箱中读取一个数据//发送前回调begin:txForeach(cbs[i]);Cbs[i].pre_tx(this,cell,drop);If (drop) disable tx; //不发送这个数据EndSend(cell);//发送后的回调Foreach(cbs[i]);Cbs[i].post_tx(this,cell,drop);End:txGen2drv.get(cell); //删除数据->drv2gen;Endtask:runTask drive::send(input UNI_cell cell)……………….Rx.cbr.data<=cell.data //数据发送给接口时钟块@rx.cbr…………………….EndtaskUVMFactory机制‘uvm_componet_utils(my_driver);Run_test(“my_driver”);Factory集中在一个宏uvm_componet_utils中这个宏将类my_driver登记在uvm内部一张表中,在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张表中。