verilog的基本语法(一)
一个模块包括两部分:一个是接口,另一部分是描述逻辑单元(定义输入如何影响输出)
每个verilog程序包括4个部分:端口定义,I/O说明,内部信号声明,功能定义
端口定义:模块的端口声明了模块的输入输出口 格式 module 模块名(口1,口2,口3,口4, ………);
模块内容:包括I/O说明,内部信号说明,功能定义
I/O说明格式
输入口: input 端口名1,端口名2,………,端口名i; //(共有i个输入口)
输出口: output 端口名1,端口名2,………,端口名j; //(共有j个输出口)
module module name(input part1,input part2…)
内部信号说明
在模块内用到的和与端口有关的wire和reg变量的声明
reg [width-1 : 0] R变量1,R变量2 。。。。;
wire [width-1 : 0] W变量1,W变量2 。。。。;
功能定义
模块中最重要的是逻辑功能定义部分
1)用“assign”声明语句
2)用实例元件
3)用“always”块
“always”块既可用于描述组合逻辑也可 描述时序逻辑。两个或更多的“always”模块也是同时执行的,
但是模块内部的语句是顺序执行的
基本数据类型:reg型、wire型、integer型、parameter型 其他的类型还有(large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior 型、trireg型、vectored型、wand型、wor型)
常量
一、数字(整数、x和z值、负数、下划线)
整数:1) 二进制整数(b或B)
2) 十进制整数(d或D)
3) 十六进制整数(h或H)
4) 八进制整数(o或O)
描述方式:1) <位宽><进制><数字>这是一种全面的描述方式
2) <进制><数字>在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统 决定,但至少32位)
3) <数字>在这种描述方式中,采用缺省进制十进制
x和z值:x代表不定值,z代表高阻值(一个x可以用来定义十六进制数的四位二进制数的状态, 八进制数的三位,二进制数的一位。z的表示方式同x类似)
负数:
下划线:下划线可以用来分隔开数的表达以提高程序可读性 (负数和下划线都不能用在位宽和进制位之间)
二、参数型(经常用于定义延迟时间和变量位宽)
用Parameter来定义一个标识符代表常量,称为符号常量(标识符形式的常量)
说明格式:parameter 参数名1=表达式,参数名2=表达式, …, 参数名n=表达式;
变量
网络类型 (网络类型的变量不能存储值,而且它必须受到驱动器的驱动,如果没有驱动器链接到网络上,该变量就是高阻的即z)
一、wire型(表示单个门驱动或连续赋值语句驱动的网络型数据)
verilog程序模块输入输出信号类型缺失时自动定义为wire型
定义格式:wire [n-1:0] 数据名1,数据名2,…数据名i; //共有i条总线,每条总线内有n条线路 或 wire [n:1] 数据名1,数据名2,…数据名i;
二、tri型(表示多驱动驱动的网络型数据)------------wire和tri型都是连接器件单元的
三、reg型(寄存器数据类型)
reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。在always模块内被赋值的每个信号都必须定义称reg型
reg型数据的格式如下:
reg [n-1:0] 数据名1,数据名2,… 数据名i; (定义i个n位的reg型数据)或
reg [n:1] 数据名1,数据名2,… 数据名i;(定义i个n位的reg型数据)
注意:reg型只表示被定义的信号将用在“always”模块内
四、memory型------通过扩展reg型数据的地址范围生成
格式:reg [n-1:0] 存储器名[m-1:0];
reg [n-1:0] 存储器名[m:1];
运算符及其表达式
1) 算术运算符(+,-,×,/,%)
2) 赋值运算符(=,<=)
3) 关系运算符(>,<,>=,<=)
4) 逻辑运算符(&&,||,!)
5) 条件运算符(?:)
6) 位运算符(~,|,^,&,^~)
7) 移位运算符(<<,>>)
8) 拼接运算符({ })
9) 其它