常用VerilogHDL 语法总结
- 格式:doc
- 大小:32.50 KB
- 文档页数:1
Verilog中的⼀些语法和技巧1、.2、.3、Reg型的数据类型默认初始值为X。
reg型数据可以赋正值也可以赋负值,但是当⼀个reg型数据是⼀个表达式的操作数的时候,他的值被当做⽆符号数及正值。
4、在数据类型中?和Z均表⽰⾼阻态。
5、Reg型只表⽰被定义的信号将⽤在“always”模块内,并不是说reg型⼀定是寄存器或触发器的输出。
虽然reg型信号常常是寄存器或触发器的输出但是并不⼀定总是这样。
6、Verilog语⾔中没有多维数组的存在。
Memory型数据类型是通过扩展reg型数据的弟⼦和范围来⽣成的。
其格式如下reg[n-1:0]存储器名[m-1:0];7、在除法和取余的运算中结果的符号和第⼀个操作数的符号位是相同的。
8、不同长度的数据进⾏运算:两个长度不同的数据进⾏位运算时,系统会⾃动地将两者按有端对齐,位数少的操作数会在相应的⾼位⽤0填满以便连个操作数安慰进⾏操作。
9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是2个操作数的值决定的。
由于操作书中某些位可能不定值x和⾼阻态z结果可能是不定值x。
⽽ = = =和!= = =运算符对操作数的⽐较时对某些位的⾼阻态z和不定值x也进⾏⽐较,两个操作数必须完全⼀致,其结果才是1,否则是0.10、⾮阻塞和阻塞赋值⽅式:⾮阻塞赋值⽅式(如a<=b)上⾯语句所赋得变量值不能⽴即被下⾯语句所⽤,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常⽤的赋值⽅法。
阻塞赋值(如a=b)赋值语句执⾏完后,块才结束 2 b的值在赋值语句完成后⽴即执⾏ 3在时序逻辑使⽤中,可能产⽣意想不到的结果。
11、模块的描述⽅式:(RTL为寄存器传输级描述)“(1)数据流描述⽅式:数据流⾏描述主要⽤来描述组合功能,具体⽤“assign”连续赋值语句来实现。
分为两种a、显式连续赋值语句;连线型变量类型[连线型变量为快]连线型变量名Assign #(延时量)连线型变量名=赋值表达式;显式连续赋值语句包含了两条语句;第⼀条是对连线型变量的进⾏类型说明的说明语句;第⼆句是对这个已得到声明的连线型变量进⾏连续赋值语句。
了解VerilogHDL语法规则吗,看完这篇就知道了本节介绍Verilog HDL语法规则,包括文字规则、数据对象及运算符的使用等。
Verilog HDL文字规则1.关键词与标识符关键词是Verilog HDL中预先定义的单词,它们在程序中有特别的使用目的。
已经被用作关键词的单词不可以在程序中另作他用,见表3-1。
不同版本的Verilog HDL硬件描述语言中定义的关键词数目略有变化,Verilog 1995的关键词有97个,Verilog 2001共102个。
标识符是用户编程时给对象定义的名称,对象包括:常量、变量、模块、寄存器、端口、连线、示例和beginend块等元素。
定义标识符时应遵循如下规则:只能由26个大小写英文字母、数字和下划线组成。
标识符的第一个字符必须是英文字母或下划线。
字符中的英文字母区分大小写。
【例3-7】判断下面标识符是否合法。
2.注释与C语言一样,硬件描述语言中的注释也不会被编译。
在Verilog HDL中有两种形式的注释方式:采用/* */,多用于多行注释。
采用//,用于单行注释。
【例3-8】注释举例。
在实际使用中,很多公司的编程规范明确表明,注释行中不提倡采用第一种/**/的注释方式,不允许使用中文注释。
3.常数的表示在Verilog HDL中,常数用来表示在程序中不随意变化的量,常数分为整数、实数及字符串三大类型。
(1)整数型常数是数字电路中最常用到的类型,在Verilog HDL中有两种表示方法:简单的十进制格式,例如-50、6等。
基数格式,其表达方式一般如下:〈位宽〉是十进制数值表示的常数化成二进制时对应的宽度,〈进制符号〉用进制符号b或B(二进制)、o或O(八进制)、d或D(十进制)、h或H(十六进制)表示常数的进制格式,即二进制、八进制、十进制、十六进制这4种进制表示。
数字的位宽可以默认,如果没有定义长度,数的长度由具体机器系统决定(至少是32位)。
【例3-9】常数表示方法举例。
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)锁存器电路建模时,采用非阻塞赋值。
fpga语法知识点总结一、Verilog语言Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统级设计。
在FPGA设计中,Verilog语言常常用于描述逻辑功能和时序控制。
Verilog语言包括模块、端口、信号声明、组合逻辑、时序逻辑、行为模拟等部分。
1. 模块:Verilog中的模块是一个最基本的组织单位,它类似于面向对象编程中的类。
每个模块都有自己的输入输出端口和内部逻辑实现。
在FPGA设计中,通常会设计多个模块来实现不同的功能,然后将这些模块连接起来,构成一个完整的系统。
2. 端口:在Verilog中,端口用于定义模块与外部环境的接口。
端口可以被定义为输入端口(input)、输出端口(output)、双向端口(inout)等,用于进行与外部信号的通信。
3. 信号声明:在Verilog中,信号用于传递逻辑信息。
信号可以是单个的位(bit)信号,也可以是多位(bus)信号。
在FPGA设计中,对信号的声明和使用是非常重要的,可以影响到设计的性能和资源占用。
4. 组合逻辑:组合逻辑是一种不含时钟的逻辑电路,其输出仅由输入决定。
在Verilog中,组合逻辑常常使用逻辑运算符和条件语句来描述。
5. 时序逻辑:时序逻辑是一种包含时钟信号的逻辑电路,其输出由时钟信号和输入信号共同决定。
在FPGA设计中,时序逻辑和时序约束非常重要,可以影响到设计的时序性能。
6. 行为模拟:行为模拟是一种用于验证设计功能和性能的技术。
在Verilog中,可以使用行为模拟语句来描述设计的行为,并进行仿真验证。
二、VHDL语言VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统级设计。
在FPGA设计中,VHDL语言和Verilog语言一样,用于描述逻辑功能和时序控制。
VHDL语言包括实体、端口、信号声明、组合逻辑、时序逻辑、行为模拟等部分。
1. 实体:在VHDL中,实体是描述一个硬件单元的基本描述。
verilog知识点总结Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统,它广泛应用于数字系统设计和仿真领域。
本文将总结一些Verilog 的重要知识点,以帮助读者更好地理解和应用Verilog。
一、Verilog的基本语法Verilog的基本语法包括模块声明、端口声明、信号声明、数据类型、运算符等。
Verilog中的模块是设计的基本单元,模块声明包括模块名和端口声明。
端口可以是输入、输出或双向的。
信号声明用于定义内部信号,可以是寄存器或线网类型。
Verilog支持多种数据类型,包括整数、浮点数、向量、数组等。
Verilog还提供了丰富的运算符,包括算术运算符、逻辑运算符、位运算符等。
二、组合逻辑电路描述Verilog可以用来描述各种组合逻辑电路,如与门、或门、非门等。
通过使用逻辑运算符和条件语句,可以很方便地描述组合逻辑电路的功能。
Verilog还提供了多种语法结构,如if语句、case语句等,用于描述复杂的逻辑功能。
三、时序逻辑电路描述时序逻辑电路是一种带有状态的电路,Verilog可以用来描述各种时序逻辑电路,如触发器、计数器、状态机等。
通过使用时钟信号和触发器,可以实现电路的时序行为。
Verilog提供了多种触发器类型,如D触发器、JK触发器、T触发器等,可以根据实际需求选择合适的触发器类型。
四、模块实例化和层次化设计Verilog支持模块的实例化和层次化设计,可以将一个模块实例化为另一个模块的一部分。
通过模块实例化,可以方便地实现模块的复用和层次化设计。
层次化设计可以使整个系统更加清晰和模块化,方便调试和维护。
五、仿真和验证Verilog可以用于对设计进行仿真和验证,以确保设计的正确性。
Verilog提供了仿真器,可以对设计进行时序仿真和波形查看。
通过仿真,可以验证设计的功能和时序行为是否符合要求。
Verilog 还支持测试向量的生成和自动验证,可以自动生成测试向量并进行自动验证。
常用VerilogHDL 语法总结
1 模块
(1)端口定义:声明模块的输入输出口。
引用模块时端口的两种连接方法。
(2)模块内容:I/O说明(输入输出)、内部信号说明(和端口有关的变量说明)、功能定义(定义逻辑功能的三种方式:assign 声明语句;实例元件;always 块)。
(3)理解要点:整体语句并发执行,always块内顺序执行。
2 常量
(1)数字:整数及三种表达方式
x和z值
负数:减号的位置
下划线:位置和作用
(2)参数:parameter符号常量,常用于定义延迟时间(使用#)和变量宽度。
3 变量
(1)wire:表示易assign指定的组合逻辑信号;默认值;任何方程式的输入或assign语句及实例元件的输出;定义格式。
(2)reg:表示always块中指定的信号,代表触发器;寄存器数据类型(触发器存储值),默认值为x;定义格式。
(3)memory:reg的数组;描述RAM、ROM、reg文件;单元索引;一个n为寄存器和n个一位数组的区别。
4 运算符与表达式
(1)算术运算符:五种
(2)位运算符:五种
(3)逻辑运算符:三种
(4)关系运算符:四种(3种不同的返回值)
(5)等式运算符:四种
(6)移位运算符:两种(移位补零)
(7)位拼接运算符:{},常用于某些控制信号位;重复与嵌套使用
(8)缩减运算符:类似于逻辑运算符,结果为一位二进制数(9)运算符优先级
5 语句
(1)赋值语句
阻塞赋值:b<=a;块结束后完成赋值,b的值不是立即改
变的,较为常用;
非阻塞赋值:b=a;赋值语
句执行后块才结束,b的值马上
改变,在沿触发的always块中
使用可能引起错误后果。
(2)块语句
顺序块begin-end:顺序执
行,最后语句执行完流程跳出语
句块;
并行块fork-join:同时执
行,时间最长语句执行完或
disable语句执行时跳出程序
块;
块名的作用;
起始时间和结束时间
(3)条件语句
If-else语句:三种形式;
if表达式判断;分号;复合语句;
表达式简写;if语句嵌套;if
与else的配对。
Case语句:三种形式
(casez:不考虑z进行比较,
casex:不考虑z和x进行比较);
控制表达式与分支表达式(常量
表达式);default;所有表达式
的位宽必须相等。
条件语句使用不当造成锁
存器:避免错误:case中使用
default,if必须搭配else。
(4)循环语句
Forever:格式;连续执行;
Repeat:格式;连续执行n
次;表达式通常为常量表达式;
While:格式;执行语句至
条件不满足;
For:格式:for(循环变量
初值;循环结束条件;循环变量
增值)。
(5)结构说明语句
Initial:格式;执行一次;
常用来变量初始化和生成激励
波形作为电路的测试仿真信号;
Always:格式;执行至仿真
结束;注意时序;常用来描述时
钟信号作为激励信号;时间控制
可以为沿触发(描述时序行为)
也可以是电平触发(描述组合逻
辑行为);
Task:定义;任务的调用与
变量的传递;任务调用变量与任
务定义的I/O变量必须一一对
应;
Function:定义;函数返回
值(函数定义蕴含定义了同名寄
存器);函数调用通过函数表达
式中的操作数来实现的。
(6)时间控制语句
#、@、wait标识的语句
6 系统函数和任务
(1)$display和$write:输出
信息;格式说明和普通字符;
(2)$monitor:监控和输出参
数列表中的表达式和变量值;关
闭与打开控制;
(3)$time:返回64位整数表
示当前仿真时刻值;时间尺度;
$realtime:返回时间为实
型数;
(4)$finish:退出仿真器,返
回主操作系统;参数;
(5)$stop:把EDA工具设置为
暂停,给出交互命令提示,把控
制权交给用户;
(6)$readmemb 和$readmemh:
从文件读取数据到存储器;格
式;读取内容;
(7)$random:返回32位带符
号整型随机数;用于产生随即脉
冲序列和宽度随机的脉冲序列
进行电路测试。
7 编译预处理
(1)`define:宏定义,符号常
量;
(2)`include:文件包含;使
用形式;
(3)`timescale:时间尺度,
说明跟在该命令后的模块的时
间单位和时间精度;
(4)`ifdef、`else、`endif:
满足条件的语句进行编译;不编
译的部分也应符VerilongHDL语
言规范。