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填满以便连个操作数安慰进⾏操作。单个字符视为长度为1的字符串
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 #(延时量)连线型变量名=赋值表达式;
显式连续赋值语句包含了两条语句;第⼀条是对连线型变量的进⾏类型说明的说明语句;第⼆句是对这个已得到声明的连线型变量进⾏连续赋值语句。
影视赋值语句:连线型变量类型(复制驱动强度)[连线型变量位宽]#(延时量)连线性变量名=赋值表达式。隐式连续赋值语句是把连线性变量说明语句和连线性变量连续赋值语句结合在⼀条语句中。他可以对连线型变量进⾏说明的同时进⾏连续赋值。
Assign 连续赋值语句的功能是:当赋值表达式中的变量的只发⽣变化时,重新计算赋值表达式的值,并在指定的时延后将得到的结果赋给左端的连线性变量。Assign只能实现组合功能。⽽reg型数据可以可以存储过程赋值的最终结果。端⼝默认为连线性的不⽤定义⼀般,只要输⼊发⽣变化输出马上发⽣变化。(2)⾏为描述⽅式:
A、initial语句:此语句只执⾏⼀次。
B、always语句:次语句循环执⾏。
只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持所有值不变。以上两种语句在0时刻并发执⾏。
(3)、结构描述⽅式
结构描述是通过实例进⾏描述的⽅法,他将verilog中预定义的基本元件实例嵌⼊到语⾔中,监控实⼒的舒服,⼀旦其中任何⼀
个发⽣变化,便重新运算并输出。在verilog HDL中可以使⽤如下结构描述部件:
A、⽤户⾃⼰定义的模块b、⽤⽤户⾃定义元件UDP c、内置门级元件 d、内置开
关级元件
(4)混合型描述
11、连续赋值语句与过程赋值语句的区别:
我觉得这个在刚开始学习verilog时,是会有⼀些疑问的!
a、从语法上来看,连续赋值语句由“assign”关键词来表⽰,⽽过程赋值语句中则不包含
b、连续赋值语句中左侧的被赋值数据类型必须是线⽹型数据,⽽过程赋值语句
中的被赋值数据类型则必须是寄存器类型的变量
c、连续赋值语句不能出现在过程快(initial 过程快或者always过程块)中,⽽过程赋值语句则只能出现在过程快中
d、连续复制语句主要⽤来对组合逻辑电路进⾏建模以及对线⽹型数据间的连接进⾏描述,⽽过程赋值语句主要⽤来对时序逻辑电路进⾏⾏为描述
e、连续赋值语句对被赋值线⽹型数据的赋值是“连续的”(即连续复制语句产⽣作⽤后,赋值表达式中的信号的任何变换都将⽴即反映到被赋值线⽹型数据的取值上,这也是我们有时会使⽤“连续驱动”这个术语的原因),⽽在过程赋值语句情况下,只有在过程赋值语句被执⾏时才执⾏赋值操作,语句执⾏完后被赋值变量的取值不再受到赋值表达式的影响.
12、间隔符和注释符:verilog HDL中的间隔符包括空格(\b)、tab(\t)、换⾏符(\n)以及换页符。
注释符有2种://和/*……….*/ 后为多⾏注释符⽤于对多⾏语句注释;前者为单⾏注释符,只对注释符所在的⾏有效。
13、数值:下划线除了不可以放于数值的⾸位意外,可以随意⽤在整型数和实型数之间,他们对数值的⼤⼩没有任何的影响,只是为了提⾼可读性。
在verilog中有⼆进制(b或者B)、⼗进制(d或者D)、⼋进制(o或者O)、⼗六进制(h或者H)
格式:’ ⽤于指定所表⽰数的位宽,在数值的表⽰中式可以缺省的.位宽⼩于数值的实际位数时,相应的⾼位部分被忽略;当位宽⼤于实际的位数,且数值的最⾼位是0或者1时,相应的⾼位补零;当位宽⾼于数值的实际位数,但数值的最⾼位是x或者z 时相应的⾼位部分补x 或者z。⼆进制中的x或者z表⽰⼀位处于x或者z,⼋进制的表⽰三位,⼗六进制的表⽰4位。
14、实型数及其表⽰⽅法
Verilog HDL中的实数可以⽤⼗进制与科学计数法两种格式来表⽰,如果采⽤⼗进制数格式,⼩数点两边必须有数字,否则为⾮法字符。
如 3.8E10 2.1e-9;
15、字符串
字符串是⽤双引号括起来的字符序列,他必须包含在同⼀⾏中,不能分成多⾏书写。如字符串⽤作verilo
g HDL表达式或赋值语句中的操作数,则字符串被看做8位的ASCII值序列,即⼀个对应8位的ASCII码。
在verilog中采⽤寄存器变量来存储字符串,寄存器变量的位数要⼤于字符串的最⼤长度。需要注意的是,verilog HDL中并不需要特殊位来存储终⽌符。可以采⽤标准操作符对字符串进⾏诸如连接类的操作。在操作过程中字符串变量位数⼤于字符串的实际长度,则字符串变量的⾼位补零。
Reg[8*12:1]stringvar
Initial
Begin string=“hello woeld!”;
End
特殊字符:\n 换⾏符\t tab键 \\ 符号\
\*符号* \ddd三位⼋进制数表⽰的ASCII值 %%符号%
16、数据类型
(1)、物理数据类型:分为连线性和寄存器型变量可以取0、1、x、z,中的认可⼀个。X表⽰⼀个位置
初始状态的变量,或者由于多个驱动源试图将其设定为不同的值⽽引起的冲突性连线性变量,z表⽰⾼祖状态或浮空量。
物理类型数据分为连线型和寄存器型亮中
连线型数据对应的是硬件电路的物理信号连线,没有电荷的保持作⽤(trireg 除外)。连线型数据必须有去动员驱动,有两种⽅式对他进⾏驱动:⼀种是结构描述中把它连接到⼀个们或者模块的输出端;⼆是⽤连续赋值语句assign对其进⾏复制。当没有驱动源对其驱动时,他将保持⾼阻态
Verilog HDL中的连线型数据及其功能描述
寄存器数据对应的是具有保持作⽤的硬件电路与元件,如触发器、锁存器等。如reg没初始化则将为x缺省为⼀位。
两种数据的区别:寄存器型数据保持最后⼀次的赋值,⽽连线型数据需要有持续的驱动。寄存器数据的驱动刻意通过过程赋值语句实现,过程赋值语句只能出现在过程语句后⾯的过程块语句中。
存储区:verilog中采⽤寄存器数组来表⽰存储器,⽤来对ROM,RAM或寄存器⽂件进⾏建模。数组中的每⼀个寄存器均称为⼀个元素,⽤不同的索引来寻址。Reg[16:1] mem[5:1] 申明16位5字的存储器与寄存器。
(2)、抽象数据类项
有整型integer 时间型time 实型real 参数性parameter
17、运算符
算术运算符:包括+ - * / %是⼆元运算符。如果操作数为寄存器或者连线型则为⽆符号数;如果为整型或者实型,则刻意是有符号数。当⽤基数格式表⽰整数时,⼀定是⽆符号数;两个操作数中的⼀个为x则记过为x。
18、按位运算符和逻辑运算符:!是逻辑⾮⽽~是按位操作的⾮即按位取反。例如:对于
!(3==2)的结果是1;⽽后者对为进⾏操作~(0、0、1、0)=1101;
19、归约运算符:归约运算是对单个的操作数进⾏归约的递推运算,最后的结果是⼀位的⼆进制数。具体过程:先讲操作数的第⼀位和第⼆位进⾏归约运算,然后将运算结果与第三位进⾏归约运算,以此类推,直到最后⼀位。格式(&b)
19、移位运算?!不会
20、条件运算符:verilog HDL中只有唯⼀的⼀种三⽬运算符,及条件运算符有三个操作数。如第⼀个操作数为逻辑1,则算⼦返回第⼆个操作数;如第⼀个操作数为逻辑0,则返回第三个操作数;如第⼀个操作数为⾼阻态或未知态则按下表给出的逻辑,将第⼆个和第三个操作数按位⽐较得到结果。
21、连接和复制:连接运算是将多个⼩的表达式合并成⼀个⼤的表达式。Verilog HDL中⽤符号{,,}实现多个表达式的链接运算,各个表达式之间⽤“,”隔开。复制运算符{{}}将⼀个表达式放⼊双重花括号内,⽽复制因⼦放在第⼀个括号内,⽤来指定复制的次数。
⼆、模块的基本结构
1、⾏为描述的结构:
Module<;模块名>(<;端⼝列表>)
模块端⼝说明
参数定义(可选)
数据类型说明
过程快(initial过程块或always快,可有⼀个或多个)
连续赋值语句
任务定义(tast)(可选)
函数定义(function)(可选)
其中:数据类型说明⽤来对模块中⽤到的各类变量类型进⾏说明,如果某个变量没有进⾏数据类型说明,则他的类型缺省为连线类型(wire)。
上⾯列出的各个模块组成项可以是任意次序出现,但是端⼝说明和数据类型说明必须出现在端⼝和数据被引⽤之前。
2、(1)在⾏为描述模块中出现的每个过程块(always过程块或者initial过程块)都代表⼀个独⽴的进程。
(2)在进⾏仿真时,所有的过程块的执⾏都是从0时刻开始并⾏的执⾏。(3)每⼀个过程块内部的多条语句的执⾏⽅式可以是顺序执⾏的(当快定义语句为begin——end时的情况),也可以是并⾏执⾏的(块定义语句是fork-join 时的情况)。
(4)always和initial过程块都是不能嵌套使⽤的。
3、initial过程块:
Initial
语句块
⽽语句块的格式为:
<;块定义语句>:<;块名>
块内局部变量;
时间控制1 ⾏为语句;
。。。。。。。。
时间控制n ⾏为语句;
<;块定义语句2>
其中:块定义语句刻意是“begin end”语句组,或者时“fork,join”语句组。<;块名>为可选项,块名可以乘早⼀个局部作⽤域。定义块名的过程快成为“有名块”,在有名块下可以定义局部变量,有名块内部语句的执⾏刻意被disable语句中断。
块内局部变量说明也是可选项,只有在有名块中才能定义局部变量,并且块内局部变量只能是寄存器类数据类型。
⾏为语句可以是如下语句中的⼀种:过程赋值语句(阻塞型或⾮阻塞型过程赋值语句)过程连续赋值语句(assign/deassign 或force/release语句组) if 条件分⽀语句 case条件分⽀语句循环控制语句(forever、repeat、while、for循环语句) wait等待语句 disable终端语句事件触发语句(event ——trigger)任务调⽤语句(⽤户⾃定义的任务或系统任务)。
Initial过程块的使⽤只要是⾯向功能模拟的,他通常不具有可综合性。Initial 过程块通常来描述测试模块的初始化、监视、波形⽣成等功能⾏为;⽽对硬件功能模块的⾏为描述中,initial过程块常常⽤来对只需执⾏⼀次的过程进⾏描述,例如刻意⽤来寄存器的初始化!
4、always过程块:
Always过程块是由“always”过程语句和语句块组成的,他的格式为:
Always@(敏感事件列表)
语句块
其中语句块的格式为:
<;块定义语句1 这⾥⼀般是begin或者fork>:<;块名>
块内局部变量说明;
时间控制1 ⾏为语句1;
。。。。。。
时间控制n ⾏为语句n;
<;块定义语句2 这⾥⼀般是end>
说明:@(敏感事件列表)是可选项,带有敏感事件列表的语句块被称为“由事件控制的语句块”他的执⾏守敏感事件的控制。敏感事件是有OR连接起来的⼀个或者多个表达式,只要发⽣了敏感事件列表所列出的多个事件中的任何⼀个,就启动后⾯语句块的执⾏。敏感事件列表实际上代表了⼀个事件控制类型的时间控制。
他的块内定义语句也分为串⾏块和并⾏块。
5、always和initial语句的区别:always语句过程语句后⾯可以有⼀个敏感事件列表,该敏感事件列表的作⽤是来激活always 过程块语句的执⾏,⽽initial 语句后⾯则不允许有敏感事件列表。如果always的敏感事件列表是缺省的则认为触发条件始终被满⾜。
6、always过程块的使⽤只要是对硬件功能模块的⾏为进⾏描述,他可以是在测试模块中⽤来对视中进⾏描述。利⽤always过程块可以实现锁存器和触发器他也可以⽤来实现组合逻辑。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。