第三章 Verilog HDL的基本语法汇总

合集下载

verilog语法

verilog语法

第三章 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)程序结构。

Verilog HDL的基本语法

Verilog HDL的基本语法

常量
什么是常量?
在程序运行过程中,其值不能被改变的 量称为常量。 例如:数字、参数等
常量----数字
1、整数: 在Verilog HDL中,整型常量即整常数有以 下四种进制表示形式:
1) 2) 3) 4) 二进制整数(b或B) 十进制整数(d或D) 十六进制整数(h或H) 八进制整数(o或O)
常量----数字
4、下划线:
下划线可以用来分隔开数的表达以提高程 序可读性。但不可以用在位宽和进制处,只 能用在具体的数字之间。见下例: 16'b1010_1011_1111_1010 //合法格式 8'b_0011_1010 //非法格式
常量----参数
在Verilog HDL中用parameter来定义常 量,即用parameter来定义一个标识符代表 一个常量,称为符号常量,即标识符形式的 常量,采用标识符代表一个常量可提高程序 的可读性和可维护性。
常量----参数
parameter型格式如下: parameter 参数名1=表达式,参数名2=表 达式, …, 参数名n=表达式; parameter msb=7; //定义参数msb为常量7 parameter e=25, f=29; //定义二个常数参 数 parameter r=5.7; //声明r为一个实型参数
模块内容
2、功能定义: 模块中最重要的部分是逻辑功能定义部分。有三 种方法可在模块中产生逻辑。 1).用“assign”声明语句 2).用实例元件 3).用“always”块
模块内容
2、功能定义: 1).用“assign”声明语句
如: assign a = b & c;
模块内容
2、功能定义: 2).用实例元件 如: and and_inst( q, a, b );

VerilogHDL语法基础

VerilogHDL语法基础

VerilogHDL语法基础⼀个复杂电路的完整Verilog HDL模型是由若个Verilog HDL 模块构成的,每⼀个模块⼜可以由若⼲个⼦模块构成。

利⽤Verilog HDL语⾔结构所提供的这种功能就可以构造⼀个模块间的清晰层次结构来描述极其复杂的⼤型设计。

每个模块的内容都是嵌在module和endmodule两个语句之间,每个模块实现特定的功能,模块是可以进⾏层次嵌套的。

每个模块⾸先要进⾏端⼝定义.并说明输⼊(input)和输出(output),然后对模块的功能进⾏逻辑描述。

Verilog HDL程序的书写格式⾃由,⼀⾏可以写⼏个语句,⼀个语句也可以分多⾏写。

除了endmodule语句外,每个语句的最后必须有分号。

⼀个模块是由两部分组成的,⼀部分描述接⼝;另⼀部分描述逻辑功能,即定义输⼊是如何影响输出的。

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

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

其格式如下:module 模块名(端⼝1,端⼝2,端⼝3,…);模块结束的标志为关键字:endmodule。

端⼝定义input(输⼊端⼝),output(输出端⼝)和inout(双向端⼝)。

格式如下:input 端⼝名1,端⼝名2,………,端⼝名N; //输⼊端⼝output 端⼝名1,端⼝名2,………,端⼝名N; //输出端⼝inout 端⼝名1,端⼝名2,………,端⼝名N; //输⼊输出端⼝也可以写在端⼝声明语句⾥,其格式如下(为了代码的可读性,⼀般不这么写):module module_name(input port1,input port2,…output port1,output port2… );信号类型说明信号可以分为端⼝信号和内部信号;1. 所有信号都必须进⾏数据类型的定义,如寄存器类型(reg等),连线类型(wire等);2. 如果信号没有定义数据类型,则综合器将其默认为wire型;3. 端⼝的位宽最好定义在端⼝定义中,不要放在数据类型定义中;4. 不能将input和inout类型声明为reg型;模块的端⼝表⽰的是模块的输⼊和输出⼝名,也就是说,它与别的模块联系端⼝的标识。

Verilog-HDL中的基本语法

