China°do 第3章 Verilog语言要素 本章介绍 Verilog HDL的基本要素,包括标识符、注释、数值、编译程序指令、系统任务 和系统函数。另外,本章还介绍了 Verilog硬件描述语言中的两种数据类型 3.1标识符 Ⅴ erilog hdl中的标识符( (identifier)可以是任意一组字母、数字、$符号和_(下划线)符号的 组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下 是标识符的几个例子 Count //与 Count不同。 RI D2 FIVES 转义标识符( escaped identifier)可以在一条标识符中包含任何可打印字符。转义标识符以 (反斜线)符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。下面例举 了几个转义标识符: 7400 OutGate与 OutGate相同。 最后这个例子解释了在一条转义标识符中,反斜线和结束空格并不是转义标识符的一部 分。也就是说,标识符 OutGate和标识符 OutGate恒等。 Ⅴ erilog hdl定义了一系列保留字,叫做关键词,它仅用于某些上下文中。附录A列出了 语言中的所有保留字。注意只有小写的关键词才是保留字。例如,标识符 always(这是个关键 词)与标识符 ALWAYS(非关键词)是不同的 另外,转义标识符与关键词并不完全相同。标识符 \initial与标识符 initial(这是个关键词) 不同。注意这一约定与那些转义标识符不同 32注释 在 Verilog hdli中有两种形式的注释 /*第一种形式:可以扩展至 多行* //第二种形式:在本行结束。 3.3格式 Ⅴ erilog hdl区分大小写。也就是说大小写不同的标识符是不同的。此外, Verilog Hdl是
下载 第3章 Verilog语言要素 本章介绍Verilog HDL的基本要素,包括标识符、注释、数值、编译程序指令、系统任务 和系统函数。另外,本章还介绍了 Ve r i l o g硬件描述语言中的两种数据类型。 3.1 标识符 Verilog HDL中的标识符( i d e n t i f i e r )可以是任意一组字母、数字、 $符号和_(下划线)符号的 组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下 是标识符的几个例子: C o u n t COUNT / /与C o u n t不同。 _ R 1 _ D 2 R 5 6 _ 6 8 F I V E $ 转义标识符(escaped identifier )可以在一条标识符中包含任何可打印字符。转义标识符以 \ (反斜线)符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。下面例举 了几个转义标识符: \ 7 4 0 0 \ . * .$ \ { * * * * * * } \ ~Q \O u t G a t e 与O u t G a t e相同。 最后这个例子解释了在一条转义标识符中,反斜线和结束空格并不是转义标识符的一部 分。也就是说,标识符\ O u t G a t e 和标识符O u t G a t e恒等。 Verilog HDL定义了一系列保留字,叫做关键词,它仅用于某些上下文中。 附录A列出了 语言中的所有保留字。注意只有小写的关键词才是保留字。例如,标识符 a l w a y s (这是个关键 词)与标识符A LWAY S(非关键词)是不同的。 另外,转义标识符与关键词并不完全相同。标识符 \initial 与标识符i n i t i a l(这是个关键词) 不同。注意这一约定与那些转义标识符不同。 3.2 注释 在Verilog HDL中有两种形式的注释。 / *第一种形式:可以扩展至 多行 * / / /第二种形式:在本行结束。 3.3 格式 Verilog HDL区分大小写。也就是说大小写不同的标识符是不同的。此外, Verilog HDL是
第章 Verilog语言要素 15 自由格式的,即结构可以跨越多行编写,也可以在一行内编写。白空(新行、制表符和空格) 没有特殊意义。下面通过实例解释说明 initial begin Top =3b00l; #2 Top =3 boil; end 和下面的指令一样 Top=3’b001; 3b011 34系统任务和函数 以$字符开始的标识符表示系统任务或系统函数。任务提供了一种封装行为的机制。这种 机制可在设计的不同部分被调用。任务可以返回0个或多个值。函数除只能返回一个值以外与 任务相同。此外,函数在0时刻执行,即不允许延迟,而任务可以带有延迟。 Display ("Hi, you have reached LT today") /*$ display系统任务在新的一行中显示。*/ /该系统任务返回当前的模拟时间 系统任务和系统函数在第10章中详细讲觚 3.5编译指令 以ˆ(反引号)开始的某些标识符是编译器指令。在Ⅴ erilog语言编译时,特定的编译器指 令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令 完整的标准编译器指令如下 define, undef ifdefrelse, endif default neotype · include resetall drive connected drive celldefine, endcelldefine 3.5.1 define和 undef define指令用于文本替换,它很像C语言中的# define指令,如: define MAX BUs size reg MAX BUS SIZE -1:0 ] AddReg 旦 de fine指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的 define指令, MAX BUS_S/ZE能被多个文件使用 undef指令取消前面定义的宏。例如 define WORD16//建立一个文本宏替代 wire[ WORD 1] Bus
第3章 Verilog 语言要素 15 下载 自由格式的,即结构可以跨越多行编写,也可以在一行内编写。白空(新行、制表符和空格) 没有特殊意义。下面通过实例解释说明。 initial begin T o p = 3' b001; #2 T o p = 3' b011; e n d 和下面的指令一样: i n i t i a l begin T o p = 3' b001; #2 T o p = 3' b 0 1 1 ; e n d 3.4 系统任务和函数 以$字符开始的标识符表示系统任务或系统函数。任务提供了一种封装行为的机制。这种 机制可在设计的不同部分被调用。任务可以返回 0个或多个值。函数除只能返回一个值以外与 任务相同。此外,函数在0时刻执行,即不允许延迟,而任务可以带有延迟。 $d i s p l a y ("Hi, you have reached LT today"); /* $d i s p l a y 系统任务在新的一行中显示。* / $t i m e / /该系统任务返回当前的模拟时间。 系统任务和系统函数在第1 0章中详细讲解。 3.5 编译指令 以`(反引号)开始的某些标识符是编译器指令。在 Verilog 语言编译时,特定的编译器指 令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令。 完整的标准编译器指令如下 : • `define, `undef • `ifdef, `else, `endif • `default_nettype • `include • `resetall • `timescale • `unconnected_drive, `nounconnected_drive • `celldefine, `endcelldefine 3.5.1 `define 和`undef ` d e f i n e指令用于文本替换,它很像 C语言中的#define 指令,如: ` d e f i n e M A X _ B U S _ S I Z E 3 2 . . . r e g [ `M A X _ B U S _ S I Z E - 1:0 ] A d d R e g; 一旦 ` d e f i n e 指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的 ` d e f i n e指令,M A X_B U S_S I Z E 能被多个文件使用。 `undef 指令取消前面定义的宏。例如 : ` d e f i n e W O R D 16 //建立一个文本宏替代。 . . . w i r e [ `W O R D : 1] Bus;
16 Verilog hdl硬弹描述语言 China°Co 下载 undef wORD 在 undef编译指令后,NoRD的宏定义不再有效 3.5.2 ifdef、'ese和' endif 这些编译指令用于条件编译,如下所示: ⊥ fdef WINDows parameter WORD SIZE= 16 else parameter WORD SIZE 32 endif 在编译过程中,如果已定义了名字为 WINDOWS的文本宏,就选择第一种参数声明,否则 选择第二种参数说明 else程序指令对于' ifdef指令是可选的。 3.5.3 default nettype 该指令用于为隐式线网指定线网类型。也就是将那些没有被说明的连线定义线网类型。 default nettype wand 该实例定义的缺省的线网为线与类型。因此,如果在此指令后面的任何模块中没有说明的连 线,那么该线网被假定为线与类型 3.5.4 include inelude编译器指令用于嵌入内嵌文件的内容。文件既可以用相对路径名定义,也可以用 全路径名定义,例如 ⊥ nclude /primitives.v 编译时,这一行由文件“/. primitives.v”的内容替代 3.5.5 resetall 该编译器指令将所有的编译指令重新设置为缺省值 resetall 例如,该指令使得缺省连线类型为线网类型 3.5.6 timescale 在 Verilog hdl模型中,所有时延都用单位时间表述。使用' timescale编译器指令将时间 单位与实际时间相关联。该指令用于定义时延的单位和时延精度。' timescale编译器指令格式 为 timescale time unit /time precisie fime unit和 Itime precision由值1、10、和100以及单位s、ms、us、ns、ps和fs组成。例如 timescale lns/100ps 表示时延单位为1ns,时延精度为100ps。' timescale编译器指令在模块说明外部出现,并且影响 后面所有的时延值。例如
. . . ` u n d e f W O R D // 在` u n d e f编译指令后, W O R D的宏定义不再有效. 3.5.2 `ifdef、`else 和`endif 这些编译指令用于条件编译,如下所示: ` i f d e f W I N D O W S p a r a m e t e r WORD_SIZE = 16 ` e l s e p a r a m e t e r W O R D _ S I Z E = 32 ` e n d i f 在编译过程中,如果已定义了名字为 W I N D O W S的文本宏,就选择第一种参数声明,否则 选择第二种参数说明。 ` e l s e 程序指令对于`ifdef 指令是可选的。 3.5.3 `default_nettype 该指令用于为隐式线网指定线网类型。也就是将那些没有被说明的连线定义线网类型。 `default_nettype wand 该实例定义的缺省的线网为线与类型。因此,如果在此指令后面的任何模块中没有说明的连 线,那么该线网被假定为线与类型。 3.5.4 `include ` i n c l u d e 编译器指令用于嵌入内嵌文件的内容。文件既可以用相对路径名定义,也可以用 全路径名定义, 例如: ` i n c l u d e " . . / . . /primitives.v" 编译时,这一行由文件“. . / . . / p r i m i t i v e s . v” 的内容替代。 3.5.5 `resetall 该编译器指令将所有的编译指令重新设置为缺省值。 ` r e s e t a l l 例如,该指令使得缺省连线类型为线网类型。 3.5.6 `timescale 在Verilog HDL 模型中,所有时延都用单位时间表述。使用 ` t i m e s c a l e编译器指令将时间 单位与实际时间相关联。该指令用于定义时延的单位和时延精度。 ` t i m e s c a l e编译器指令格式 为: ` t i m e s c a l e t i m e _ u n i t / t i m e _ p r e c i s i o n t i m e _ u n i t 和t i m e _ p re c i s i o n 由值1、1 0、和1 0 0以及单位s、m s、u s、n s、p s和f s组成。例如: ` t i m e s c a l e 1 n s / 1 0 0 p s 表示时延单位为1ns, 时延精度为1 0 0 p s。`timescale 编译器指令在模块说明外部出现 , 并且影响 后面所有的时延值。例如: 16 Verilog HDL 硬件描述语言 下载
中M 第章 Verilog语言要素 17 timescale lns/ 100ps module AndFunc (2, A, B)i and#(5.22,6.17)A1(z,A,B); //规定了上升及下降时延值。 endmodule 编译器指令定义时延以ns为单位,并且时延精度为1/10ns(100ps)。因此,时延值52对应 52ns,时延6.17对应62ns。如果用如下的' timescale程序指令代替上例中的编译器指令 timescale 10ns/lns 那么522对应52ns,6.17对应62ns 在编译过程中,' timescale指令影响这一编译器指令后面所有模块中的时延值,直至遇到 另一个' timescale指令或' reseta指令。当一个设计中的多个模块带有自身的' timescale编译指 令时将发生什么?在这种情况下,模拟器总是定位在所有模块的最小时延精度上,并且所有 时延都相应地换算为最小时延精度。例如, timescale lns/ 100ps module AndFunc (Z, A, B)i output z input A, B and#(5.22,6.17)A1(2,A,B) endmodule timescale 10ns/ lns module T reg PutA, PutE wire Geto: begin PutB =0 #5.21 PutB #10.4PutA=1 #15 PutB=0 AndFunc AFI(Geto, PutA, PutB endmodule 这个例子中,每个模块都有自身的' timescale编译器指令。' timescale编译器指令第一次 应用于时延。因此,在第一个模块中,5.22对应5.2ns,6.17对应62ns;在第二个模块中521对 应52ns,10.4对应104ns,15对应150ns。如果仿真模块TB,设计中的所有模块最小时间精度为 I00ps。因此,所有延迟(特别是模块TB中的延迟)将换算成精度为100ps。延迟52ns现在 对应520*100ps,104对应1040*100ps,150对应1500*100ps。更重要的是,仿真使用100ps 为时间精度。如果仿真模块 AndFunc,由于模块TB不是模块 AddFunc的子模块,模块TB中的 timescale程序指令将不再有效
` t i m e s c a l e 1ns/ 100ps m o d u l e A n d F u n c (Z, A, B) ; o u t p u t Z; i n p u t A, B; a n d # (5.22, 6.17 ) A l (Z, A, B); / /规定了上升及下降时延值。 e n d m o d u l e 编译器指令定义时延以 n s为单位,并且时延精度为 1/10 ns(100 ps)。因此,时延值5 . 2 2对应 5.2 ns, 时延6 . 1 7对应6.2 ns。如果用如下的` t i m e s c a l e程序指令代替上例中的编译器指令 , ` t i m e s c a l e 1 0 n s / 1 n s 那么5 . 2 2对应52ns, 6.17对应6 2 n s。 在编译过程中,` t i m e s c a l e指令影响这一编译器指令后面所有模块中的时延值,直至遇到 另一个` t i m e s c a l e指令或` r e s e t a l l指令。当一个设计中的多个模块带有自身的 ` t i m e s c a l e编译指 令时将发生什么?在这种情况下,模拟器总是定位在所有模块的最小时延精度上,并且所有 时延都相应地换算为最小时延精度。例如, ` t i m e s c a l e 1ns/ 100ps m o d u l e A n d F u n c (Z, A, B) ; o u t p u t Z; i n p u t A, B; a n d # (5.22, 6.17 ) A l (Z, A, B) ; e n d m o d u l e ` t i m e s c a l e 10ns/ 1ns m o d u l e T B; r e g PutA, PutB; w i r e G e t O; i n i t i a l b e g i n P u tA = 0; P u t B = 0; #5.21 P u t B = 1; #10.4 P u t A = 1; #15 P u t B = 0; e n d A n d F u n c A F 1(GetO, PutA, PutB) ; e n d m o d u l e 在这个例子中,每个模块都有自身的 ` t i m e s c a l e编译器指令。` t i m e s c a l e编译器指令第一次 应用于时延。因此,在第一个模块中, 5 . 2 2对应5.2 ns, 6.17对应6.2 ns; 在第二个模块中5 . 2 1对 应52 ns, 10.4对应104 ns, 15对应150 ns。如果仿真模块T B,设计中的所有模块最小时间精度为 100 ps。因此,所有延迟(特别是模块 T B中的延迟)将换算成精度为 100 ps。延迟52 ns现在 对应5 2 0*100 ps,1 0 4对应1 0 4 0*100 ps,1 5 0对应1 5 0 0*100 ps。更重要的是,仿真使用 100 ps 为时间精度。如果仿真模块 A n d F u n c,由于模块T B不是模块A d d F u n c的子模块,模块 T B中的 ` t i m e s c a l e程序指令将不再有效。 第3章 Verilog 语言要素 17 下载
18 Verilog hdl硬弹描述语言 China°bCo 下载 3.5.7 unconnected drive nonconnected drive 在模块实例化中,出现在这两个编译器指令间的任何未连接的输入端口或者为正偏电路 状态或者为反偏电路状态。 unconnected drive pulll /*在这两个程序指令间的所有未连接的输入端口为正偏电路状态(连接到高电平)+/ nonconnected drive unconnected drive pullo /*在这两个程序指令间的所有未连接的输入端口为反偏电路状态(连接到低电平)+ nonconnected drive 3.58‘ celldefine和' endcelldefine 这两个程序指令用于将模块标记为单元模块。它们表示包含模块定义,如下例所示。 celldefine module FDi CK, 4 endcelldefine 某些PLI例程使用单元模块 3.6值集合 Ⅴ erilog hdl有下列四种基本的值: 1)0:逻辑0或“假 2)1:逻辑1或“真” 3)x:未知 )z:高阻 注意这四种值的解释都内置于语言中。如一个为z的值总是意味着高阻抗,一个为0的值 通常是指逻辑0。 在门的输入或一个表达式中的为“z”的值通常解释成“x”。此外,x值和z值都是不分大 小写的,也就是说,值0x1z与值0X1Z相同。 Verilog hdl中的常量是由以上这四类基本值组成 的。 Ⅴ erilog hdl中有三类常量 1)整型 2)实数型 3)字符串型 下划线符号()可以随意用在整数或实数中,它们就数量本身没有意义。它们能用来提 高易读性:唯一的限制是下划线符号不能用作为首字符。 36.1整型数 整型数可以按如下两种方式书写
18 Verilog HDL 硬件描述语言 下载 3.5.7 `unconnected_drive和`nounconnected_drive 在模块实例化中,出现在这两个编译器指令间的任何未连接的输入端口或者为正偏电路 状态或者为反偏电路状态。 ` u n c o n n e c t e d _ d r i v e p u l l 1 . . . / *在这两个程序指令间的所有未连接的输入端口为正偏电路状态(连接到高电平) * / ` n o u n c o n n e c t e d _ d r i v e `unconnected_drive pull0 . . . / *在这两个程序指令间的所有未连接的输入端口为反偏电路状态(连接到低电平) * / ` n o u n c o n n e c t e d _ d r i v e 3.5.8 `celldefine 和 `endcelldefine 这两个程序指令用于将模块标记为单元模块。它们表示包含模块定义,如下例所示。 ` c e l l d e f i n e m o d u l e F D 1 S 3 A X (D, CK, Z) ; . . . e n d m o d u l e ` e n d c e l l d e f i n e 某些P L I例程使用单元模块。 3.6 值集合 Verilog HDL有下列四种基本的值: 1) 0:逻辑0或“假” 2) 1:逻辑1或“真” 3) x:未知 4) z:高阻 注意这四种值的解释都内置于语言中。如一个为 z的值总是意味着高阻抗,一个为 0的值 通常是指逻辑0。 在门的输入或一个表达式中的为“ z”的值通常解释成“ x”。此外,x值和z值都是不分大 小写的,也就是说,值0 x 1 z与值0 X 1 Z相同。Verilog HDL中的常量是由以上这四类基本值组成 的。 Verilog HDL中有三类常量: 1) 整型 2) 实数型 3) 字符串型 下划线符号(_)可以随意用在整数或实数中,它们就数量本身没有意义。它们能用来提 高易读性;唯一的限制是下划线符号不能用作为首字符。 3.6.1 整型数 整型数可以按如下两种方式书写:
i0a°bub.com 第章imi素19 1)简单的十进制数格式 2)基数格式 1.简单的十进制格式 这种形式的整数定义为带有一个可选的“+”(一元)或“一”(一元)操作符的数字序 列。下面是这种简易十进制形式整数的例子 十进制数32 十进制数-15 这种形式的整数值代表一个有符号的数。负数可使用两种补码形式表示。因此32在5位的 进制形式中为10000,在6位二进制形式中为110001:-15在5位二进制形式中为10001,在6 位二进制形式中为110001 2.基数表示法 种形式的整数格式为: base value sie定义以位计的常量的位长;base为o或O(表示八进制),b或B(表示二进制),d或D(表 示十进制),h或H(表示十六进制)之一: value是基于base的值的数字序列。值x和z以及十 六进制中的a到不区分大小写 下面是一些具体实例: 5"o37 垃八进制数 4"D2 十进制数 4"B1X01 拉二进制数 7!H 粒x(扩展的x),即 xxxxxxx 位z(扩展的z),即zzzz 非法:数值不能为负 8h A 在位长和字符之间,以及基数和数值之间允许出现空格 非法:·和基数b之间不允许出现空格 2+3)b10非法:位长不能够为表达式 注意,x(或z)在十六进制值中代表4位x(或z),在八进制中代表3位x(或z),在二进 制中代表位x(或z)。 基数格式计数形式的数通常为无符号数。这种形式的整型数的长度定义是可选的。如果 没有定义一个整数型的长度,数的长度为相应值中定义的位数。下面是两个例子 八进制数 粒十六进制数 如果定义的长度比为常量指定的长度长,通常在左边填0补位。但是如果数最左边一位为 x或z,就相应地用x或z在左边补位。例如 10"b1 左边添0占位,0000000010 10"bx0x1 左边添x占位, XXXXXXX0x1 如果长度定义得更小,那么最左边的位相应地被截断。例如 3"b10010011与3"b011相等 5"H0FFF与5"H1F相等 ?字符在数中可以代替值z在值z被解释为不分大小写的情况下提高可读性(参见第8章)。 362实数 实数可以用下列两种形式定义
第3章 Verilog 语言要素 19 下载 1) 简单的十进制数格式 2) 基数格式 1. 简单的十进制格式 这种形式的整数定义为带有一个可选的 “+”(一元)或 “-”(一元)操作符的数字序 列。下面是这种简易十进制形式整数的例子。 32 十进制数3 2 -15 十进制数-1 5 这种形式的整数值代表一个有符号的数。负数可使用两种补码形式表示。因此 3 2在5位的 二进制形式中为1 0 0 0 0,在6位二进制形式中为11 0 0 0 1;-1 5在5位二进制形式中为1 0 0 0 1,在6 位二进制形式中为11 0 0 0 1。 2. 基数表示法 这种形式的整数格式为: [s i z e ] 'base value s i z e 定义以位计的常量的位长; b a s e为o或O(表示八进制),b或B(表示二进制),d或D(表 示十进制),h或H(表示十六进制)之一; v a l u e是基于b a s e的值的数字序列。值 x和z以及十 六进制中的a到f不区分大小写。 下面是一些具体实例: 5'O37 5位八进制数 4'D2 4位十进制数 4'B1x_01 4位二进制数 7'Hx 7位x(扩展的x), 即x x x x x x x 4'hZ 4位z(扩展的z) , 即z z z z 4'd-4 非法:数值不能为负 8'h 2 A 在位长和字符之间,以及基数和数值之间允许出现空格 3'b001 非法: ` 和基数b之间不允许出现空格 (2+3)'b10 非法:位长不能够为表达式 注意,x(或z)在十六进制值中代表 4位x(或z),在八进制中代表3位x(或z),在二进 制中代表1位x(或z)。 基数格式计数形式的数通常为无符号数。这种形式的整型数的长度定义是可选的。如果 没有定义一个整数型的长度,数的长度为相应值中定义的位数。下面是两个例子: 'o721 9位八进制数 'hAF 8位十六进制数 如果定义的长度比为常量指定的长度长,通常在左边填 0补位。但是如果数最左边一位为 x或z,就相应地用x或z在左边补位。例如: 10'b10 左边添0占位, 0000000010 10'bx0x1 左边添x占位, x x x x x x x 0 x 1 如果长度定义得更小,那么最左边的位相应地被截断。例如: 3 ' b 1 0 0 1 _ 0 0 1 1与3'b011 相等 5'H0FFF 与5'H1F 相等 ?字符在数中可以代替值z在值z被解释为不分大小写的情况下提高可读性(参见第8章)。 3.6.2 实数 实数可以用下列两种形式定义:
20 Verilog hdl硬停描述语言 China°bCo 下载 1)十进制计数法:例如 5.678 11572.12 法:小数点两侧必须有1位数字 2)科学计数法:这种形式的实数举例如下 235.1e2 其值为23510.0;忽略下划线 3 6E2 60.0eE相同 Verilog语言定义了实数如何隐式地转换为整数。实数通过四舍五入被转换为最相近的整 42.446,42.45转换为整数 92.5,92.699转换为整数93 转换为整数-16 -26.22 转换为整数-26 36.3字符串 字符串是双引号内的字符序列。字符串不能分成多行书写。例如 INTERNAL ERROR REACHED一>HERE 用8位ASCI值表示的字符可看作是无符号整数。因此字符串是8位ASCI值的序列。为存 储字符串“ INTERNAL ERROR”,变量需要8*14位 1:8+14]Mes Message =INTERNAL ERROR 反斜线()用于对确定的特殊字符转义 换行符 制表符 字符\本身 206八进制数206对应的字符 3.7数据类型 Ⅴ erilog hdl有两大类数据类型。 1)线网类型。 net type表示 verilog结构化元件间的物理连线。它的值由驱动元件的值决定, 例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z。 2)寄存器类型。 register type表示一个抽象的数据存储单元,它只能在 always语句和 initial 语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x 的缺省值。 37.1线网类型 线网数据类型包含下述不同种类的线网子类型
1) 十进制计数法;例如 2 . 0 5 . 6 7 8 1 1 5 7 2 . 1 2 0 . 1 2. //非法:小数点两侧必须有1位数字 2) 科学计数法; 这种形式的实数举例如下: 23_5.1e2 其值为23510.0; 忽略下划线 3.6E2 360.0 (e与E相同) 5 E-4 0 . 0 0 0 5 Ve r i l o g语言定义了实数如何隐式地转换为整数。实数通过四舍五入被转换为最相近的整 数。 4 2 . 4 4 6, 42.45 转换为整数4 2 92.5, 92.699 转换为整数9 3 -15.62 转换为整数-1 6 -26.22 转换为整数-2 6 3.6.3 字符串 字符串是双引号内的字符序列。字符串不能分成多行书写。例如 : "INTERNAL ERROR" " R E A C H E D-> H E R E " 用8位A S C I I值表示的字符可看作是无符号整数。因此字符串是 8位A S C I I值的序列。为存 储字符串“INTERNAL ERROR”,变量需要8 * 1 4位。 r e g [1 : 8*14] M e s s a g e; . . . M e s s a g e = "INTERNAL ERROR" 反斜线 (\ ) 用于对确定的特殊字符转义。 \n 换行符 \t 制表符 \\ 字符\本身 \" 字符" \206 八进制数2 0 6对应的字符 3.7 数据类型 Verilog HDL 有两大类数据类型。 1) 线网类型。net type 表示Ve r i l o g结构化元件间的物理连线。它的值由驱动元件的值决定, 例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为 z。 2) 寄存器类型。register type表示一个抽象的数据存储单元,它只能在 a l w a y s语句和i n i t i a l 语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有 x 的缺省值。 3.7.1 线网类型 线网数据类型包含下述不同种类的线网子类型。 20 Verilog HDL 硬件描述语言 下载
China-pubcoM 第章im)21 wand tril supply 简单的线网类型说明语法为 net kind [msb: lsb] netI, net4 net kind是上述线网类型的一种。msb和lsb是用于定义线网范围的常量表达式;范围定义是 选的;如果没有定义范围,缺省的线网类型为1位。下面是线网类型说明实例 w⊥ re Rdy, start//2个1位的连线 wand[2:0]Addr;//Addr是3位线与 当一个线网有多个驱动器时,即对一个线网有多个赋值时,不同的线网产生不同的行为 例如, wor Rde: assign Rde= bit wyl assign Rde KbI I Kip 本例中,Rde有两个驱动源,分别来自于两个连续赋值语句。由于它是线或线网,Rde的有 效值由使用驱动源的值(右边表达式的值)的线或(wor)表(参见后面线或网的有关章节)决定。 wie和tri线网 用于连接单元的连线是最常见的线网类型。连线与三态线(tri)网语法和语义一致:三态线 可以用于描述多个驱动源驱动同一根线的线网类型:并且没有其他特殊的意义 wire [3: 2] Cla, Pla, sIa tr⊥[MSB-1:LSB+1]Art 如果多个驱动源驱动一个连线(或三态线网),线网的有效值由下表决定。 wire(或tri) 下面是一个具体实例 assign Cla Pla Sla; assign Cla Pla s 在这个实例中,Cla有两个驱动源。两个驱动源的值(右侧表达式的值)用于在上表中索引
第3章 Verilog 语言要素 21 下载 • wire • tri • wor • trior • wand • triand • trireg • tri1 • tri0 • supply0 • supply1 简单的线网类型说明语法为: n e t _ k i n d [m s b:l s b] net1, net2, . . . , n e t N; n e t _ k i n d 是上述线网类型的一种。 m s b和l s b 是用于定义线网范围的常量表达式;范围定义是 可选的;如果没有定义范围,缺省的线网类型为 1位。下面是线网类型说明实例。 w i r e Rdy, Start; //2个1位的连线。 w a n d [2:0] A d d r; //A d d r是3位线与。 当一个线网有多个驱动器时,即对一个线网有多个赋值时,不同的线网产生不同的行为。 例如, w o r R d e; . . . a s s i g n R d e = B l t & W y l; . . . a s s i g n Rde = K b l | K i p; 本例中,R d e有两个驱动源,分别来自于两个连续赋值语句。由于它是线或线网, R d e的有 效值由使用驱动源的值(右边表达式的值)的线或(wor)表(参见后面线或网的有关章节)决定。 1. wire和t r i线网 用于连接单元的连线是最常见的线网类型。连线与三态线 ( t r i )网语法和语义一致;三态线 可以用于描述多个驱动源驱动同一根线的线网类型;并且没有其他特殊的意义。 w i r e R e s e t; w i r e [3:2] Cla, Pla, Sla; t r i [ M S B-1 : L S B +1] A r t; 如果多个驱动源驱动一个连线(或三态线网),线网的有效值由下表决定。 wire ( 或 t r i ) 0 1 x z 0 0 x x 0 1 x 1 x 1 x x x x x z 0 1 x z 下面是一个具体实例: a s s i g n C l a = P l a & S l a; . . . a s s i g n Cla = P l a ^ S l a; 在这个实例中, C l a有两个驱动源。两个驱动源的值(右侧表达式的值)用于在上表中索引
22 Verilog hdl be停描述语言 China°dCo 下 以便决定Cla的有效值。由于Cla是一个向量,每位的计算是相关的。例如,如果第一个右侧 表达式的值为01x,并且第二个右测表达式的值为11z,那么Cla的有效值是xx(第一位0和1在 表中索引到x,第二位1和1在表中索引到1,第三位x和z在表中索引到x) 2.wor和 trior线网 线或指如果某个驱动源为1,那么线网的值也为1。线或和三态线或(tior)在语法和功能上 是一致的。 w。r[MsB:LSB]Art; trior [MAX-1: MIN-1] Rdx, Sax, Bdx 如果多个驱动源驱动这类网,网的有效值由下表决定。 wor(或tior) 3.wand和 triand线网 线与(wand)网指如果某个驱动源为0,那么线网的值为0。线与和三态线与( triand)网在语 法和功能上是一致的 如果这类线网存在多个驱动源,线网的有效值由下表决定 0 此线网存储数值(类似于寄存器),并且用于电容节点的建模。当三态寄存器( trireg)的所 有驱动源都处于高阻态,也就是说,值为z时,三态寄存器线网保存作用在线网上的最后一个 值。此外,三态寄存器线网的缺省初始值为x 5.tri0和ti线网 这类线网可用于线逻辑的建模,即线网有多于一个驱动源。trio(tri1)线网的特征是 若无驱动源驱动,它的值为0(tri1的值为1) tril [0:-5] otBus, ItBus 下表显示在多个驱动源情况下tri0或tri网的有效值。 1 0 0(1)
22 Verilog HDL 硬件描述语言 下载 以便决定C l a的有效值。由于 C l a是一个向量,每位的计算是相关的。例如,如果第一个右侧 表达式的值为0 1 x, 并且第二个右测表达式的值为 11 z,那么C l a 的有效值是x 1 x (第一位0和1在 表中索引到x, 第二位1和1在表中索引到1,第三位x 和z在表中索引到x)。 2. wor和t r i o r线网 线或指如果某个驱动源为 1,那么线网的值也为 1。线或和三态线或( t r i o r )在语法和功能上 是一致的。 w o r [M S B:L S B] A r t; t r i o r [M A X-1: M I N-1] Rdx, Sdx, Bdx; 如果多个驱动源驱动这类网,网的有效值由下表决定。 wor (或 t r i o r ) 0 1 x z 0 0 1 x 0 1 1 1 1 1 x x 1 x x z 0 1 x z 3. wand和t r i a n d线网 线与( w a n d )网指如果某个驱动源为 0,那么线网的值为 0。线与和三态线与 ( t r i a n d )网在语 法和功能上是一致的。 w a n d [-7 : 0] D b u s; t r i a n d Reset, Clk; 如果这类线网存在多个驱动源,线网的有效值由下表决定。 wand (或 t r i a n d ) 0 1 x z 0 0 0 0 0 1 0 1 x 1 x 0 x x x z 0 1 x z 4. trireg线网 此线网存储数值(类似于寄存器),并且用于电容节点的建模。当三态寄存器 ( t r i r e g )的所 有驱动源都处于高阻态,也就是说,值为 z时,三态寄存器线网保存作用在线网上的最后一个 值。此外,三态寄存器线网的缺省初始值为 x。 t r i r e g [1:8] Dbus, Abus; 5. tri0和t r i 1线网 这类线网可用于线逻辑的建模,即线网有多于一个驱动源。 t r i 0(t r i 1)线网的特征是, 若无驱动源驱动,它的值为 0(t r i 1的值为1)。 t r i 0 [-3:3] G n d B u s; t r i 1 [ 0 :-5] OtBus, ItBus; 下表显示在多个驱动源情况下 t r i 0或t r i 1网的有效值。 tri0 (tri1) 0 1 x z 0 0 x x 0 1 x 1 x 1 x x x x x z 0 1 x 0 ( 1 )
Chinaopub.com 第章imi23 下载 6. supply0和 supply l线网 supply用于对“地”建模,即低电平0; supply I网用于对电源建模,即高电平1;例如: supply Gnd, ClkGnd supply [2:0] Vc 3.7.2未说明的线网 在Ⅴ erilog hdl中,有可能不必声明某种线网类型。在这样的情况下,缺省线网类型为1 位线网 可以使用 default nettype编译器指令改变这一隐式线网说明方式。使用方法如下 default nettype net kind 例如,带有下列编译器指令: default nettype wand 任何未被说明的网缺省为1位线与网。 373向量和标量线网 在定义向量线网时可选用关键词 scalared或 vectored。如果一个线网定义时使用了关键词 vectored,那么就不允许位选择和部分选择该线网。换句话说,必须对线网整体赋值(位选择 和部分选择在下一章中讲解)。例如: wire vectored [3: 1 Grb //不允许位选择Grb[2]和部分选择Grb[3:2] wor scalared [4: 0] Best //与wor[4:0]Best相同,允许位选择Best[2]和部分选择Best[3:1]。 如果没有定义关键词,缺省值为标量。 374寄存器类型 有5种不同的寄存器类型。 Integer ·tme realtime reg寄存器类型 寄存器数据类型reg是最常见的数据类型。reg类型使用保留字reg加以说明,形式如下 reg msb: Isb] regl, reg4 msb和sb定义了范围,并且均为常数值表达式。范围定义是可选的:如果没有定义范围,缺 省值为1位寄存器。例如 reg [3: 0] Sat /sat为4位寄存器 /位寄存器 reg [1: 32] Kisp, Pisp, Lisp 寄存器可以取任意长度。寄存器中的值通常被解释为无符号数,例如: eg [1: 4] Comb
6. supply0和s u p p l y 1线网 s u p p l y 0用于对“地”建模,即低电平 0;s u p p l y 1网用于对电源建模,即高电平 1;例如: s u p p l y 0 Gnd, ClkGnd; s u p p l y 1 [2:0] Vcc; 3.7.2 未说明的线网 在Verilog HDL中,有可能不必声明某种线网类型。在这样的情况下,缺省线网类型为 1 位线网。 可以使用` d e f a u l t _ n e t t y p e编译器指令改变这一隐式线网说明方式。使用方法如下: ` d e f a u l t _ n e t t y p e n e t _ k i n d 例如,带有下列编译器指令: `default_nettype wand 任何未被说明的网缺省为1位线与网。 3.7.3 向量和标量线网 在定义向量线网时可选用关键词 s c a l a re d 或v e c t o re d。如果一个线网定义时使用了关键词 v e c t o re d, 那么就不允许位选择和部分选择该线网。换句话说,必须对线网整体赋值(位选择 和部分选择在下一章中讲解)。例如: wire vectored[3:1] G r b; / /不允许位选择G r b[ 2 ]和部分选择G r b [ 3 : 2 ] wor scalared [4:0] B e s t; / /与w o r [4:0] B e s t相同,允许位选择B e s t [ 2 ]和部分选择B e s t [ 3 : 1 ]。 如果没有定义关键词,缺省值为标量。 3.7.4 寄存器类型 有5种不同的寄存器类型。 • reg • integer • time • real • realtime 1. reg寄存器类型 寄存器数据类型r e g是最常见的数据类型。r e g类型使用保留字re g加以说明,形式如下: r e g [ m s b: l s b] reg1, reg2, . . . r e g N; m s b和l s b 定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺 省值为1位寄存器。例如: r e g [3:0] S a t; //S a t为4 位寄存器。 r e g C n t; //1位寄存器。 r e g [1:32] Kisp, Pisp, Lisp; 寄存器可以取任意长度。寄存器中的值通常被解释为无符号数 , 例如: r e g [1:4] C o m b; 第3章 Verilog 语言要素 23 下载