数字逻辑实践5->Verilog语法 | wire 与 reg 的选择与特性总结
问题起因:最初学习数字逻辑设计理论的时候还没有注意到,在实验课上写代码的时候发现了一个问题:
对于源码模块的变量定义,何时定义为reg、何时定义为wire?它们各自又有什么特性和物理意义?
1. wire
wire是网络数据类型的关键字。
网络数据类型表示结构实体(例如门)之间的物理连接(线)。网络类型的变量不能储存值。
语言特性
wire型数据常用来表示用于
-
结构化定义
-
assign为代表的连续赋值描述
也叫数据流描述方式、RTL级描述方式
指定的组合逻辑信号。
程序模块中,输入输出信号类型缺省时,自动定义为wire型。
wire型信号可以用作任何表达式的输入,也可以用作“assign”语句或实例元件的输出。
示例:
1 wire a; 2 //定义了一个一位的wire型数据 3 wire [7:0] b; 4 //定义了一个八位的wire型数据 5 wire [4:1] c, d; 6 //定义了两个四位的wire型数据 7 //注意是两个
物理意义
表示线。
上面的
wire [7:0] b;
就表示一组编号从7到0的八条线。
从这个层次可以理解为什么
1 wire [0:7] b; 2 3 wire [1:8] b; 4 5 wire [8:1] b;
都是符合定义不会报错的;
也可以理解其可以作为任何表达式的输入和输出。
2. reg
reg是寄存器数据类型的关键字。而寄存器是数据存储单元的抽象。
语言特性
reg型数据常用来表示用于always模块内的指定信号,常代表触发器。即常用在行为描述语句中。
在always块内被赋值的每一个信号都必须定义成reg型。
示例:
1 reg rega; 2 //定义了一个一位的名为rega的reg型数据 3 reg [3:0] regb; 4 //定义了一个四位的名为regb的reg型数据 5 reg [4:1] regc, regd; 6 //定义了两个四位的名为regc和regd的reg型数据
reg型数据可以赋正值,也可以赋负值。
物理意义
表示类寄存器(registor)的存储单元。
联系上面的语言特性,赋值语句的作用就是改变一组触发器存储的值。
另外强调一点:
reg型只表示被定义的信号将用在always块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg信号常常是寄存器、触发器的输出。