System Verilog笔记总结
SystemVerilog里面向对象的基本知识点
面向对象编程OOP一、OOP术语1.class类:包含变量和子程序的基本构建块。
2.对象:类的一个实例。
3.句柄:指向对象的指针,一个OOP句柄就像对象的地址,但是它只能保存在一个只能指向单一类型数据类型的指针中。
4.属性:存贮数据的变量。
5.方法:任务和函数二、创建新对象1.区别Verilog和SV:(1)Verilog中的一个模块是在代码编译的时候例化的。
SV中是运行测试平台时需要的时候才被建立的。
(2)Verilog的例化是静态的,像硬件一样,只有信号值得变化。
SV激励对象不断地被创建并且驱动DUT,最后这些对象所占用的内存可以被释放供新对象使用。
(3)Verilog的顶层模块不会被显示的例化,但是SV类在使用之前必须要先例化。
(4)Verilog实例名只可以指向一个实例。
而SV句柄可以指向很多对象,当然一次只能指向一个。
2.构造函数new():例化一个对象时,相当于为对象申请一个新的内存来保存对象的变量。
不能有返回值,因为其返回的是指向一个类对象的句柄,其类型就是类本身。
当出现多个同名的对象时,至于new()调用的是哪个new()函数,这取决于赋值操作符左边的句柄类型Trans tr; //声明一个句柄,初始化为特殊值null tr = new(); //为一个Trans对象分配空间,将变量初始化为默认值,二值的为0,四值的为x.并返回保存对象的地址3.将声明和创建分开:若同时会引起顺序问题。
若忘记使用automatic 存储空间,构造函数将在开始仿真时,而非进入块的时候调用。
*4.声明一个句柄来创建一个对象,在仿真中一个句柄可以指向多个对象。
Trans tr1,tr2;//声明两个句柄tr1=new();// 为第一个类对象分配地址空间tr2=tr1;//复制,指向同一个地址,都指向第一个对象 tr1=new();//为第二个Trans对象分配地址*5.SV中分辨对象不再被引用的方法是记住指向它的句柄的数量,当最后一个句柄不在引用某个对象了,SV就将释放这个对象。
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);
systemverilog笔记
systemverilog笔记第三章数据类型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的一部分。
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语言知识介绍1. 对面向对象编程(OOP)的支持:SystemVerilog引入了类和对象的概念,使得设计和验证更加模块化和可重用。
类可以包含数据成员和成员函数,可以继承和多态,从而使设计更加灵活和可扩展。
2. 接口:SystemVerilog引入了接口的概念,用于定义组件之间的通信和互连。
接口可以包含信号和方法,可以被多个模块实例化和连接在一起,从而简化了设计和验证的过程。
3. 任务和函数:SystemVerilog支持任务和函数的定义,用于执行一些特定的操作和计算。
任务是并发执行的,可以用于模拟硬件行为。
函数可以返回一个值,可以用于计算逻辑和数据处理。
4. 动态数组:SystemVerilog引入了动态数组的概念,可以在运行时动态地分配和管理内存。
这对于处理变长数据结构(如队列和堆栈)非常有用,同时也可以简化设计和验证的过程。
5. 时序建模:SystemVerilog提供了一些特性,用于描述和模拟数字系统中的时序行为。
例如,可以使用时钟、触发器和延迟来定义和控制信号的时序关系。
这使得设计和验证更加准确和可靠。
6. 断言:SystemVerilog引入了断言的概念,用于描述和验证设计的一些属性和约束。
断言可以在运行时检查设计的正确性,并在出现错误时提供错误信息。
这对于设计和验证的调试和验证非常有用。
除了以上特性,SystemVerilog还具有一些其他的功能,如并行块、并行循环、封装和配置等。
这些功能都使得SystemVerilog成为一个强大而灵活的硬件描述语言,广泛应用于数字系统的设计和验证。
总的来说,SystemVerilog是一种用于硬件设计和验证的高级硬件描述语言。
它具有面向对象编程的特性,支持接口、任务和函数,提供动态数组和时序建模等功能。
它的强大和灵活性使得它成为了工业界和学术界广泛使用的硬件描述语言之一。
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断言的验证环境如下图所示:注:约束随机测试平台可以用来产生更多真实的验证情景;代码覆盖则是验证完整性的基本衡量标准。
一般情况下,测试平台需要做三件事:•产生激励;•自检机制;•衡量功能覆盖。
Verilog笔记
我们把功能经过验证的、可综合的、实现后电路结构总门数在5000门以上的Verilog HDL模型称之为“软核”(Soft Core)。
而把由软核构成的器件称为虚拟器件,在新电路的研制过程中,软核和虚拟器件可以很容易地借助EDA综合工具与其它外部逻辑结合为一体。
这样,软核和虚拟器件的重用性就可大大缩短设计周期,加快了复杂电路的设计。
我们把在某一种现场可编程门阵列(FPGA)器件上实现的,经验证是正确的总门数在5000门以上电路结构编码文件,称之为“固核”。
我们把在某一种专用半导体集成电路工艺的(ASIC)器件上实现的经验证是正确的总门数在5000门以上的电路结构掩膜,称之为“硬核”VHDL 其英文全名为VHSIC Hardware Description Language,而VHSIC 则是Very High Speed Integerated Circuit的缩写词,意为甚高速集成电路,故VHDL其准确的中文译名为甚高速集成电路的硬件描述语言。
一般认为Verilog HDL在系统级抽象方面比VHDL略差一些,而在门级开关电路描述方面比VHDL强得多。
采用Verilog HDL设计复杂数字电路的优点传统设计方法--电路原理图输入法采用Verilog HDL输入法最大的优点是其与工艺无关性。
自顶向下(Top-Down)设计允许多个设计者同时设计一个硬件系统中的不同模块,其中每个设者负责自己所承担的部分;而由上一层设计师对其下层设计者完成的设计用行为级上层模块对其所做的设计进行验证。
自顶向下的设计(即TOP_DOWN设计)是从系统级开始,把系统划分为基本单元,然后再把每个基本单元划分为下一层次的基本单元,一直这样做下去,直到可以直接用EDA元件库中的元件来实现为止。
TOP_DOWN的设计过程是理想的设计过程,它的缺点是得到的最小单元不标准,制造成本可能很高。
从底向上的设计过程全采用标准基本单元,通常比较经济,但有时可能不能满足一些特定的指标要求。
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的结合使得验证人员可以快速搭建验证环境,提高验证效率。
Verilog学习笔记
1.阻塞问题经典例子:1.非阻塞式:always(posdege@clk)beginb<=a;c<=b;end 2.阻塞式:always(posdege@clk)beginb=a;c=b;end注:非阻塞式语句时,只在块完成后才给被赋值对象赋值;阻塞式语句时,按程序先后给对象赋值,阻塞式结果赋值先后与顺序是有关系的。
两个程序的输出结果是不一样的,如下图示2.常量定义两种方式:1)'define a 3'b0112)parameter a=3'b011;3.case casex casez4.模块中的进程(process)1)Assign2)Always3)Initial4)元件例化5.task和funtion1)task <task名>无端口列表2)调用task时,格式为task名(参数),其中注意参数的相对位置应该与task定义时对应。
例如下例:3)task是定义在模块内部的,不能像C函数哪样可以放在主函数外。
4)函数的格式 function <返回参数类型及位数>函数名5)隐含了一个与函数同名的参数6)两者的区别:Verilog学习笔记21.顺序执行与并发执行1)块间always,assign,元件实例化都是并行执行的;2)Always块内部(=)阻塞语句是顺序执行的,(=>)非阻塞是并发执行的;2.Verilog-1995与Verilog-2001的区别1)信号类型和方向可一起定义;2)敏感信号可以用“,”来代替“or”;3)敏感信号全体信号的变化可以用“*”来替代。
其它不再细说了。
3.Verilog HDL的描述风格1)结构描述,行为描述,数据流描述。
2)Verilog的抽像层次3)缓冲器,非门和三态缓冲门的真傎表4.结构描述从低层下手,从硬件上来分析,一般有开关级和门级两种5.行为描述大多用always语句来反映输入与输出的关系,即用语言来描述:什么样的输入对应有什么样的输出:6.数据流描述是采用找出能够反映输入输出的公式,通常用assign来赋值。
verilog知识点总结
verilog知识点总结Verilog知识点总结Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统。
在数字电路设计中,Verilog是一种重要的工具,它可以描述组合逻辑和时序逻辑,以及设计和验证硬件。
本文将总结Verilog的一些重要知识点,包括模块化设计、数据类型、运算符、时序建模和测试基础等。
一、模块化设计在Verilog中,模块是设计的基本单元。
模块化设计可以使复杂的电路设计更加可管理和可重用。
在Verilog中,模块由模块声明和模块体组成。
模块声明定义了模块的接口,包括输入、输出和内部信号。
模块体定义了模块的功能,包括组合逻辑和时序逻辑。
二、数据类型Verilog支持多种数据类型,包括位、字、整数和实数。
位是最基本的数据类型,用于表示二进制数。
字是一组连续的位,用于表示整数或实数。
整数是有符号或无符号的整数,用于表示整数值。
实数是浮点数,用于表示小数值。
三、运算符Verilog支持多种运算符,包括算术运算符、逻辑运算符、位运算符和关系运算符。
算术运算符包括加法、减法、乘法和除法。
逻辑运算符包括与、或、非和异或。
位运算符包括位与、位或、位非和位异或。
关系运算符包括等于、不等于、大于、小于、大于等于和小于等于。
四、时序建模时序建模是描述时序电路行为的重要方面。
在Verilog中,可以使用时钟信号和时钟边沿来定义时序行为。
时钟信号用于同步电路的操作,时钟边沿用于触发电路的操作。
常用的时序建模语句包括时钟边沿敏感的always语句和延迟语句。
五、测试基础测试是硬件设计过程中的重要环节。
Verilog提供了多种测试方法,包括模拟仿真、自动测试生成和形式验证。
模拟仿真是通过模拟输入信号并观察输出信号来验证电路的功能。
自动测试生成是通过生成测试向量来覆盖电路的所有可能输入组合。
形式验证是通过数学证明来验证电路的正确性。
六、常用编码风格在Verilog中,编码风格是编写可读性高且易于理解的代码的重要因素。
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中。
SystemVerilog基础(二)
SystemVerilog基础(⼆)这⼀篇笔记主要记录Procedural,Process,Task and function,Interface和Communication中值得注意的点。
1.Procedural写testbench的时候,除了tb与硬件交互的地⽅使⽤⾮阻塞赋值,tb⾥⾯其他地⽅⼀律⽤阻塞赋值,OK1 logic [3:0] d0,d1;2initial begin3 d0 <= 3;4 $display("d0 value %0d",d0); //d0=x;logic在未被初始化的时候是x5 d1 = 4;6 $display("d1 value %0d d0 value %0d",d1); //d1=4,d0=x;注意这个时候d0依然是x7 #18 $display("d1 value %0d d0 value %0d",d1); //d1=4,d0=3;只有#1往前⾛了之后,<=才会赋值⽣效9endLoop循环中的foreach,是专门针对数组轮询时候⽤的。
对⼆维数组遍历,如下代码:1int data[3][4];2initial3 foreach(data[1]) begin4 foreach(data[i][j]) begin5 </**/>6end7 </**/>8end9end在两个for循环中,可以在⾥⾯直接定义index,例如for(int i; i<10; i++) 这样,如果有两个for⾥⾯都定义了int i,这两个index i是相互不影响的。
哪些地⽅可以加label? Module...endmodule; begin...end; task...endtask; fork...join; interface...endinterface; 加标签的主要好处是增加代码的可读性,例如下⾯的代码:1module test();2begin: b03 <...>4begin: b15 <...>6end: b17end: b089begin: b210 <...>11end: b212endmodule:testFinal Blocks。
System verilog数据类型总结
System verilog数据类型总结1 逻辑数据类型(logic)可替reg和wire,但是不能有多个驱动,有多个驱动的信号还是要定义成wire型2 双状态数据类型(只有0/1两个状态)无符号:bit有符号:byteshortintintlongint$sunknown操作符可检查双状态数据类型位是否出现X、Z状态,若出现,返回1例If ($sunknown(iport)==1)$display( )3 定宽数组1)声明:在数组声明中允许给出数组宽度如:intc_style[16] 等同于int c_style[15:0] //16个整数2)多维数组int array[8][4];int array [7:0][3:0];//8行4列数组array[7][3]=1 //设置最后一个元素为1从越界地址中读数,SV返回数组元素缺省值四状态类型,返回X;双状态类型,返回0;3)存放:32比特字边界存放数组元素4)非合并数组声明:bit[7:0] b_unpack[3]低位存放数据5)常量数组声明:单引号和大括号初始化数组例:int a[4] = '{0,1,2,1}; //4个元素初始化int b[5];a[0:2] = '{1,2,2}; //为前三个元素赋值b = '{5{1}}; //5个值全为1a= '{3,2,default:1} //为没有赋值元素,指定缺省值1, a='{3,2,1,1} 4 基本数组操作1)遍历数组---for /foreachforeach要指定数组名,且要用方括号中给出索引变量initial beginbit[31:0] arc[5],drc[5];for(inti=0;i<$size(src);i++)src[i]= i;foreach (drc[j])drc[j]=src[j]*2;end多维数组遍历foreach语法用[ i,j], 如int mid[2][3]='{'{1,2,3},'{3,4,5}} foreach(mid[i,j])2)比较和复制聚合比较和赋值(适用于整个数组而非单个元素)比较只有等于和不等于比较可使用?:操作符比较$display ("src[1:4] %s dst[1:4]", src[1:4]==drc[1:4]? "==":"!==");3)赋值src=drc //drc所有元素赋值给srcsrc[3]=4; //第三个元素赋值为44)同时使用数组下标和位下标如指定第一个数组的第一位和第二位:bit[31:0] src[5] = '{5{5}};$display ("src[0],, //'b101src[0][2:1] ); //'b105)合并数组连续的比特集存放,既可以当成数组,也可以当单独数据,如32比特数据,可以看成4个8比特数据合并的位和数组大小必须放在变量明前指定如bit[3:0] [7:0] byte1; //四个8比特数组成32比特byte1[2][7] //第3个字节的第8位合并/非合并混合数组(详见SV验证测试平台编写指南P26)和标量进行相互转换,建议使用合并数组,如以字节或字对存储单元进行操作,需要等待数组中变化,必须使用合并数组,如用@()等待触发,只能用标量或合并数组5 动态数组仿真过程中再分配空间或调整宽度,在声明时用空的[ ],在执行过程中使用new[]操作符分配空间,[ ] 内给定数组宽度int dyn[],d2[];initial begindyn = new[5]; //分配5个元素foreach (dyn[j]) dyn[j]=j;//对元素进行初始化d2=dyn//复制dyndyn=new[20](dyn);dyn.delete(); //删除所有元素想声明一个常数数组但不想统计元素个数,可以使用动态数组bit[7:0] mask[ ] = '{3'b101,3'011};数据类型相同,定宽数组和动态数组之间可以相互赋值6队列结合链表和数组优点:1)可在队列任何地方添加,删除元素;动态数组需要分配新的数组并复制元素的值2)可通过索引实现访问元素;链表需要遍历目标元素之前的元素声明:[$]int j=1;q2 [$] = {3,4} , //队列常量不需要使用’q [$] = {0,2,5};initial beginq.insert(1,j); // {0,1,2,5}q.delete(1); // {0,2,5} 删除第一个元素q.push_front(6) //{6,0,2,5}q.push_back(8) //{6,0,2,5,8}q[$,2] //$放最左边,代表最小值0;$放最右边则代表最大值7关联数组用来保存稀疏矩阵的元素,只为实际写入的元素分配空间8数组方法数组缩减sum/product/and/or/xor 注意位宽定位方法min/max/unique/find数组排序re verse/sort/rsort/shuffle9枚举类型10表达式位宽可强制转换bit [7:0] b8;bit one= 1'b1;$displayb(one+one) // 1+1=0; 两个单比特变量b8=one+one;$displayb(b8); //=2,为了避免溢出造成精度受损,可使用临时变量b8$displayb(one+one+2'b0); // =2,采用哑元常数2'b0$displayb(2'(one)+one); //=2, 第一个值被强制转换。
SystemVerilog基本语法总结(中)
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 信箱背景:如何在两个线程中传递信息?考虑发⽣器需要创建很多事物并传递给驱动器的情况。
问题:如果使⽤发⽣器的线程去调⽤驱动器的任务。
这样,发⽣器需要知道驱动器的层次化路径(类的层次化),降低了代码的可重⽤性;还迫使发⽣器和驱动器同⼀速率运⾏,当⼀个发⽣器需控制多个驱动器时会发⽣同步问题。
解决办法:把驱动器和发⽣器当成各个处理事物的对象,之间通过信道交换数据。
信道允许驱动器和发⽣器异步操作;引⼊问题:你可能倾向于仅仅使⽤⼀个共享的数据或队列,但这样,编写实现线程间的读写和阻塞代码会很困难。
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断⾔学习笔记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}求和得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应该为高电平”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 推荐使用文本宏。
好处:全局作用范围,且可以用于位段或类型定义缺点:当需要局部常量时,可能引起冲突。
2)Parameter作用范围仅限于单个module3)Systemverilog:参数可以在多个模块里共同使用,可以用typedef 代替单调乏味的宏。
过程语句l 可以在for循环中定义变量,作用范围仅在循环内部for(int i=0;i<10;i++)array[i] =i;l 任务、函数及void函数1)区别:Verilog中task 和function最重要的区别是:task可以消耗时间而函数不能。
函数中不能使用#100的延时或@的阻塞语句,也不能调用任务;Systemverilog中函数可以调用任务,但只能在fork joinnone生成的线程中。
2)使用:如果有一个不消耗时间的systemverilog任务,应该把它定义成void函数;这样它可以被任何函数或任务调用。
从最大灵活性角度考虑,所有用于调用的子程序都应该被定义成函数而非任务,以便被任何其它任务或函数调用。
(因为定义成任务,函数调用任务很有限制)l 类静态变量作用:1)类的静态变量,可以被这个类的对象实例所共享。
当你想使用全局变量的时候,应该先想到创建一个类的静态变量静态变量在声明的时候初始化。
2)类的每一个实例都需要从同一个对象获取信息。
l 静态方法作用:当静态变量很多的时候,操作它们的代码是一个很大的程序,可以用在类中创建一个静态方法读写静态变量,但是静态方法不能读写非静态变量。
l ref高级的参数类型Ref 参数传递为引用而不是复制。
Ref比input 、output、inout更好用。
Function void print_checksum(const ref bit [31:0] a[ ]);1) 也可以不用ref进行数组参数传递,这时数组会被复制到堆栈区,代价很高。
2) 用带ref 进行数组参数传递,仅仅是引用,不需要复制;向子程序传递数组时,应尽量使用ref以获得最佳性能,如果不希望子程序改变数组的值,可以使用const ref。
3) Ref参数,用ref 传递变量;可以在任务里修改变量而且,修改结果对调用它的函数可见,相对于指针的功能。
l Return语句增加了return语句。
Task任务由于发现了错误而需要提前返回,如果不这样,那么任务中剩下的语句就必须被放到一个else条件语句中。
体会下Task load_array(int len. Ref int array[ ]);If(len<0) begin$display(―Bad len‖);Returun;//任务中其它代码…endtaskl 局部数据存储automatic作用Verilog中由于任务中局部变量会使静态存储区,当在多个地方调用同一个任务时,不同线程之间会窜用这些局部变量。
Systemverilog中,module和program块中,缺省使用静态存储;如果想使用自动存储,需加入automatic关键词。
测试平台l Interface背景:一个信号可能连接几个设计层次,如果增加一个信号,必须在多个文件中定义和连接。
接口可以解决这些问题。
好处:如果希望在接口中增加一个信号,不需要改变其他模块,如TOP模块。
使用方法:(1)接口中去掉信号的方向类型;(2)DUT 和测试平台中,信号列表中采用接口名,例化一个名字注意:因为去掉了方向类型,接口中不需要考虑方向信号,简单的接口,可以看做是一组双向信号的集合。
这些信号使用logic类型[d1]。
双向信号为何可以使用logic呢?这里的双向,只是概念上的双向,不想verilog中databus多驱动的双向。
双向信号如何做接口?(1)仲裁器的简单接口Interface arb_if( input bit clk);Logic [1:0] grant,request;Logic rst;EndinterfaceDUT 使用接口:Module arb(arb_if arbif);…Always @(posedge arbif.clk or negedge arbif.rst)…endmodule(2)DUT 不采用接口,测试平台中使用接口(推荐)DUT 中源代码不需要修改,只需要再top中,将接口连接到端口上。
Module top;Bit clk;Always #2 clk =~clk;Arb_if arbif(clk);Arb_port al(.grant(arbif.grant),.request(arbif.grant),.rst(arbif.rst),.clk(arbif.clk));Test t1(arbif);Endmodulel Modport背景:端口的连接方式包含了方向信息,编译器依次来检查连续错误;接口使用无信号的连接方式。
Modport将接口中信号分组并指定方向。
例子:l 在总线设计中使用modport并非接口中每个信号都必须连接。
Data总线接口中就解决不了,个人觉得?因为data是一个双驱动l 时钟块作用:一旦定义了时钟块,测试平台就可以采用@arbif.cb等待时钟,而不需要描述确切的时钟信号和边沿,即使改变了时钟块中的时钟或边沿,也不需要修改测试代码应用:将测试平台中的信号,都放在clocking 中,并指定方向(以测试平台为参考的方向)。
并且在modprot test(clocking cb,最完整的接口:Interface arb_if(input bit clk);Logic[1:0] grant,request;Logic rst;Clocking cb @(posedge clk);Output request;Input grant;EndclockingModport test (clocking cb,Output rst);Modport dut (input clk, request,rst,Output grant);endinterface变化:将request 和grant移动到时钟块中去了,test中没有使用了。
l 接口中的双向信号Interface master_if(input bit clk); //在类中为了,不使用有符号数,常用bit[]定义变量 Wire [7:0] data;Clocking cb@(posedge clk);Inout data;EndclockingModport TEST(clocking cb);endinterfaceprogram test(master_if mif);initial beginmif.cb.data <= ‗z;@mif.cb;$display(mif.cb.data); //总线中读数据@mif.cb;Mif.cb.data <= 8‘h5a; //驱动总线@mif.cb;Mif.cb.data <= ‗z; //释放总线注:(1)interface 列表中clk 采用的是input bit clk;为什么要用bit?(2)时钟块clocking cb 中,一般将testbench中需要的信号,方向指定在这里;而在modprot 指定test信号方向的时候,采用clocking cb。
(3)interface中信号,不一定都用logic,也可采用wire(双驱动);systemverilog 中如果采用C代码的风格(参数列表中方向和类型写一起),必须采用logic类型(4)现在的风格,DUT 没才用clocking cb ,测试平台和DUT的时钟如何统一?l 激励时序DUT和测试平台之间时序必须密切配合。
l 测试平台和设计间的竞争状态好的风格:使用非阻塞赋值可以减少竞争。
systemverilog验证中initial 中都采用<= 赋值,而等待延迟采用@arbif.cb等待一个周期来实现。
而verilog中采用的风格时,initial 中采用=阻塞赋值,沿时可以采用#2,等实现。
因此时钟发生器,只能放在module 中,而不能放在program中l Program中不能使用always块测试平台可以使用initial 但不能使用always,使用always 模块不能正常工作。
原因:测试平台的执行过程是进过初始化、驱动和响应等步骤后结束仿真。
如果确实需要一个always块,可以使用initial forever 来完成。
比如:在产生时钟时。
类l 类中static变量背景:如果一个变量需要被其他对象所共享,如果没有OPP,就需要创建全局变量,这样会污染全局名字空间,导致你想定义局部变量,但变量对每个人都是可见的。