第20章 Verilog的可综合描述风格
- 格式:pptx
- 大小:204.58 KB
- 文档页数:39
systemverilog 可综合语法-概述说明以及解释1.引言1.1 概述SystemVerilog是一种硬件描述语言,其可综合语法用于描述硬件设计的行为和结构。
可综合语法是指在编写SystemVerilog代码时,能够被综合工具翻译成底层硬件电路,并最终映射到FPGA或ASIC等可编程器件上的语法规则和风格。
因此,可综合语法在硬件设计中起着至关重要的作用。
在硬件设计中,可综合语法使设计工程师能够通过代码描述硬件的功能和结构,包括处理器、逻辑电路、存储器等。
通过使用可综合语法,设计工程师可以更加灵活地实现各种功能和性能要求,同时也能提高设计的可维护性和可重用性。
SystemVerilog的可综合语法特点是其结构化的设计风格,丰富的数据类型和内置的高级语言功能。
与传统的硬件描述语言相比,SystemVerilog提供了更多的抽象层次和编程特性,可以更高效地完成复杂的硬件设计任务。
例如,SystemVerilog支持面向对象的设计方法,可以使用类和对象对设计进行建模和封装。
此外,SystemVerilog还提供了多种数据类型和运算符,使设计工程师可以更方便地处理各种数据和信号。
综上所述,可综合语法在SystemVerilog中具有重要的地位和作用。
通过使用可综合语法,设计工程师能够更加方便地描述和实现各种硬件功能,提高设计的效率和可靠性。
在今后的硬件设计中,可综合语法的应用将更加广泛,并且不断发展和完善,以满足不断变化的设计需求。
1.2 文章结构文章结构部分的内容可以包括以下内容:文章结构的目的是为了给读者提供清晰的导航和理解文章的逻辑框架。
通过合理的结构,读者可以更好地理解文章的目的和内容,并能够有序地阅读和理解整个文档。
本文的结构如下:第一部分是引言部分,用于介绍文章的背景和相关信息。
在引言部分,我们将概述SystemVerilog可综合语法的定义和作用,并介绍本文的结构和目的。
第二部分是正文部分,主要内容是关于SystemVerilog可综合语法的定义和特点。
Verilog的三种描述方式Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统。
它是一种高级语言,允许工程师以更高层次的抽象来描述电路,从而简化了电路设计和验证过程。
Verilog有三种主要的描述方式,分别是结构描述、行为描述和数据流描述。
本文将详细介绍这三种描述方式,并分析它们的特点和适用场景。
1. 结构描述结构描述是Verilog的一种描述方式,它通过层次结构和模块之间的连接关系来描述电路。
在结构描述中,我们可以使用模块、端口、电路连接和实例化等概念来描述电路的组成和连接方式。
结构描述类似于画出电路图,只需要关注电路的结构和连接关系,而不需要考虑电路的具体功能。
结构描述的语法如下所示:module ModuleName (input wire A, input wire B, output wire C);// 输入端口定义// 输出端口定义// 内部信号定义// 子模块实例化// 逻辑实现endmodule结构描述的特点是清晰明了,易于理解和调试。
通过模块化的设计和层次结构,可以方便地对电路进行分析和调试。
结构描述适用于需要详细描述电路结构和连接关系的场景,比如设计一个复杂的处理器或系统。
2. 行为描述行为描述是Verilog的另一种描述方式,它通过描述电路的功能和行为来实现对电路的描述。
行为描述使用类似于编程语言的语法,可以使用条件语句、循环语句和顺序语句等来描述电路的行为。
在行为描述中,我们可以直接使用Verilog的语法来描述电路的逻辑功能,而不需要关注电路的结构和连接关系。
行为描述的语法如下所示:module ModuleName (input wire A, input wire B, output wire C);// 输入端口定义// 输出端口定义// 内部信号定义// 逻辑实现always @ (A or B) begin// 行为描述endendmodule行为描述的特点是灵活性高,可以方便地实现复杂的逻辑功能。
verilog教程Verilog是一种硬件描述语言(HDL),用于描述数字系统的行为和结构。
它是一种流行的HDL,广泛用于硬件设计和验证领域。
本教程将介绍Verilog的基本概念和语法,以帮助初学者入门。
一、Verilog的基本概念1.1 什么是VerilogVerilog是一种描述数字系统的语言,它可以用来描述硬件电路、验证设计的正确性以及进行电路仿真。
1.2 Verilog的应用领域Verilog广泛应用于硬件设计和验证领域,包括用于开发ASIC(应用特定集成电路)、FPGA(现场可编程门阵列)以及其他数字系统的设计。
1.3 Verilog的版本Verilog有多个版本,包括Verilog-1995、Verilog-2001以及最新的Verilog-2005、这些版本之间有一些语法和功能上的差异。
二、Verilog的语法结构2.1模块和端口在Verilog中,所有的电路描述都是由模块(module)组成的。
模块是电路的基本组成单元,可以看作是一个黑盒子,它接受一些输入,产生一些输出。
2.2信号声明在Verilog中,我们需要声明所有的输入和输出信号。
可以使用`input`和`output`关键字来声明这些信号。
2.3电路实现Verilog允许使用多种语句和结构来描述电路的行为和结构。
这些语句包括顺序语句、条件语句、循环语句以及层次结构。
2.4实例化模块在一个模块中,我们可以实例化其他的模块。
这样可以将一个大的电路拆分成多个小的模块,方便编写和测试。
三、Verilog的仿真和验证3.1静态验证Verilog语言本身提供了很多语法和语义层面的验证功能,对于语法和类型错误会有相应的提示。
3.2激励设计在进行电路验证时,我们需要为输入信号提供激励。
Verilog提供了一种称为`testbench`的特殊模块,用于生成输入信号并将其应用到待验证的电路中。
3.3波形仿真在Verilog中,我们可以使用仿真器来模拟电路的行为,并生成波形图来验证电路是否按预期工作。
综合:不可综合的运算符:= = = ,!= =,/(除法),%(取余数)。
1、不使用初始化语句。
2、不使用带有延时的描述。
3、不使用循环次数不确定的循环语句,如:forever、while等。
4、尽量采用同步方式设计电路。
5、除非是关键路径的设计,一般不调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
6、用always过程块描述组合逻辑,应在信号敏感列表中列出所有的输入信号。
7、所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
8、在verilog模块中,任务(task)通常被综合成组合逻辑的形式,每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。
9、用户自定义原语(UDP)是不可综合的,它只能用来建立门级元件的仿真模型。
移位运算符:Verilog HDL提供向右(>>)及向左(<<)两种运算符,运算符高位或地位一旦移出即予丢弃,其空缺的位则予以补零。
连续赋值语句(assign)、case语句、if…else语句都是可以综合的initial 语句内若包含有多个语句时,必须以begin end 作聚合;单一的初值赋值,因此并不需以begin end做聚合。
循环(Loops)并不能单独地在程序中存在,而必须在initial和always块中才能使用。
initial过程块中的语句仅执行一次,而always块中的语句是不断重复执行的。
编写顶层模块的注意事项每个端口除了要声明是输入、输出还是双向外,还要声明其数据类型,是连线型(wire)还是寄存器型(reg),如果没有声明则综合器默认为wire型。
1、输入和双向端口不能声明为寄存器型。
2、在测试模块中不需要定义端口。
编写testbentch所归纳的心得module 模块名称;将input 定义为reg;将output定义为wire;引用欲测试的module 别名initial begin设定reg 初始值endalways处理变化值endmodule在always 、initial 过程块内,被赋值的每一个信号都必须定义成寄存器型。
Verilog设计的可综合性与问题分析前⾔⽤Verilog HDL编写的设计模块最终要⽣成实际⼯作的电路,因此,设计模块的语法和编写代码风格会对后期电路产⽣影响,所以,若要编写可实现的设计模块,就需要注意⼀些问题可综合语法可综合的设计是最终实现电路所必需的,所以弄清哪些语法是可综合的,哪些语法是不可综合的⾮常有必要,⽽且设计者也必须知道⼀个代码能否被综合成最终电路;例如:写⼀个简单的除法a/b,想妄图直接通过综合⼯具⽣成⼀个除法器是不现实的,还有有符号数和浮点数的时候也需要注意。
总之,设计者的思路定要从软件⾓度转变到硬件⾓度,很多在软件中可以直接使⽤的情况到了硬件电路就需要从很底层的⾓度来编写。
可综合的语句有:1)module 与 endmodule 模块声明的关键字2)输⼊input,输出output和双向端⼝inout的声明3)变量类型reg,wire,integer4)参数parameter和宏定义define5)所有的Verilog HDL内建门,如:add,or之类的门6)数据流语句assign语句7)⾏为级中敏感列表⽀持电平和边沿变化,类似posedge,negedge8)always,function可以被综合,task中如果不含延迟可以被综合9)顺序块begin……end可以被综合10)if和 case语句可以被综合不可被综合的语句在Verilog HDL中不可被综合的语法这⾥也简单列出来:(1)初始化initial结构不能被综合,电路中不会存在这样的单元。
电路中⼀旦通电就会⾃动获得初始值,除此之外时序电路可以⽤复位端完成初始化组合,电路不需要初始化(2)#带来的延迟不可被综合。
电路中同样也不会存在这样简单的延迟电路,所有的延迟都要通过计时电路或交互信号来完成(3)并⾏块fork…join不可被综合,并⾏块的语义在电路中不能被转化(4)⽤户⾃定义原语UP不可被综合(5)时间变量time和实数变量real不能被综合(6) wait ,event , repeat ,forever等⾏为级语法不可被综合(7)⼀部分操作符可能不会被综合,例如,除法/操作和求余数%操作补充:综合⼯具也在不断更新和加强,有些现在不能被综合的语法慢慢地会变得可以综合,像⽐较简单的initial结构在⼀些 FPGA⼯具中也可以被识别,同时能被转化为电路形式。
1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。
(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。
建立可综合模型的原则要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:(1)不使用initial。
(2)不使用#10。
(3)不使用循环次数不确定的循环语句,如forever、while等。
(4)不使用用户自定义原语(UDP元件)。
(5)尽量使用同步方式设计电路。
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。
对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。
但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
(10)不能在一个以上的always过程块中对同一个变量赋值。
可综合的verilog语句(原创版)目录1.Verilog 语言概述2.Verilog 语句的分类3.可综合的 Verilog 语句4.应用举例正文1.Verilog 语言概述Verilog 是一种硬件描述语言,主要用于数字系统硬件的描述、模拟和验证。
它最初由 Phil Moorby 在 1983 年开发,后来由 Cadence 公司进行商业化推广。
Verilog 具有易学易用、功能强大的特点,广泛应用于集成电路设计、计算机体系结构、数字信号处理等领域。
2.Verilog 语句的分类Verilog 语句主要分为两大类:行为描述语句(Behavioral Description)和结构描述语句(Structure Description)。
行为描述语句主要用于描述数字电路的功能和行为,包括 always 语句、initial 语句等;结构描述语句主要用于描述数字电路的物理结构,包括 module 语句、wire 语句等。
3.可综合的 Verilog 语句可综合的 Verilog 语句是指在数字集成电路设计中,可以被合成器(Synthesizer)转换为实际硬件电路的 Verilog 语句。
这类语句主要包括以下几类:(1)简单的逻辑门和寄存器:如与门、或门、非门、与非门、或非门、异或门等,以及触发器、计数器、寄存器等。
(2)各种运算和操作:如算术运算(加、减、乘、除等)、关系运算(大于、小于、等于、不等于等)、位运算(按位与、按位或、按位异或、取反等)、移位运算等。
(3)控制结构:如 if-else 语句、case 语句、for 循环、while 循环等。
(4)其他:如声明、实例化、端口定义、模块调用等。
4.应用举例以下是一个可综合的 Verilog 语句示例,用于实现一个 4 位全加器的功能:```verilogmodule full_adder(input a, input b, input cin, output sum, output cout);assign sum = a ^ b ^ cin; // 异或运算实现和assign cout = (a & b) | (a & cin) | (b & cin); // 与、或运算实现进位endmodule```在这个例子中,我们声明了一个名为 full_adder 的模块,包含两个输入端口 a、b,一个输入端口 cin,以及两个输出端口 sum 和 cout。
verilog的三种描述方式(最新版)目录1.引言2.Verilog 描述方式概述1.结构描述2.数据流描述3.行为描述4.混合描述3.结构描述1.门级结构描述2.模块级结构描述4.数据流描述1.逻辑关系2.持续赋值语句5.行为描述1.寄存器传输级描述2.状态机描述6.混合描述7.结论正文一、引言Verilog 是一种硬件描述语言,广泛应用于数字电路和模拟混合信号电路的设计验证。
在 Verilog 中,有多种描述方式可以实现逻辑功能,包括结构描述、数据流描述、行为描述和混合描述。
本文将对这些描述方式进行详细介绍。
二、Verilog 描述方式概述1.结构描述:通过调用逻辑原件,描述它们之间的连接来建立逻辑电路的 Verilog 模型。
这里的逻辑元件包括内置逻辑门、自主研发的已有模块、商业 IP 模块。
结构描述分为门级结构描述和模块级结构描述。
2.数据流描述:根据信号之间的逻辑关系,采用持续赋值语句描述逻辑电路的行为。
数据流描述关注信号的传输和处理过程,适用于组合逻辑电路的设计。
3.行为描述:通过描述电路的输入输出行为,以及电路内部状态的变化,来实现逻辑功能的描述。
行为描述主要包括寄存器传输级描述和状态机描述。
4.混合描述:结合结构描述、数据流描述和行为描述,实现对逻辑功能的全面描述。
混合描述可以充分利用 Verilog 的各种特性,提高描述的准确性和效率。
三、结构描述1.门级结构描述:通过实例化内置逻辑门或使用自定义模块,构建逻辑电路的结构。
例如,可以使用与门、或门、非门等逻辑门实现组合逻辑电路。
2.模块级结构描述:将具有一定功能的模块进行组合,形成复杂的逻辑电路。
模块可以是自主研发的已有模块,也可以是商业 IP 模块。
四、数据流描述1.逻辑关系:根据信号之间的逻辑关系,使用持续赋值语句进行描述。
例如,对于一个与非门,可以使用`assign #5 neg(a);`语句描述其输出信号与输入信号 a 的逻辑关系。
1、verilog特点:★区分大小写,所有关键字都要求小写★不是强类型语言,不同类型数据之间可以赋值和运算★ //是单行注释可以跨行注释★描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守可综合原★门级描述使用门级模型或者用户自定义模型UDP来代替具体基本元件,在IDE中针对不同FPGA器件已经有对应的基本元件原语verlog语法要点2、语句组成:★ module endmodule之间由两部分构成:接口描述和逻辑功能描述★ IO端口种类: input output inout★相同位宽的输入输出信号可以一起声明, input[3:0] a,b; 不同位宽的必须分开写★内部信号为reg类型,内部信号信号的状态: 0 1 x z, 3‘bx1=3’bxx1 x/z会往左扩展 3‘b1=3’b001 数字不往左扩展★逻辑功能描述中常用assign描述组合逻辑电路,always既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用方法描述逻辑功能★ always之间、assign之间、实例引用之间以及它们之间都是并行执行,always内部是顺序执行3、常量格式: <二进制位宽><‘><进制><该进制的数值>:默认进制为10进制默认位宽为32位位宽是从二进制宽度角度而言的由位宽决定从低位截取二进制数2’hFF=2‘b11,通常由被赋值的reg变量位宽决定parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义4、变量种类: wire reg memory① IO信号默认为wire类型,除非指定为reg类型(reg和wire 的区别)wire可以用作任何输入输出端口wire包括input output inoutwire不带寄存功能assign赋值语句中,被赋值的信号都是wire类型assign之所以称为连续赋值,是因为不断检测表达式的变化reg类型可以被赋值后再使用,而不是向wire一样只能输出reg类型变量初始值为xalways模块里被赋值的信号都必须定义为reg类型,因为always 可以反复执行,而reg表示信号的寄存,可以保留上次执行的值reg类型变量与integer变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer是有符号数verilog中所有内部信号都是静态变量,因为它们的值都在reg中存储起来② memory型只有一维数组,由reg型变量组成memory初始化只能按地址赋值,不能一次性赋值1*256的memory写法: reg mema[255:0] mema[3]=0; 不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取A[a:b] 无论a b谁大,a总是实际电路的信号高位,b总是实际电路的信号低位算术运算中如果有X值则结果为Xfor循环中的变量另外定义成integer,因为它不是实际信号,有正负;reg则以无符号数存在5、运算符(其他简单的书上有自己看)== 和!=只比较0、1,遇到z或x时结果都为x (x在if中算做假条件),结果可能是1、0、x===和!==比较更加苛刻,包括x和z的精确比较,结果可能是0、1 &&的结果只有1‘b1或1’b0两种, A&A的结果位宽则是与A相同的{1,0}为 64‘h100000000,所以拼接运算中各信号一定要指定位宽移位运算左移将保留 4'b1000<<1等于5'b10000,右移则舍弃 4'b0011等于4'b0001数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算6、非阻塞式赋值<=与阻塞式赋值=(比较)阻塞:在同一个always过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语句被该赋值语句阻塞非阻塞:在同一个always过程中,非阻塞赋值语句是同时进行的,排在后面的语句不会被该赋值语句阻塞<=:块结束后才能完成赋值块内所有<=语句在always块结束时刻同时赋值<=右边各变量的值是上一次时钟边沿时,这些变量当时的值用于描述可综合的时序电路=:=语句结束之后过程always才可能结束在always过程中,begin end块内按先后顺序立即赋值,在fork join内同时赋值(可能造成冲突)与assign连用描述组合电路begin end中阻塞的含义:begin ...@(A) B=C...; end 如果A事件不发生则永远不能执行下去,被阻塞了由于时钟的延时(往往在ps级),多个always(posedge)之间究竟谁先执行是个未知数使用八原则:(1)时序电路建模时,采用非阻塞赋值(2)锁存器电路建模时,采用非阻塞赋值。
1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,supply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。
2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。
建立可综合模型的原则要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:1)不使用initial。
2)不使用#10。
3)不使用循环次数不确定的循环语句,如forever、while等。
4)不使用用户自定义原语(UDP元件)。
5)尽量使用同步方式设计电路。
6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。
对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。
但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
10)不能在一个以上的always过程块中对同一个变量赋值。