Verilog-HDL中的基本语法
⑤ 可以用/*……*/或//……对Verilog HDL程序的任 何部分作注释。
一个完整的源程序都应当加上需要的注释, 以加强程序的可读性。
2.2 Verilog HDL的语法
2.2.1 空白符和注释
Verilog HDL的空白符包括空格、tab符号、换行 和换页。
空白符如果不是出现在字符串中,编译源程序 时将被忽略。
8. 条件操作符(Conditional operators)
条件操作符为:?:
条件操作符的操作数有3个,其使用格式为
操作数 = 条件 ? 表达式1:表达式2;
即当条件为真(条件结果值为1)时,操作数 = 表达式1;为假(条件结果值为0)时,操作数 = 表达 式2。
9. 位并接操作符(Concatenation operators) 并接操作符为:{} 并接操作符的使用格式: {操作数1的某些位,操作数2的某些位,…,操作数n 的某些位};
位运算操作符包括:~(按位取反)、&(按位与)、 |(按位或)、^(按位异或)、^~或~^(按位同或)。
在进行位运算时,当两个操作数的位宽不同时, 计算机会自动将两个操作数按右端对齐,位数少的操 作数会在高位用0补齐。
4. 关系操作符(Pelational operators)
关系操作符有:
<(小于)、<=(小于等于)、>(大于)、>=(大 于等于)。
② 每个模块首先要进行端口定义,并说明输入 (input)、输出(output)或双向(inouts),然 后对模块的功能进行逻辑描述。
③ Verilog HDL程序的书写格式自由,一行可以一 条或多条语句,一条语句也可以分为多行写。
④ 除了endmodule语句外,每条语句后必须要有 分号“;”。

Verilog HDL 3

Verilog HDL 3

图3-2 值变化快于时延间隔



上面例子中的时延值只出现了一个,事实上这只 是一个“上升时延”,连续赋值语句中的时延可 以指定3类时延值:上升时延、下降时延和关闭时 延(值变为x的时延)。这是一种更加精细的时延 定义方式,其语法形式如下: assign # (rise, fall, turn-off ) LHS_target=RHS_expression; 其中rise是上升时延,fall是下降时延,turn-off是关 闭时延。


其具体含义可以根据下面的例子看出来: assign Bus = MemAddr [7:4]; // 没有定义时延, 则所有时延都是0 assign #4 Ask = Quiet || Late; // 只有1个时延 值,表示上升时延、下降时延和关闭时延都是4 assign # (4,8) Ask = Quick ; /* 有2个时延值, 表示上升时延是4,下降时延是8,关闭时延是 4和8之中的较小值,即4 */ assign # (4,8,6) Arb = & DataBus; // 有3个时延值, 表示上升时延是4,下降时延是8,关闭时延是6
3.2 顺序行为建模

顺序行为建模是Verilog HDL行为建模的主 要方法,也是Verilog HDL最能体现其高级 编程语言之处,如果学过其他高级变成语 言(如C语言),就会对本节介绍的诸如ifelse、for循环之类的语法结构非常熟悉。
此外,本节还将介绍过程赋值的特点和用 法。就像连续赋值用于数据流行为建模一 样,过程赋值用于顺序行为建模。


如下例: assign Mux = (S = = 0)? A : 'bz; assign Mux = (S = = 1)? B : 'bz; assign Mux = (S = = 2)? C : 'bz; assign Mux = (S = = 3)? D : 'bz;

Verilog-HDL中的语句

Verilog-HDL中的语句

第三章 Verilog-HDL中的语句1.基本语句1.1赋值语句赋值语句分为连续赋值语句和过程赋值语句。

1.1.1连续赋值语句1.连续赋值语句用于把值赋给wire型变量(不能为reg型变量赋值)。

语句形式为:assign A = B & C;a.只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;b.如果计算的结果值有变化,新结果就赋给左边的线网。

2.连续赋值的目标类型♦标量线网 wire a;♦向量线网 wire [7:0] a;♦向量线网的常数型位选择 a[1]♦向量线网的常数型部分选择 a[3:1]♦上述类型的任意的拼接运算结果 {3a[2],a[2:1]}注:多条assign语句可以合并到一起。

3.线网说明赋值连续赋值可作为线网说明本身的一部分。

这样的赋值被称为线网说明赋值。

如: wire Clear = 'b1;等价于 wire clear;assign clear=‘b1;1.1.2 过程赋值语句1.a.过程性赋值是仅仅在initial语句或always语句内的赋值b.它只能对reg型的变量赋值。

表达式的右端可以是任何表达式。

c.过程性赋值分两类:阻塞性过程赋值 =非阻塞性过程赋值<=2.语句内部时延与句间时延a.在赋值语句中表达式右端出现的时延是语句内部时延。

Done = #5 1'b1;b.通过语句内部时延表达式,右端的值在赋给左端目标前被延迟。

即右端表达式在语句内部时延之前计算,随后进入时延等待,再对左端目标赋值。

c.对比以下语句间的时延beginTemp = 1'b1;#5 Done = Temp; //语句间时延控制end3.阻塞性过程赋值a.赋值运算符是“=”的过程赋值是阻塞性过程赋值。

