资源描述
第第3章章 Verilog 基本语法基本语法 2 3.1 Verilog HDL基本模块说明基本模块说明 3.2 Verilog HDL中的词汇约定中的词汇约定 3.3 Verilog HDL 数据类型数据类型 3.4 Verilog HDL 运算符运算符 主要内容主要内容: : 3 3.1 Verilog HDL基本模块说明基本模块说明 umodule能够表示:能够表示: u物理块,物理块,如如IC或或ASIC单元单元 u逻辑块,逻辑块,如一个如一个CPU设计的设计的ALU部分部分 u整个系统整个系统 u每一个模块的描述从关键词每一个模块的描述从关键词module开始,有一个名称(如开始,有一个名称(如 SN74LS74,DFF,ALU等等),由关键词等等),由关键词endmodule结束。结束。 module是层次是层次 化设计的基本化设计的基本 构件构件 逻辑描述放在逻辑描述放在 module内部内部 4 Verilog 模块模块(module)结构基本要素结构基本要素 知识点:知识点: 3.1.1 端口信息端口信息 3.1.2 输入输入/ /输出说明输出说明 3.1.3 逻辑功能描述逻辑功能描述 5 3.1.1 端口信息端口信息 1,端口在模,端口在模 块名字后的块名字后的 括号中列出括号中列出 3,端口可以说,端口可以说 明为明为input, , output及及inout 2,端口等价于硬,端口等价于硬 件的引脚件的引脚( (pin) ) u模块通过端口与外部通信模块通过端口与外部通信 6 Verilog 模块的结构由在模块的结构由在module和和endmodule 关键词之间的四个主要部分组成:关键词之间的四个主要部分组成: - 1. 端口信息:端口信息: module combination(a, b, c, d ); - 2. 输入输入/输出说明输出说明 : input a, b, c ; output d ; -/ 输入输入/输出端口信号类型声明,缺省为输出端口信号类型声明,缺省为wire型型 : - 3. 内部信号:内部信号: wire x; - 4. 功能定义:功能定义: assign d = a | x ; assign x = ( b endmodule 3.1.2 端口说明端口说明 7 3.1.3 逻辑功能描述逻辑功能描述 module mux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a; endmodule 两路选择器的两路选择器的RTL级描述级描述1: 8 两路选择器的两路选择器的RTL级描述级描述2: module mux2to1 (out, a, b, sel); input a, b, sel; output out; reg out; always ( sel or a or b) if (! sel) out = a; else out = b; endmodule 9 u1. 端口信息端口信息 u2. 输入输入/输出说明输出说明 u3. 逻辑功能描述(逻辑功能描述(实例化实现功能描述实例化实现功能描述) 实例化实例化( (module instances):): 10 module mux2to1 (out, a, b, sl); input a, b, sl; output out; not u1 (nsl, sl ); and u2 (sela, a, nsl); and u3 (selb, b, sl); or u4 (out, sela, selb); endmodule 两路选择器的门级描述两路选择器的门级描述- -实例化:实例化: 11 u请在下面的空格中填入适当的符号请在下面的空格中填入适当的符号 使其成为右图的使其成为右图的Verilog 模块模块 : module block1(a, b, , , ); input , , ; d, ; assign d = a | ( b assign e = ( b _ 练习练习: :编写编写Verilog HDL模块模块 a b c d e 12 module block1(a, b, c, d, e ); input a, b, c; output d, e ; assign d = a | ( b assign e = ( b endmodule 练习答案练习答案:编写编写Verilog HDL模块模块 a b c d e 13 3.2 Verilog HDL中的词汇约定中的词汇约定 知识点:知识点: u3.2.1 术语及定义术语及定义 u3.2.2 空白符和注释空白符和注释 u3.2.3 Verilog采用的四值逻辑系统采用的四值逻辑系统 u3.2.4 整数常量和实数常量整数常量和实数常量 u3.2.5 字符串字符串 u3.2.6 标识符标识符 u3.2.7 系统任务及函数系统任务及函数 u3.2.8 编译指导编译指导 u3.2.9 文本包含文本包含 u3.2.10 文本替换文本替换 14 3.2.1 术语及定义术语及定义 1.空白符:空白符:空格、空格、tabs及换行及换行 2. 标志符标志符(Identifier):Verilog中对象中对象(如模块或信号如模块或信号)的名字的名字 3.LSB:最低有效位最低有效位(Lease significant bit) 4.MSB:最高有效位最高有效位(Most significant bit) 15 3.2.2 空白符和注释空白符和注释 module MUX2_1 (out, a, b, sel); / Port declarations output out; input sel; / control input input b, a; /* data inputs */ wire sel_, a1, b1; /*The netlist logic selects input ”a” when sel = 0 and it selects ”b” when sel = 1. */ not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1); endmodule 格式自由格式自由 使用空白符提高可读性及代码组使用空白符提高可读性及代码组 织。织。Verilog忽略空白符除非用于忽略空白符除非用于 分开其它的语言标记。分开其它的语言标记。 多行注释,在多行注释,在/ /* * * */ /内内 单行注释单行注释 到行末结束到行末结束 16 3.2.3 Verilog采用的四值逻辑系统采用的四值逻辑系统 0, Low, False, Logic Low, Ground,VSS, Negative Assertion 1, High, True, Logic High, Power, VDD, VCC, Positive Assertion X Unknown: Occurs at Logical Which Cannot be Resolved Conflict Z, High Impedance, Tri- Stated, Disabled Driver (Unknown) 17 3.2.4 整数常量和实数常量整数常量和实数常量 Verilog中,常量中,常量(literals)可是整数也可以是实数。可是整数也可以是实数。 1.整数的大小可以定义也可以不定义。整数表示为:整数的大小可以定义也可以不定义。整数表示为: 其中其中 size :位数大小,由十进制数表示的位数位数大小,由十进制数表示的位数(bit) 表示。表示。缺省为缺省为32位位 base:数基,可为数基,可为2(b)、8(o)、10(d)、 16(h)进制。缺省为进制。缺省为10进制进制 value:是所选数基内任意有效数字,包括是所选数基内任意有效数字,包括 X、Z。 2.实数常量可以用十进制或科学表示法表示。实数常量可以用十进制或科学表示法表示。 18 12 unsized decimal (zero- extended to 32 bits) h83a unsized hexadecimal (zero- extended to 32 bits) 8b1100 0001 8-bit binary 16hff01 16-bit hexadecimal 32bz01x Z-extended to 32 bits 3b1010 1101 3-bit number, truncated to 3b101 6.3 decimal notation 32e- 4 scientific notation for 0.0032 4.1E3 scientific notation for 4100 整数与实数常量例子整数与实数常量例子 19 整数和实数常量小结整数和实数常量小结 u整数的大小可以定义也可以不定义。整数表示为:整数的大小可以定义也可以不定义。整数表示为: u数字中(数字中(_ )忽略,便于查看)忽略,便于查看 u没有定义大小没有定义大小(size)整数缺省为整数缺省为32位位 /*特别注意特别注意*/ u缺省数基为十进制缺省数基为十进制 u数基数基(base)和数字和数字(16进制进制)中的字母无大小写之分中的字母无大小写之分 u当数值当数值value大于指定的大小时,截去高位。如大于指定的大小时,截去高位。如 2b1101表示的是表示的是 2b01 u实数常量实数常量 u实数可用科学表示法或十进制表示实数可用科学表示法或十进制表示 u科学表示法表示方式:科学表示法表示方式: , 表示:表示: 尾数尾数10指数 指数 20 3.2.5 字符串(字符串(string)(了解了解) u字符串要在一行中用双引号括起来,也就是不能跨行。字符串要在一行中用双引号括起来,也就是不能跨行。 u字符串中可以使用一些转义字符串中可以使用一些转义(escape)符,如符,如t n 可以使用一些格式符可以使用一些格式符(如如%b)在仿真时产生格式化输出:在仿真时产生格式化输出: ”This is a normal string” ”This string has a t tab and ends with a new linen” ”This string formats a value: val = %b” Verilog中,字符串大多用于显示信息的命令中。中,字符串大多用于显示信息的命令中。(只用在测只用在测 试中!试中!) 21 格式符格式符 %h%o%d%b%c%s%t hexoctdecbinACSIIstringtime 转义符转义符 tn” tab换行换行反斜杠反斜杠双引号双引号ASCII representation of above 格式符格式符%0d表示没有前导表示没有前导0的十进制数的十进制数 22 3.2.6 标识符标识符(identifiers) (重点重点) u标识符是用户在描述时给标识符是用户在描述时给Verilog对象(电路模块、信号等)起的名字对象(电路模块、信号等)起的名字 u标识符必须以字母标识符必须以字母(a-z, A-Z)或或( _ )开头,后面可以是字母、数字、开头,后面可以是字母、数字、( $ )或或( _ )。 u最长可以是最长可以是1023个字符个字符 u标识符区分大小写,标识符区分大小写,sel和和SEL是不同的标识符是不同的标识符 u例如:例如: module MUX2_1 (out, a, b, sel); output out; input a, b, sel; wire sel_, a1, b1; not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1); endmodule Verilog标识符标识符 23 u有效标识符举例:有效标识符举例: shift_reg_a busa_index _bus3 u无效标识符举例无效标识符举例: 34net / 开头不是字母或开头不是字母或“_” a*b_net / 包含了非字母或数字,包含了非字母或数字, “$” “_” n238 /包含了非字母或数字,包含了非字母或数字, “$” “_” uVerilog区分大小写,所有区分大小写,所有Verilog关键词如关键词如module、 endmodule等都使用小写字母。等都使用小写字母。 24 3.2.7 系统任务及函数系统任务及函数(了解了解) 使用方式:使用方式:$ u$符号指示这是系统任务和函数符号指示这是系统任务和函数 u系统函数有很多,如:系统函数有很多,如: u返回当前仿真时间返回当前仿真时间$time u显示显示/监视信号值监视信号值($display, $monitor) u停止仿真停止仿真$stop u结束仿真结束仿真$finish 如:如: $monitor($time, “a = %b, b = %h”, a, b); 当信号当信号a或或b的值发生变化时,系统任务的值发生变化时,系统任务$monitor显显 示当前仿真时间,信号示当前仿真时间,信号a值值(二进制格式二进制格式), 信号信号b值(值(16 进制格式)。进制格式)。 25 3.2.8 编译指导编译指导 (了解了解) u( )符号说明一个编译指导符号说明一个编译指导 u这些编译指导使仿真编译器进行一些特殊的操作这些编译指导使仿真编译器进行一些特殊的操作 u编译指导一直保持有效直到被覆盖或解除编译指导一直保持有效直到被覆盖或解除 26 3.2.9 文本包含文本包含include (了解了解) u 编译指导编译指导include在当前内容中插入一个文件在当前内容中插入一个文件 格式:格式: include “” 如如include global.v include parts/count. v include ././library/mux. v” u include可用于:可用于: include保存在文件中的全局的或经常用到的一些定义,如文本宏保存在文件中的全局的或经常用到的一些定义,如文本宏 在模块内部在模块内部include一些任务(一些任务(tasks),提高代码的可维护性。,提高代码的可维护性。 可以是相对路可以是相对路 径或绝对路径径或绝对路径 27 3.2.10 文本替换文本替换define (了解了解) 编译指导编译指导define提供了一种简单的文本替换的功能提供了一种简单的文本替换的功能 define 在编译时在编译时替换替换。可提高描述的可读性。可提高描述的可读性。 define not_delay #1 define and_delay #2 define or_delay #1 module MUX2_1 (out, a, b, sel); output out; input a, b, sel; wire sel_, a1, b1; not not_delay not1( sel_, sel); and and_delay and1( a1, a, sel_); and and_delay and2( b1, b, sel); or or_delay or1( out, a1, b1); endmodule 定义定义not_delay 使用使用not_delay 28 文本替换文本替换 (了解了解) u解除定义的宏,使用解除定义的宏,使用 undef macro_name u使用编译指导使用编译指导define,可以,可以 u提高描述的可读性提高描述的可读性 u定义全局设计参数,如延时和矢量的位数。这些参定义全局设计参数,如延时和矢量的位数。这些参 数可以定义在同一位置。这样,当要修改设计配置数可以定义在同一位置。这样,当要修改设计配置 时,只需要在一个地方修改。时,只需要在一个地方修改。 u定义定义Verilog命令的简写形式命令的简写形式 define vectors_ file /usr1/chrisz/library/vectors define results_ file / usr1/chrisz/library/results u可以将可以将define放在一个文件中,与其它文件一起编译。放在一个文件中,与其它文件一起编译。 29 3.3 Verilog HDL 数据类型数据类型 知识点:知识点: 3.3.1 线网类型线网类型 3.3.2 寄存器类型寄存器类型 3.3.3 参数参数 3.3.4 位选择位选择 3.3.5 总结总结 30 3.3 Verilog HDL 数据类型数据类型 Verilog HDL 有两大类数据类型。有两大类数据类型。 1. 线网类型线网类型(net type): 表示表示Verilog结构化元件间的物理连结构化元件间的物理连 线。它的值由驱动元件的值决定,例如连续赋值或门线。它的值由驱动元件的值决定,例如连续赋值或门 的输出。如果没有驱动元件连接到线网,线网的缺省的输出。如果没有驱动元件连接到线网,线网的缺省 值为值为z。 2. 寄存器类型寄存器类型(register type):表示一个抽象的数据存储单表示一个抽象的数据存储单 元,它只能在元,它只能在always语句和语句和initial语句等过程语句中被语句等过程语句中被 赋值,并且它的值从一个赋值到另一个赋值被保存下赋值,并且它的值从一个赋值到另一个赋值被保存下 来。寄存器类型的变量具有来。寄存器类型的变量具有x的缺省值。的缺省值。 31 3.3.1 net(线网)型(线网)型 net需要被持续的驱动,驱动它的可以是门和模块。需要被持续的驱动,驱动它的可以是门和模块。当当net驱动器的值发驱动器的值发 生变化时,生变化时, 新值被传送到新值被传送到net上。上。 在下例中,线网在下例中,线网out由由or门驱动。当门驱动。当or门的输入信号置位时将传输到线门的输入信号置位时将传输到线 网网net上。上。 32 netnet类的类型(线网)类的类型(线网) u 有多种有多种net类型用于设计类型用于设计(design-specific)建模和工艺建模和工艺(technology-specific) 建模建模 u 没有声明的没有声明的net的缺省类型为的缺省类型为 1 位位(标量标量)wire类型。但这个缺省类型可由类型。但这个缺省类型可由 下面的编译指导改变:下面的编译指导改变: default_nettype net类型类型功功 能能 wire, tri supply1, supply0 wor, trior wand, triand trireg tri1, tri0 标准内部连接线标准内部连接线(缺省缺省) 电源和地电源和地 多驱动源线或多驱动源线或 多驱动源线与多驱动源线与 能保存电荷的能保存电荷的net 无驱动时上拉无驱动时上拉/下拉下拉 综合编译器综合编译器 不支持的不支持的 net类型类型 33 线网数据类型线网数据类型 可综合的线网数据类型包含下述:可综合的线网数据类型包含下述: wire Wor wand tri supply0 supply1 最常用的是最常用的是wire! 34 简单的线网类型说明语法为:简单的线网类型说明语法为: net_kind msb : lsb net1, . . , netN; 解释:解释:1. net_kind 是上述线网类型的一种;是上述线网类型的一种; 2. msb和和lsb 是用于定义线网范围的常量是用于定义线网范围的常量 表达式,如果没有定义,缺省为表达式,如果没有定义,缺省为1位。位。 例例1:wire rst, data; /1位的复位线和数据线。位的复位线和数据线。 例例2: wire 2:0 Addr1 ; /Addr1是是3位地址线位地址线 wire 3:1 Addr2; /Addr2是是3位地址线位地址线 线网数据类型线网数据类型- -使用语法使用语法 35 线网型变量使用举例线网型变量使用举例 module mux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a; /input a, b, sel没声明信号类型,缺省为没声明信号类型,缺省为wire型型 endmodule 例如:两路选择器的例如:两路选择器的RTL级描述级描述 36 3.3.2 寄存器的类型寄存器的类型 u寄存器类有四种数据类型寄存器类有四种数据类型 寄存器类型寄存器类型 功能功能 reg 是最常用的寄存器类型是最常用的寄存器类型 ,无符号型。无符号型。 integer 32位位有符号有符号整数变量,算术操作产生二进制补码形式整数变量,算术操作产生二进制补码形式 。 的结果。通常用作不会由硬件实现的的数据处理。的结果。通常用作不会由硬件实现的的数据处理。 real 双精度的带符号浮点变量,用法与双精度的带符号浮点变量,用法与integer相同。相同。 time 64位无符号整数变量,用于位无符号整数变量,用于仿真时间仿真时间的保存与处理。的保存与处理。 realtime 与与real内容一致,但可以内容一致,但可以用作实数仿真时间用作实数仿真时间的保存的保存 与处理。与处理。 37 寄存器类型寄存器类型reg-reg-使用语法使用语法 reg是寄存器数据类型最常见的数据类型。是寄存器数据类型最常见的数据类型。 使用语法形式如下:使用语法形式如下: reg msb: lsb reg1,. . . ,regN; msb和和lsb 定义了范围,并且均为常数值表达式;如果没有定义了范围,并且均为常数值表达式;如果没有 定义范围,缺省值为定义范围,缺省值为1位寄存器。位寄存器。 例例1: reg 3:0 counter1 ; /4 位寄存器。位寄存器。 例例2: reg counter2 ; / 1位寄存器。位寄存器。 例例3: reg 31:0 data_buffer1 ; reg 32:1 data_buffer2 ; 38 常见的寄存器类型:常见的寄存器类型: Integer integer A, B, C ; /三个整数型寄存器。三个整数型寄存器。 说明:说明: 1. 与与reg不同,不同,integer可以表示可以表示有符号数有符号数,并且算术操作符,并且算术操作符 提供提供2的补码运算结果。的补码运算结果。 2. 同时,如上例定义的同时,如上例定义的A,B,C变量它们分别是变量它们分别是32位(位( 32- bit )的寄存器变量。的寄存器变量。 39 寄存器型变量使用举例寄存器型变量使用举例 module mux2to1 (out, a, b, sel); input a, b, sel; output out; reg out; always ( sel or a or b) if (! sel) out = a; else out = b; /input a, b, sel没声明信号类型,缺省为没声明信号类型,缺省为wire型型 endmodule 例如:两路选择器的例如:两路选择器的RTL级描述级描述 40 如何给模块端口信号选择正确的数据类型?如何给模块端口信号选择正确的数据类型? module top(A,B,Y ); input A,B; output Y; reg A1,B1;/wire? wire Y1; /reg? /对于信号对于信号Y,A,B呢?呢? DUT u1 (Y1, A1, B1) ; DUT u2 (Y, A, B) ; endmodule module DUT (O, in1, in2); output O; input in1, in2; wire in1, in2; reg O; always (in1 or in2) O=in1+in2; endmodule 输入端口(如右图输入端口(如右图 in1、in2信号)只信号)只 能是能是net;但;但输入输入 端口可以由端口可以由 net/register驱动驱动 输出端口输出端口( 如如O )可可 以是以是net/register类类 型,但型,但输出端口只输出端口只 能驱动能驱动net 若若in1、in2说明为说明为 reg则会产生错误。则会产生错误。 in1 in2 O A B Y 或者:或者: wire O; assign O=in1+in2; 41 练习练习- -选择数据类型时常犯的错误选择数据类型时常犯的错误 修改前:修改前: module example(o1, o2, a, b,c,d); input a, b,c,d; output o1, o2; reg c, d; reg o2; and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0; endmodule 修改后:修改后: module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2; / reg c, d; / reg o2 reg o1; and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0; endmodule example.v 或者换成:或者换成: always (c or d) o2=c 或者换成:或者换成: assign o2=c 42 3.3.3 参数参数 参数是一个常量。参数是一个常量。 u参数定义的语法:参数定义的语法: parameter ; 如:如: parameter WIDTH = 8h20; parameter BYTE =4h8; 43 参数(参数(parameters)-parameters)-使用举例使用举例 module mod1( out, in1, in2); . . . . . . parameter WORD_WIDTH = 8; . . . . . . wire WORD_WIDTH-1: 0 in1; / A wire declaration using parameter . . . . . . endmodule u例: 44 参数(参数(parameters)parameters)使用注意事项使用注意事项 u 1. 推荐:推荐:一般定义参数等常量名称用大写,变量名称用小写!一般定义参数等常量名称用大写,变量名称用小写! u 2. 可一次定义多个参数,用逗号隔开。可一次定义多个参数,用逗号隔开。 如:如: parameter WORD_WIDTH = 32, ADDR_WIDTH = 8; 等同于:等同于: parameter WORD_WIDTH = 32; parameter ADDR_WIDTH = 8; 45 (parameters)使用注意事项使用注意事项(cont.) u 3. 3. 参数的定义是局部的参数的定义是局部的,只在,只在当前模块当前模块中有效。中有效。 如:在工程如:在工程Multi-CPU中一个中一个文件文件a.v中定义中定义 parameter WORD_WIDTH = = 32; 在同一工程另一个在同一工程另一个文件文件b.v中定义中定义 parameter WORD_WIDTH = 8; 是可以的。是可以的。 /但是如果这样,项目比较复杂时,容易混淆但是如果这样,项目比较复杂时,容易混淆WORD_WIDTHWORD_WIDTH的值,不的值,不 建议这样使用,可以声明成两个不同名称的参数来处理这种情建议这样使用,可以声明成两个不同名称的参数来处理这种情 况。况。 46 参数(参数(parameters)使用注意事项使用注意事项(cont.) u !注意与!注意与define 的异同的异同 如在文件如在文件sram_control.v中,定义有:中,定义有: define ADDR_WIDTH 12 define DATA_WIDTH 32 module example2( clk,rst,addr_in,data_in,data_out); input DATA_WIDTH-1: 0 data_in; input ADDR_WIDTH -1: 0 addr_in; output DATA_WIDTH-1: 0 data_out; wire DATA_WIDTH-1: 0 data_in; wire ADDR_WIDTH -1: 0 addr_in; reg DATA_WIDTH-1: 0 data_out; parameter MEMORY_DEPTH = 1024; . . . endmodule 47 u 或在文件或在文件cpu_param.v中定义:中定义: define ADDR_WIDTH 12 define DATA_WIDTH 32 然后在文件然后在文件sram_control.v中如下使用:中如下使用: include cpu_param.v module example2( clk,rst,addr_in,data_in,data_out); input DATA_WIDTH-1: 0 data_in; input ADDR_WIDTH -1: 0 addr_in; output DATA_WIDTH-1: 0 data_out; wire DATA_WIDTH-1: 0 data_in; wire ADDR_WIDTH -1: 0 addr_in; reg DATA_WIDTH-1: 0 data_out; parameter MEMORY_DEPTH = 1024; . . . endmodule 48 3.3.4 位选择位选择 位选择从向量中抽取特定的位。位选择从向量中抽取特定的位。 reg 31:0 Breg; wire 31:0 Bwire; . . . Breg=Bwire; 或者或者 . . . Breg31:16= Bwire15:0; Breg15:0= Bwire31:16; 49 整数不能作为位向量访问。整数不能作为位向量访问。 例如定义了:例如定义了:integer B; 对于上面的整数对于上面的整数B的说明,的说明,B6和和B20:10是非法的。是非法的。 解决办法:解决办法: 一种截取位值的方法是将整数赋值给一般的一种截取位值的方法是将整数赋值给一般的reg类型变量,然后从类型变量,然后从 中选取相应的位,如:中选取相应的位,如: integer Bint; reg 31:0 Breg; / /由于由于Bint6和和Bint20:10是不允许的。是不允许的。 Breg = Bint; / 或或 Breg = Bint; /*现在,现在,Breg6和和Breg20:10是允许的,并且所取具体值,是整是允许的,并且所取具体值,是整 数数Bint 相应的位值。相应的位值。*/ 位选择注意事项位选择注意事项 50 3.3.5 Verilog模块中常见信号类型模块中常见信号类型-总结总结 u 两种主要的信号类型:两种主要的信号类型: - 寄存器类型:代表寄存器类型:代表 reg 在在always 等过程块中被赋值的信号,往往代表触发器,但不一定等过程块中被赋值的信号,往往代表触发器,但不一定 是触发器。是触发器。 (时序逻辑电路中常常被综合为(时序逻辑电路中常常被综合为D触发器触发器 ; 纯组合逻辑电路中被综合为连线)纯组合逻辑电路中被综合为连线) - 连线类型:代表连线类型:代表 wire 用用 assign 关键词指定连续关键词指定连续/持续赋值所描述的组合逻辑的信号或持续赋值所描述的组合逻辑的信号或 连线。连线。 51 Verilog中中reg与与wire的不同点的不同点 u用寄存器用寄存器 (reg)类型变量生成组合逻辑举例:类型变量生成组合逻辑举例: module rw1( a, b, out1, out2 ) ; input a, b; output out1, out2; reg out1; wire out2; assign out2 = a ; always (b) out1 = b; endmodule aout2 BUFF b INV out1 52 Verilog中中reg与与wire的不同点的不同点 u用寄存器用寄存器 ( reg )类型变量生成触发器的例子:类型变量生成触发器的例子: module rw2( clk, d, out1, out2 ) ; input clk, d; output out1, out2; reg out1; wire out2; assign out2 =d always (posedge clk) out1 (大于)(大于) =(不小于)(不小于) =(不大于)(不大于) 关系操作符的结果为真(关系操作符的结果为真( 1 b1)或假()或假( 1 b0)或)或1 bx。 61 3.4.5 相等操作符(掌握)相等操作符(掌握) 逻辑等逻辑等 逻辑不等逻辑不等 = ! = module equalities_test; reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; #10 val = (rega = regb); / val = 0 #20 val = (rega != regc); / val = 1 #30 val =(regb != regc); / val = x #50 $finish; end endmodule 其结果是其结果是1b1、1b0或或1bx。 如果左边及右边为确定值,并如果左边及右边为确定值,并 且相等,则结果为且相等,则结果为1。 如果左边及右边为确定值,并如果左边及右边为确定值,并 且不相等,则结果为且不相等,则结果为0。 如果左边及右边有值不能确定如果左边及右边有值不能确定 的位,但值确定的位相等,则的位,但值确定的位相等,则 结果为结果为x。 !=的结果与的结果与= =相反相反 值确定是指所有的位为值确定是指所有的位为0或或1。 不确定值是有值为不确定值是有值为x或或z的位。的位。 = ! = 62 相等操作符(了解)相等操作符(了解) 相同相同(case等等) 不相同不相同(case不等不等) = != module equalities2_test; reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; #10 val = (rega = regb) ; / val = 0 #20 val =( rega != regc); / val = 1 #30 val =(regb = regc); / val = 0 #50 $finish; end endmodule 其结果是其结果是1b1、1b0或或1bx。 如果左边及右边的值相同如果左边及右边的值相同 (包括(包括x、z),则结果为,则结果为1。 如果左边及右边的值不相同,如果左边及右边的值不相同, 则结果为则结果为0。 !=的结果与的结果与 = 相反相反 综合工具不支综合工具不支 持!持!,也就是说没有也就是说没有 相应的电路来对应这种操作相应的电路来对应这种操作 符。符。 = != 63 3.4.6 条件操作符条件操作符 条件操作符的语法为:条件操作符的语法为: = ? :; 其意思是:其意思是:if condition is TRUE, then LHS=true_expression, else LHS = false_expression 每个条件操作符必须有三个参数,缺少任何一个都会产生错每个条件操作符必须有三个参数,缺少任何一个都会产生错 误。最后一个操作数作为缺省值。误。最后一个操作数作为缺省值。 例如:例如:assign out = (sel = 0) ? a : b; 若若sel为为0则则out =a;若;若sel为为1则则out = b;如果;如果sel为为x或或z,则,则 结果可能为结果可能为x或或z。 64 条件操作符条件操作符- -使用实例使用实例 module likebufif( in, en, out); input in; input en; output out; assign out = (en = 1) ? in : bz; endmodule module like4to1( a, b, c, d, sel, out); input a, b, c, d; input 1: 0 sel; output out; assign out = sel = 2b00 ? a : sel = 2b01 ? b : sel = 2b10 ? c : d; endmodule 如果条件值为如果条件值为x或或z,则结果可能为,则结果可能为x 或或z 65 3.4.7 移位操作符移位操作符 移位操作符有移位操作符有: (右移右移) 如如 rega 3 意思是意思是rega向右移向右移3位;位; u 移位操作符对其移位操作符对其左边的操作数左边的操作数进行向左或向右的位移位进行向左或向右的位移位 操作。操作。 u第二个操作数(移位位数)是无符号数。第二个操作数(移位位数)是无符号数。 66 module shift_test; reg 9: 0 num, num1; reg 7: 0 rega, regb; /如果如果rega = 8b0000 1100; num = rega 5 ; / num=10b01 1000 0000 regb = rega 5 ; / regb=8b1000 0000 num1 3; / num1=10b00 0000 0001 endmodule 左移先补后移左移先补后移 右移先移后补右移先移后补 建议:移位操作最好表达式左右两边位数一致,如上面的建议:移位操作最好表达式左右两边位数一致,如上面的 reg 7: 0 rega, regb; 67 3.4.8 连接操作连接操作 连接操作是将小表达式合并形成大表达式的操作。形式连接操作是将小表达式合并形成大表达式的操作。形式 如下如下: expr1, expr2, . . .,exprN 68 连接操作实例连接操作实例 wire 9:0 d; wire 9:0 a; assign d9:5 = a0, a1, a2, a3, a4 ; /以反转的顺序将以反转的顺序将a的低端的低端4位赋给位赋给d的高端的高端4位。位。 assign d= d4:0, d9:5 ; /高高4位与低位与低4位交换。位交换。 69 由于非定长常数的长度未知由于非定长常数的长度未知, 不允许连接非定长常数。例如不允许连接非定长常数。例如, 下列式子非法:下列式子非法: reg 16:0 a; reg 31:0 d; d= a,5; /error!不允许连接操作不允许连接操作非定长常数非定长常数。 d= a,16h0005; / error!右边右边33位,左边位,左边32位,位宽不匹配,一样会出错位,位宽不匹配,一样会出错 改为:改为: d= a, 15h5; 连接操作注意事项连接操作注意事项 70 3.4.9 复制操作复制操作 复制通过指定重复次数来执行操作。复制通过指定重复次数来执行操作。 语法形式如下语法形式如下: repetition_numberexpr1,expr2, .,exprn 71 例一:例一: wire 7:0 d; wire 11:0 a; assign d=24b1011; /d等于等于8b1011 1011 assign a= 4d7, d; /a为为12b1111 1011 1011 /注意:注意: assign a= 4d7, d; /error,why? 例二:例二:/*符号扩展符号扩展*/ 31b1 结果为结果为3b111 3Ack 结果与结果与Ack, Ack, Ack相同相同 复制操作实例复制操作实例
展开阅读全文