Verilog数据类型
Verilog HDL 有两大类数据类型。
1) 线网类型。 net type 表示 Verilog 结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为 z 。
2) 寄存器类型。 register type 表示一个抽象的数据存储单元,它只能在 always 语句和 initial 语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有 x 的缺省值。
线网类型
线网数据类型包含下述不同种类的线网子类型。
* wire
* tri
* wor
* trior
* wand
* triand
* trireg
* tri1
* tri0
* supply0
* supply1
简单的线网类型说明语法为:
net_kind [msb:lsb] net1, net2, . . . , netN;
net_kind 是上述线网类型的一种。 msb 和 lsb 是用于定义线网范围的常量表达式;范围定义是可选的;如果没有定义范围,缺省的线网类型为 1 位。下面是线网类型说明实例。
wire Rdy, Start; //2 个 1 位的连线。
wand [2:0] Addr; //Addr 是 3 位线与。
当一个线网有多个驱动器时,即对一个线网有多个赋值时,不同的线网产生不同的行为。例如,
wor Rde;
. . .
assign Rde = Blt Wyl;
. . .
assign Rde = Kbl | Kip;
本例中, Rde 有两个驱动源,分别来自于两个连续赋值语句。由于它是线或线网, Rde 的有效值由使用驱动源的值(右边表达式的值)的线或 (wor) 表(参见后面线或网的有关章节)决定。
1. wire 和 tri 线网
用于连接单元的连线是最常见的线网类型。连线与三态线 (tri) 网语法和语义一致;三态线可以用于描述多个驱动源驱动同一根线的线网类型;并且没有其他特殊的意义。
wire Reset;
wire [3:2] Cla, Pla, Sla;
tri [ MSB - 1 : LSB +1] Art;
如果多个驱动源驱动一个连线(或三态线网),线网的有效值由下表决定。
wire ( 或 tri) 0 1 x z
0 0 x x 0
1 x 1 x 1
x x x x x
z 0 1 x z
下面是一个具体实例:
assign Cla = Pla Sla;
. . .
assign Cla = Pla ^ Sla;
在这个实例中, Cla 有两个驱动源。两个驱动源的值(右侧表达式的值)用于在上表中索引,以便决定 Cla 的有效值。由于 Cla 是一个向量,每位的计算是相关的。例如,如果第一个右侧表达式的值为 01x, 并且第二个右测表达式的值为 11z ,那么 Cla 的有效值是 x1x ( 第一位 0 和 1 在表中索引到 x, 第二位 1 和 1 在表中索引到 1 ,第三位 x 和 z 在表中索引到 x) 。
2. wor 和 trior 线网
线或指如果某个驱动源为 1 ,那么线网的值也为 1 。线或和三态线或 (trior) 在语法和功能上是一致的。
wor [MSB:LSB] Art;
trior [MAX - 1: MIN - 1] Rdx, Sdx, Bdx;
如果多个驱动源驱动这类网,网的有效值由下表决定。
wor ( 或 trior) 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 和 triand 线网
线与 (wand) 网指如果某个驱动源为 0 ,那么线网的值为 0 。线与和三态线与 (triand) 网在语法和功能上是一致的。
wand [-7 : 0] Dbus;
triand Reset, Clk;
如果这类线网存在多个驱动源,线网的有效值由下表决定。
wand ( 或 triand) 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 线网
此线网存储数值(类似于寄存器),并且用于电容节点的建模。当三态寄存器 (trireg) 的所有驱动源都处于高阻态,也就是说,值为 z 时,三态寄存器线网保存作用在线网上的最后一个值。此外,三态寄存器线网的缺省初始值为 x 。
trireg [1:8] Dbus, Abus;
5. tri0 和 tri1 线网
这类线网可用于线逻辑的建模,即线网有多于一个驱动源。 tri0 ( tri1 )线网的特征是,若无驱动源驱动,它的值为 0 ( tri1 的值为 1 )。
tri0 [ - 3:3] GndBus;
tri1 [0: - 5] OtBus, ItBus;
下表显示在多个驱动源情况下 tri0 或 tri1 网的有效值。
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)
6. supply0 和 supply1 线网
supply0 用于对 “ 地 ” 建模,即低电平 0 ; supply1 网用于对电源建模,即高电平 1 ;例如 :
supply0 Gnd, ClkGnd;
supply1 [2:0] Vcc;
未说明的线网
在 Verilog HDL 中,有可能不必声明某种线网类型。在这样的情况下,缺省线网类型为 1 位线网。
可以使用 `default_nettype 编译器指令改变这一隐式线网说明方式。使用方法如下:
`default_nettype net_kind
例如,带有下列编译器指令:
`default_nettype wand
任何未被说明的网缺省为 1 位线与网。
向量和标量线网
在定义向量线网时可选用关键词 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] 。
如果没有定义关键词,缺省值为标量。
寄存器类型
有 5 种不同的寄存器类型。
* reg
* integer
* time
* real
* realtime
1. reg 寄存器类型
寄存器数据类型 reg 是最常见的数据类型。 reg 类型使用保留字 reg 加以说明,形式如下:
reg [ msb: lsb] reg1, reg2, . . . regN;
msb 和 lsb 定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为 1 位寄存器。例如:
reg [3:0] Sat; //Sat 为 4 位寄存器。
reg Cnt; //1 位寄存器。
reg [1:32] Kisp, Pisp, Lisp;
寄存器可以取任意长度。寄存器中的值通常被解释为无符号数 , 例如:
reg [1:4] Comb;
. . .
Comb = - 2; //Comb 的值为 14 ( 1110 ), 1110 是 2 的补码。
Comb = 5; //Comb 的值为 15 ( 0101 )。
- 基于SystemC 的系统验证研究和应用(08-10)
- SoC:IP是新的抽象(10-24)
- 从传统电路检查到先进可靠性验证的最佳实践(07-03)
- 基于Verilog语言的等精度频率计设计(08-14)
- Verilog串口通讯设计(06-06)
- Verilog HDL 设计模拟(06-06)