Verilog语句语法补充说明

Verilog文字规则
在Verilog程序中,其值不能被随意改变的量被称为常量或者常数。常数主要有三种类型,整数类型(Integer)、实数类型(Real)和字符串类型(String)。整数类型是可以综合的,实数型和字符串型不可综合。
整数
  1. 为了提高可读性,在较长的数间可用下划线分开,下划线可以随意用在整数或实数中,本身不代表任何意义,但是数字最高位前不能用,也不能用在进制和位宽处
  2. 若不注明位宽和进制,或仅用D注明进制时,都是十进制数字,默认为32位
  3. 若未注明某整数的位宽,仅标注了数制,则位宽即为此数制规定的数值中对应的位数
  4. 整数可以在左面带正负号,但是不能放在数值内
  5. 如果定义的位宽比实际的要短,则多余位数从高位被截,如果定义的位宽要长,则从高位补0位
实数
通常表述必须带有小数点,小数点两侧必须有数字,Verilog可以将实数转化为整数,通过四舍五入。
字符串
文字字符串和数位字符串,需放在双引号中。字符串不能分成多行书写。数位字符串也成为位矢量,代表的是二进制、八进制或十六进制的数组
标识符
标识符是最常用的操作符。
  • 有效的字符:26个英文字母大小写、0~9数字、$、_
  • 任何标识符必须以英文字母或下划线开头
  • 必须是单一下划线,且其前后都必须有英文字母或数字
  • 标识符中的英文字母区分大小写
  • 允许包含图形符号、空格符
  • 转移标识符以“\”开头,以空白符结尾,可以包含任何字符
数据类型
net网线类型
定义为net类型的变量常被综合为硬件电路的物理连接,其特点是输出的值紧跟输入值的变化而变化,常被以assign关键词引导的组合电路描述。
net型数据的值取决于驱动的值。
net变量的另一适用场合是在结构描述中将其连接到一个门元件或者模块的输出端。
net变量没有连接到驱动,其值为高阻态z。
Verilog程序模块中,输入输出型变量都默认为net类型的一种子类型wire类型。
子类型: wire、tri(信号综合后的电路具有三态的功能)、supply0(地线或逻辑0)、supply1(电源线或逻辑1)、tri0(下拉类型)、tri1)(上拉类型)、wand(线与类型驱动)、wor(线或类型驱动)、trior(三态线或类型)。仅前四种可综合
register寄存器类型
除可描述组合电路外还具有寄存特性,即具有在接受下一次赋值前,可以保持原值不变的特性。必须放在过程语句中,如initial、always引导的语句中。即在always和initial等过程结构内被赋值的变量必须定义成register类型。
子类型: reg、integer(整数寄存器类型)、time(时间寄存器类型,32位带符号整型寄存器变量)、real(实数寄存器类型,64位带符号实数型寄存器变量)、realtime(实数时间寄存器类型,64位带符号实数型寄存器变量),仅前两种可综合,后三种主要用于仿真。
memory存储器类型
存储器类型memory实际上是reg类型的寄存器的扩展类。存储器可看成由reg定义的二维矢量,即由一组寄存器构成的阵列
操作符
分为单目操作符、双目操作符、三目操作符三类
逻辑操作符:&&、||、! 1&z=z 0&z=0 1|z=1 0|z=z
缩位操作符:&、~&、|、~|、^、^~、~^
常用语句补充
initial过程语句
initial过程语句没有敏感信号表,不带触发条件。该语句沿时间方向轴只执行一次,最常用于仿真模块中对激励矢量的描述,或用于给寄存器变量赋初始值。
`timescale 仿真时间单位/仿真精度
forever循环语句
可以连续不断的执行其后的语句或语句块,从而产生周期性的波形,作为仿真激励信号。因此通常在initial过程语句中。
编译指示语句
文件包含语句`include
条件编译语句`ifdef、`else、`endif
任务和函数语句
任务(task)语句
表述方式:
定义:
task <任务名>;
端口及数据类型声明语句
begin 过程语句; end
endtask
调用:
<任务名>(端口1,端口2,...,端口N);
任务的调用必须在主程序的过程结构中。
任务语句中不能出现有always或initial语句引导的过程语句结构,在任务中无法描述时序电路,只能描述组合电路
任务语句中的过程语句为顺序语句,若有多条,需要用块语句括起来
函数(function)语句
表述方式:
定义:
function<位宽范围声明>函数名;
输入端口说明,其他类型变量定义;
begin 过程语句; end
endfunction
调用:
<函数名>(输入参数1,输入参数2,...,输入端口N);
<位宽范围声明>是一个参数或位宽说明,制定函数返回值的类型或位宽,如果没有则返回值为1的寄存器类型的数据。
应该至少含有一个输入端口,不允许有常规意义上的输出端口和双向端口。
函数语句中不能出现有always或initial语句引导的过程语句结构,在任务中无法描述时序电路,只能描述组合电路
函数的调用必须在主程序的过程结构中。
函数定义语句只能放在模块中,不能放在过程结构中;函数内部可以调用函数,但不可调用任务;由于被调用的函数相当于一个操作数,所以过程语句和连续赋值语句都可以调用函数,但是不能作为语句单独出现
库元件实现结构描述
26个基本元件,调用方法与例化语句的使用方法完全相同
<模块元件名><例化元件名>(.例化元件端口(例化元件外接端口名),...);
基本门元件名 <门例化名> (<端口关联列表:输出,输入1,输入2,...>);
三态门 bufif1 U1(out,in,enable); bufif2(out,a,ctr1);
not IC1 (out1,out2,in); buf IC2 (out1,out2,out3,in); 允许有多个输出,但是只能有一个输入

猜你喜欢

转载自blog.csdn.net/weixin_40475469/article/details/78942507
今日推荐