其他分享
首页 > 其他分享> > Verilog HDL语法基础

Verilog HDL语法基础

作者:互联网

一个复杂电路的完整Verilog HDL模型是由若个Verilog HDL 模块构成的,每一个模块又可以由若干个子模块构成。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。

模块(block)的组成

Verilog HDL结构完全嵌在module和endmodule声明语句之间,每个Verilog程序包括4个主要部分:端口定义,I/O说明,信号类型声明和功能描述。

module<模块名>(<端口列表>);
	端口说明(input,output,inout)
	参数定义(可选)
	数据类型定义
	连续赋值语句(assign)
	过程块(initial 和 always)
		行为描述语句
		低层模块实例
		任务和函数
	延时说明块
endmodule

    1. 所有信号都必须进行数据类型的定义,如寄存器类型(reg等),连线类型(wire等);
    2. 如果信号没有定义数据类型,则综合器将其默认为wire型;
    3. 端口的位宽最好定义在端口定义中,不要放在数据类型定义中;
    4. 不能将input和inout类型声明为reg型;

常量

关键字

关键字(又称保留字), 小写的英文字符串。如: module、endmodule、input、output、wire、reg、and、assign、always等。

标识符

标识符(identifier)是程序代码中给对象(如模块、端口、变量等)取名所用的字符串。

标识符的组成:由字母、数字字符、下划线_和美元符号$组 成 ,区 分大小写 , 其 第 一 个 字 符必须是英文字母或下划线。

注意:

1.关键字不能作为标识符使用。

2.用有意义的有效的名字如Sum 、CPU_addr等。

3.用下划线区分词。

4.采用一些前缀或后缀,如 时钟采用Clk 前缀:Clk_50,Clk_CPU; 低电平采用_n 后缀:Enable_n;

5.统一定的缩写如全局复位信号Rst。

6.同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。

7.参数(parameter)采用大写,如SIZE 。

用下列四种基本的值表示电路的逻辑状态:

0:逻辑0或“假”;

1:逻辑1或“真”;

x:未知状态,通常在信号未被赋值前;

z:高阻;

在输入或表达式中,“z”的值通常被解释成“x”,z和x是不分大小写的,如01xz 与01XZ相同;


Verilog HDL中,有3种类型的常量:整数型常量(整数)、实数型常量(实数)和参数型常量。

整数

整数的一般表达式为:

<+/-><size> ’ <base format><number>

其中 size : 大小,表示二进制位数(bit)。缺省为32位。(可有可无);

base format:数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为10进制;

number:是所选数基内任意有效数字,包括X、Z。

默认数基为10进制

当数值number大于指定的大小时,截去高位。2’b1101表示的是2’b01

一个数字可以被定义为负数,只需在位宽表达式前加一个负号,注意必须在数字定义表达式的最前面。

下划线符号_可以自由的在整数或实数中使用;就数值本身而言,它们没有任何意义。它们能够用来提高可读性;唯一的限制是下划线符号不能用来作为常数的首字符。例:a=8’b0001_0000;

-14             //十进制数-14
16’d255         //位宽为16的十进制数255
8’h9a             //位宽为8的十六进制数9a
’o21               //位宽为32的八进制数21
’hAF               //位宽为32的十六进制数AF 
-4’d10             //位宽为4的十进制数-10
(3+2)’b11001  //非法表示,位宽不能为表达式

实数

(1)十进制格式,由数字和小数点组成(必须有小数点),例如:

0.1, 3.1415, 2.0 √ 3. x

(2) 指数格式:由数字和字符e(E)组成,e(E)的前面必须要有数字而且后面必须为整数,例如:

13_5.1e2       //其值为13510.0
8.5E2          //850.0 (e与E相同)
4E-4           //0.0004   

parameter(参数型)

在Verilog HDL中为了提高程序的可读性和可维护性,用parameter来定义一个标识符代表一个常量,称为符号常量。

其说明格式如下:

parameter 参数名1 = 表达式,参数名2 = 表达式, …,参数名n = 表达式;

parameter是参数型数据的确认符。确认符后跟着一个用逗号分隔开的赋值语句表。常用参数来声明运行时的常数。可用字符串表示的任何地方,都可以用定义的参数来代替。参数是本地的,其定义只在本模块内有效。

在一个模块中改变另一个模块的参数时,需要使用defparam命令。

