verilog语法

发布 2021-05-11 06:39:28 阅读 7772

第三章 verilog hdl的基本语法。

前言。verilog hdl是一种用于数字逻辑电路设计的语言。用verilog hdl描述的电路设计就是该电路的verilog hdl模型。

verilog hdl既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的verilog hdl模型。verilog模型可以是实际电路的不同级别的抽象。

这些抽象的级别和它们对应的模型类型共有以下五种:

系统级(system):用高级语言结构实现设计模块的外部性能的模型。

算法级(algorithm):用高级语言结构实现设计算法的模型。

rtl级(register transfer level):描述数据在寄存器之间流动和如何处理这些数据的模型。

门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。

开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。

一个复杂电路系统的完整verilog hdl模型是由若干个verilog hdl模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用verilog hdl语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。

verilog hdl行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和rtl级的模型设计。这种行为描述语言具有以下功能:

可描述顺序执行或并行执行的程序结构。

用延迟表达式或事件表达式来明确地控制过程的启动时间。

通过命名的事件来触发其它过程里的激活行为或停止行为。

提供了条件、if-else、case、循环程序结构。

提供了可带参数且非零延续时间的任务(task)程序结构。

提供了可定义新的操作符的函数结构(function)。

提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。

verilog hdl语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。因其结构化的特点又使它具有以下功能:

提供了完整的一套组合型原语(primitive);

提供了双向通路和电阻器件的原语;

可建立mos器件的电荷分享和电荷衰减动态模型。

verilog hdl的构造性语句可以精确地建立信号的模型。这是因为在verilog hdl中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。

verilog hdl作为一种高级的硬件描述编程语言,有着类似c语言的风格。其中有许多语句如:if语句、case语句等和c语言中的对应语句十分相似。

如果读者已经掌握c语言编程的基础,那么学习verilog hdl并不困难,我们只要对verilog hdl某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对verilog hdl中的基本语法逐一加以介绍。

3.1.简单的verilog hdl模块。

3.1.1.简单的verilog hdl程序介绍。

下面先介绍几个简单的verilog hdl程序,然后从中分析verilog hdl程序的特性。

例[3.1.1]:module adder ( count,sum,a,b,cin );

input [2:0] a,b;

input cin;

output count;

output [2:0] sum;

assign =a + b + cin;

endmodule

这个例子通过连续赋值语句描述了一个名为adder的三位加法器可以根据两个三比特数a、b和进位(cin)计算出和(sum)和进位(count)。 从例子中可以看出整个verilog hdl程序是嵌套在module和 endmodule 声明语句里的。

例[3.1.2]:module compare ( equal,a,b );

output equal; /声明输出信号equal

input [1:0] a,b; /声明输入信号a,b

assign equal=(a==b)?1:0;

*如果a、b 两个输入信号相等,输出为1。否则为0*/

endmodule

这个程序通过连续赋值语句描述了一个名为compare的比较器。对两比特数 a、b 进行比较,如a与b相等,则输出equal为高电平,否则为低电平。在这个程序中和表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。

例[3.1.3]:module trist2(out,in,enable);

output out;

input in, enable;

bufif1 mybuf(out,in,enable);

endmodule

这个程序描述了一个名为trist2的三态驱动器。程序通过调用一个在verilog语言库中现存的三态驱动器实例元件bufif1来实现其功能。

例[3.1.4]: module trist1(out,in,enable);

output out;

input in, enable;

mytri tri_inst(out,in,enable);

//调用由mytri模块定义的实例元件tri_inst

endmodule

module mytri(out,in,enable);

output out;

input in, enable;

assign out = enable? in : bz;

endmodule

这个程序例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块。模块trist1调用由模块mytri定义的实例元件tri_inst。

模块trist1是顶层模块。模块mytri则被称为子模块。

通过上面的例子可以看到:

verilog hdl程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。

模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。

每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。

verilog hdl程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。

除了endmodule语句外,每个语句和数据定义的最后必须有分号。

可以用/*.和//.对verilog hdl程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。

3.1.2.模块的结构。

verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:

请看上面的例子,程序模块旁边有一个电路图的符号。在许多方面,程序模块和电路图符号是一致的,这是因为电路图符号的引脚也就是程序模块的接口。而程序模块描述了电路图符号所实现的逻辑功能。

上面的verilog设计中,模块中的第。

二、第三行说明接口的信号流向,第。

四、第五行说明了模块的逻辑功能。以上就是设计一个简单的verilog程序模块所需的全部内容。

从上面的例子可以看出,verilog结构完全嵌在module和endmodule声明语句之间,每个verilog程序包括四个主要部分:端口定义、i/o说明、内部信号声明、功能定义。

3.1.3.模块的端口定义。

模块的端口声明了模块的输入输出口。其格式如下:

module 模块名(口1,口2,口3,口4, …

3.1.4.模块内容。

模块的内容包括i/o说明、内部信号声明、功能定义。

i/o说明的格式如下:

输入口: input 端口名1,端口名2,……端口名i; /共有i个输入口)

输出口: output 端口名1,端口名2,……端口名j; /共有j个输出口)

i/o说明也可以写在端口声明语句里。其格式如下:

module module_name(input port1,input port2,…

output port1,output port2… )

内部信号说明:在模块内用到的和与端口有关的wire 和 reg 变量的声明。

如: reg [width-1 : 0] r变量1,r变量2 。。

wire [width-1 : 0] w变量1,w变量2 。。

功能定义: 模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。

1).用“assign”声明语句。

如: assign a = b & c;

这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。例子中的方程式描述了一个有两个输入的与门。

2).用实例元件。

如: and and_inst( q, a, b );

采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可,表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆。

3).用“always”块。

如:always @(posedge clk or posedge clr)

beginif(clr) q <=0;

else if(en) q <=d;

end采用“assign”语句是描述组合逻辑最常用的方法之一。而“always”块既可用于描述组合逻辑也可描述时序逻辑。上面的例子用“always”块生成了一个带有异步清除端的d触发器。

“always”块可用很多种描述手段来表达逻辑,例如上例中就用了if...else语句来表达逻辑关系。如按一定的风格来编写“always”块,可以通过综合工具把源**自动综合成用门级结构表示的组合或时序逻辑电路。

verilog语法总结

整理 张步阳。1.如果没有明确说明,则端口都是wire线网型的,且输入端口只能是wire线网型的。型数据通常以assign关键字指定的组合逻辑信号。wire只能被assign连续赋值,reg 只能在initial和always中赋值。input端口只能定义成wire型。是寄存器数据类型的关键字。寄存...

Verilog语法运用

verilog中条件编译命令 ifdef else endif用法。一般情况下,verilog?hdl源程序中所有的行都参加编译。但是有时候希望对其中的一部份内容只有在条件满足的时候才进行编译,也就是对一部分内容指定编译的条件,这就是 条件编译 有时,希望当满足条件时对一组语句进行编译,当条件不满足...

verilog语法提纲

reg 7 0 mema 255 0 这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255.4.运算符及表达式 1 算术运算符。2 赋值运算符 3 关系运算符 4 逻辑运算符 5 条件运算符 6 位运算符。7 移位运算符 8 拼接运算符 9 其它。说...