b.阻塞性过程赋值在在下一语句执行前,执行该赋值语句。

例:initialbeginClr = #5 0;Clr = #4 1;Clr = #10 0;end4.非阻塞性过程赋值a .在非阻塞性过程赋值中,使用赋值符号“ <=”。

Verilog HDL基础知识

Verilog HDL基础知识
task time tran tranif0 tranif1
tri tri0 tri1 triand trior trireg unsigned vectored wait wand weak0 weak1 while wire wor xnor xor
第3章 Verilog HDL基础知识
3.2 数 据 类 型
Verilog HDL支持两种形式的注释符:/*……*/与//。其中, /*……*/为多行注释符,用于对多行语句注释;//为单行注释符, 只对注释符所在的行有效。下面是一个使用注释符对1位加法器 进行说明的例子。
第3章 Verilog HDL基础知识
【例3-2】注释符的例子。
/* 该例利用一位加法器来说明单行注释符与多行注释符的
第3章 Verilog HDL基础知识
1. 字符串变量的声明 Verilog HDL中采用寄存器变量来存储字符串,寄存器变量的 位数要大于字符串的最大长度。需要注意的是,Verilog HDL中并 不需要特殊位来存储终止符。 【例3-6】字符串变量的声明。
reg [8*12:1] stringvar; initial
'<base_format><number> 符号“'”为基数格式表示的固有字符,该字符不能省略,否 则为非法表示形式;参数<base_format>用于说明数值采用的进制 格式;参数<number>为相应进制格式下的一串数字。这种格式未 指定位宽,其缺省值至少为32位。
第3章 Verilog HDL基础知识
第3章 Verilog HDL基础知识
module addbit (a,b,ci,sum,co);
input

第三讲 verilog的基本语法

第三讲 verilog的基本语法
在Verilog中有两大主要数据类型:线网类型(wire)、寄存 器类型(reg)。 线网类型
包含下述不同种类的线网子类型。 wire, tri 用于连线的最常见的线网类型 wor, trior 线或 wand, triand 线与 trireg 此线网存储数值,用于电容节点的建模 tri1, tri0 用于线逻辑的建模,上拉或下拉驱动 supply0, supply1 supply0用于对“地”建模,supply1对电源建 模
如 a[1]
向量的常数型部分选择
如:a[3:1]
上述类型的任意的拼接运算结果
29
连续赋值语句举例
module F A _ D f (A, B, Cin, Sum, Cout ) ; input A, B, Cin; output Sum, Cout ; assign S u m = A ^B ^Cin; assign C o u t = (A & Cin) | (B & Cin) | (A & B) ; endmodule
8
下划线
下划线可以用来分割数的表达式以提高程序的可读 性,但不能用在位宽和进制处,只能用于具体的数字 之间 比如 16’b1010_1011_11111_000 //合法格式 8’b_0011_1011 //非法格式
9
负数
一个数字可以被定义成负数,只要在位宽表达式前 加一个减号 - 8’d5 // 合法格式 8’d-5 //非法格式
BpW和BpR电路图
31
寄存器(register)类型变量
寄存器( 寄存器(register)类型变量 ) register 型变量能保持其值,直到它被赋于新的值。 register 型变量常用于行为建模,产生测试的激励信号。 常用行为语句结构来给寄存器类型的变量赋值。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单元,每个单元为8位 reg [32:1] memory2[1:512]; //存储器为
512个单元,每个单元为32位
3.3 Verilog HDL的运算符
算术运算符 逻辑运算符 关系运算符 等值运算符 位运算符 缩减运算符 移位运算符 条件运算符 拼接运算符
1.算术运算符
算术运算符包括: + (加法运算符或正值运算符,如x+y,+8) - (减法运算符或负值运算符,如x-y,-90) * (乘法运算符,如x*y) / (除法运算符,如x/y) % (取模运算符,如x % y)
1.间隔符: Verilog 的间隔符主要起分隔文本的作用,可以使 文本错落有致,便于阅读与修改。
间隔符包括空格符(\b)、TAB 键(\t)、换行符(\n)及 换页符。
2.注释符:注释只是为了改善程序的可读性,在编译时不起作用。 多行注释符(用于写多行注释): /* --- */; 单行注释符 :以//开始到行尾结束为注释文字。
3.标识符和关键词
标识符:给对象(如模块名、电路的输入与输出端口、变
量等)取名所用的字符串。以英文字母或下划线开始
如,clk、counter8、_net、bus_A 。
关键词:是Verilog语言本身规定的特殊字符串,用来定义 语言的结构。例如,module、endmodule、input、 output、wire、reg、and等都是关键词。关键词都是小 写,关键词不能作为标识符使用 。出始终根据输入的变化而 更新其值的变量,它一般指的是硬件电路中的各种物理 连接.
例:网络型变量L的值由与门的驱动信号 a和b所决定,即L=a&b。a、b的值发 生变化,线网L的值会立即跟着变化。
a
&L
b
常用的网络类型由关键词wire定义 wire型变量的定义格式如下: wire [n-1:0] 变量名1,变量名2,…,变量名n;
2、每个模块先要进行端口的定义,并说明输入(input)和输出 (output),然后对模块功能进行描述。 3、除了endmodule语句外,每个语句后必须有分号。
模块定义的一般语法结构如下:
module 模块名(端口名1, 端口名2, 端口名3,…);
端口类型说明(input, outout, inout); 参数定义(可选);
4.逻辑值集合
为了表示数字逻辑电路的逻辑状态,Verilog语言规定了
4种基本的逻辑值。 0
逻辑0、逻辑假
1 x或X z或Z
逻辑1、逻辑真 不确定的值(未知状态) 高阻态
3.2 Verilog HDL的数据类型
常量 变量
一、常量
常量
整数型
十进制数的形式的表示方法:表示有符号常量 例如:30、-2
带基数的形式的表示方法: 表示常量 格式为:<+/-><位宽>’<基数符号><数 例值如>:3’b101、5’o37、8’he3,8’b1001_0011
十进制记数法 如: 0.1、2.0、5.67 实数型常量
科学记数法 如: 23_5.1e2、5E-4
23510.0、 0.0005
Verilog允许用参数定义语句定义一个标识符来代表一个常量,称 为符号常量。定义的格式为: parameter 参数名1=常量表达式1,参数名2=常量表达式 2,……;如 parameter BIT=1, BYTE=8, PI=3.14;
2. 逻辑运算符
逻辑运算符包括: && (逻辑与) || (逻辑或) ! (逻辑非)
3. 关系运算符
关系运算符包括: < (小于) <= (小于等于) > (大于) >= (大于等于)
4. 等值运算符
等值运算符包括: == (逻辑相等) != (逻辑不等) === (全等) !== (非全等)
3.memory(存储器型)
memory型是存储器型,是通过建 立reg型数组来描述的,可以描述RAM存 储器、ROM存储器和reg文件。
memory型变量的定义格式:
reg [msb:lsb] 存储单元1[n1:m1],存储单元2[n2:m2], ……;
Memory型举例:
reg memory1[1023:0]; //存储器为1024个单元,每个单元为1位 reg [7:0] memory2[15:0]; //存储器为16个
第三章 Verilog HDL的基本语法
3.1 Verilog程序的基本结构 3.2 Verilog HDL的数据类型 3.3 Verilog HDL的运算符 3.4 Verilog HDL的基本语句 3.5 模块化程序设计
3.1 Verilog程序的基本结构
Verilog使用大约100个预定义的关键词定义该语言的结构 1、 VerilogHDL程序由模块构成。每个模块的内容都是嵌在关键词 module和endmodule两个语句之间。每个模块实现特定的功能。
5. 位运算符
位运算符包括: ~ (非) & (与) ~& (与非) | (或) ~| (或非) ^ (异或) ^~ 或~^ (同或)
变量宽度
例:wire L; //将上述电路的输出信号L声明为网络型变量 wire [7:0] data bus; //声明一个8-bit宽的网络型总线变量
2.reg(寄存器型) 寄存器型变量对应的是具有状态保持作用的电等路元件,如触 发器寄存器。寄存器型变量只能在initial或always内部被赋值。
4种寄存器类型的变量
抽象描述, 不对应具 体硬件
寄存器类型 reg
integer real time
功能说明 常用的寄存器型变量 32位带符号的整数型变量 64位带符号的实数型变量, 64位无符号的时间变量
例: reg clock;//定义一个1位寄存器变量 reg [3:0] counter; //定义一个4位寄存器变量
说明部分
数据类型定义(wire, reg等);
实例化低层模块和基本门级元件; 连续赋值语句(assign); 过程块结构(initial和always)
行为描述语句; endmodule
逻辑功能描 述部分,其 顺序是任意的
补充: Verilog语言的基本语法规则
为对数字电路进行描述(常称为建模),Verilog语言规定 了一套完整的语法结构。
相关文档
最新文档