变量的数据类型

线状网型变量(net)wire(需要被持续的驱动,驱动它的可以是门和模块)

wire型信号定义格式如下:

wire [n-1:0] 变量名1,变量名2,…变量名n;
wire [n:1] 变量名1,变量名2,…变量名n;
wire  a;              //定义了一个1位的wire型数据
wire [7:0] b;       //定义了一个8位的wire型向量
wire [4:1] c, d;    //定义了二个4位的wire型向量

寄存器型变量 (reg)

reg  [msb:lsb] 变量名1, 变量名2,…变量名n;
例如:
reg  clock;           
reg [3:0]  regb; 
reg [4:1]  regc, regd;

可以理解为实际电路中的寄存器,具有记忆性,是数据储存单元的抽象,在输入信号消失后它可以保持原有的数值不变。常代表触发器

与线网型变量的根本区别在于:register型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。

只能在initial或always赋值,默认值是x。

注意在always和initial块内被赋值的每一个信号都必须定义成reg型。

Verilog程序模块中,被声明为input或者inout型的端口,只能被定义为线网型变量,被声明为output型的端口可以被定义为线网型或者寄存器型变量,输入输出信号类型缺省时自动定义为wire型。

wire型信号可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出,不可以在initial和always模块中被赋值。

字符串的表示:

是由一对双引号括起来的字符序列。必须在一行内写完。如”hello world!”是一个合法字符串。

每个字符串(包括空格)被看作是8位的ASCII值序列。存储字符串“hello world!”,就需要定义一个8*12位的变量:

reg[8*12:1] stringvar;
initial 
    begin
		stringvar = “ hello world”;
    end

端口数据类型

一个端口看成是由相互连接的两个部分组成,一部分位于模块的内部,另一部分位于模块的外部。当在一个模块中调用(引用)另一个模块时,端口之间的连接必须遵守一些规则。

运算符与表达式

1.算数运算符

在进行算术运算时,如果操作数的某一位为x或z,则整个表达式运算结果为不确定。 例1 + z = unknown。

两个整数进行除法运算时,结果为整数,小数部分被截去。如,6/4=1。

在进行加法运算时,如果结果和操作数的位宽相同,则进位被截去。

2.位运算符(除了~,其余都是双目运算符)

缩位运算符(单目运算符)

缩位运算符(Reduction Operators):又称缩减运算符,仅对一个操作数进行运算,按照从右到左的顺序依次对所有位进行运算,并产生一位的逻辑值

4.关系运算符

在进行关系运算时,如果声明的关系是假,则返回值是0;如果声明的关系是真,则返回值是1;如果操作数的某一位为x或z,则结果为不确定值。

5.等式运算符

逻辑相等:==

逻辑不等:!=

全等:===

z, x等位严格相等

非全等:!==

相等运算符(==)和全等运算符(===)的区别:

对于相等运算符,当参与比较的两个操作数逐位相等,其结果才为1,如果某些位是不定态或高阻值,其相等比较得到的结果就会是不定值。

对于全等比较(===)是对这些不定态或高阻值的位也进行比较,两个操作数必须完全一致,其结果才为1,否则结果是0。

6.逻辑运算符

逻辑运算符中,“&&”和“||”是双目运算符,它要求有两个操作数。

“!”是单目运算符,只要求一个操作数。

7.移位运算符

Verilog HDL的移位运算符只有左移和右移两个。其用法为:A>>n或 A<<n; 表示把操作数A右移或左移n位,同时用0填补移出的位。

8.位拼接运算符

在Verilog语言中有一个特殊的运算符:位拼接运算符{ }。

位拼接运算符{}可以把两个或多个信号的某些位拼接起来,表示一个整体信号进行运算操作。其使用方法如下:

{信号1的某几位,信号2的某几位,..,..,信号n的某几位}

对于一些信号的重复连接,可以使用简化的表示方式{n{A}}。这里A是被连接的对象,n是重复的次数。

9.条件运算符

三目运算符,对3个操作数进行运算,方式如下:

信号 = 条件?表达式1:表达式2

说明:当条件成立时,信号取表达式1的值,反之取表达式2的值。

例如:

assign out= (sel == 0) ? a : b;

标签:运算符,wire,信号,端口,语法,Verilog,模块,HDL,定义
来源: https://www.cnblogs.com/doincli/p/15168530.html