Verilog HDL
的信号类型有很多种,主要包括两种数据类型:线网类型
(net type)
和寄存器类型
(
reg type
)。在进行工程设计的过程中也只会使用到这两个类型的信号。
4.1 信号位宽
定义信号类型的同时,必须定义好信号的位宽。默认信号的位宽是 1
位,当信号的位宽为
1
时可不表述,如定义位宽为 1
的
wire
型信号
a
可直接用“
wire a;
”来表示。但信号的位宽大于
1
位时就一定要表示出来,如用“wire [7:0]
”来表示该
wire
型信号的位宽为
8
位。
信号的位宽取决于要该信号要表示的最大值。该信号能表示的无符号数最大值是:2
n
-1
,其中
n表示该信号的位宽。例如,信号 a
的最大值为
1000
,那么信号
a
的位宽必须大于或等于
10
位。
下面分享一个位宽计算技巧:打开电脑的“计算器”后选用程序员模式,在在 10
进制下
输入信号值,如
1000
,随后可以查看信号位宽。
4.2 线网类型 wire
线网类型用于对结构化器件之间的物理连线的建模,如器件的管脚,芯片内部器件如与门的输出等。由于线网类型代表的是物理连接线,因此其不存储逻辑值,必须由器件驱动。通常用 assign
进行赋值,如 assign A = B ^ C
。
4.3
寄存器类型
reg
reg 是最常用的寄存器类型,寄存器类型通常用于对存储单元的描述,如
D
型触发器、
ROM
等。寄存器类型信号的特点是在某种触发机制下分配了一个值,在下一触发机制到来之前保留原值。
但必须注意的是:reg
类型的变量不一定是存储单元,如在
always
语句中进行描述的必须是用
reg类型的变量。
reg
类型定义语法如下:
reg [msb: lsb] reg1, reg2, . . . reg N;
4.4 wire 和 reg 的区别
reg
型信号并不一定生成寄存器。针对什么时候使用
wire
类型,什么时候用
reg
类型这一
问题,本书总结出一套解决方法:在本模块中使用
always
设计的信号都定义为
reg
型,其他信
号都定义为
wire
型。
上述代码中,
cnt1
是用
always
设计的,所以定义为
reg
型。
add_cnt1
和
end_cnt
不是由
alwa
ys
产生的,所以定义为
wire
型。
上述代码中,信号
x
是用
always
设计的,所以要定义为
reg
型。注意:实际的电路中信号
x
不
是寄存器类型,但仍然定义为
reg
型。
以上是例化的代码,其中
df
是例化模块的输出。由于
df
不是由
always
产生的,而是例化产生
的,因此要定义成
wire
型。