前面我们学习了 Verilog 的基础语法知识,对 Verilog 也有了一定的了解,但在我学习的过程中一直抱有一个疑问,那就是 wire 类型与 reg 类型的区别在哪?然后我查阅了许多资料,也阅读了夏宇闻老师的 Verilog数字系统设计教程,最终对 wire 类型和 reg 类型之间的区别有了一个较为清晰的理解。在下面,我会阐述我对 wire 类型与 reg 类型之间的一些理解。
用最通俗的话讲,wire 类型(线网类型)表示的是直通,也就是一根线,一头连接的是输入,一头连接的是输出,只要输入有变化,输出也就跟着变化,当没有输入时,wire 型变量的默认值是z(高阻态)。而 reg 类型(寄存器类型)表示的是存储单元,它会一直保持原有的数据即默认值x(未知状态),直到相应的触发信号产生,输出才会变化,在我看来,reg 类型更像是一个气球,或者说更像是一把门锁,在没有正确钥匙(无相应触发信号)的情况下,它会一直保持着关门的状态即初始状态,在有正确钥匙(相应触发信号)的情况下,它才会开门(输出有变化)。
1)wire 类型的变量综合出来是一根导线
2)reg 类型的变量在 always 语句模块中又分为两种情况:
(a)如果 always 后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿触发信号的,那么此时的 reg 类型的变量综合出来是组合逻辑。
(b)如果 always 后的敏感表中是(posedge clk)形式的,也就是带边沿触发信号的,那么综合出来一般是时序逻辑,并且会包含触发器(Flip-Flop)。
在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出的,那么对于本级来说就是一根导线,也就是 wire 型。而输出信号则由你自己来决定是组合逻辑输出还是寄存器输出,wire 类型和 reg 类型都可以。但一般来说,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,这样的话较稳定,扇出能力也够好。
wire 类型变量对应于连续赋值,如 assign。
reg 类型变量对应于过程赋值,如 always,initial。
1)assign 语句中必须使用 wire 型变量
例如:
reg a,b;
wire result;
assign result =a&&b;
但如果把 result 定义为 reg 类型,综合器会报错。
2)元件例化的时候输出必须用 wire 型变量
例如:
wire dout;
ram u_ram
(
…
.out(dout)
…
);
3) input、output 和 inout 的预设值都是 wire 类型
1)变量放在 begin……end 之内必须使用 reg 类型
2)在 always 或 initial 语句中使用
以上就是我的 wire 类型与 reg 类型的一些比较粗浅的理解,希望可以帮到一些初学者们,如果我的理解有问题的话,欢迎看到这篇文章的朋友们来指正我。