3.1 标量
在Verilog中,标量(scalar)指的是单个位的信号或者变量,与向量(vector)相对。标量通常只包含一个独立位,表示一个二进制值(0或1)或者一个逻辑状态(比如逻辑值true或false)。
与向量不同,标量没有范围或位宽,一个标量可以是一个寄存器、一个线网、一个参数或一个局部变量。以下是一些示例:
reg clk;//定义一个标量寄存器,表示时钟信号 wire out; //定义一个标量线网,用于输出信号 always @(posedge clk) begin out <= ~out; //对输出信号进行取反 end
3.2 向量
vector通常指的是一个多位的信号,它可以是一个寄存器、一个线网、一个参数或一个局部变量。通常,向量由多个连续的位组成,可以表示一个数据字、一个数据、一个地址或者其他多位信息。
在Verilog中,向量可以使用方括号表示其范围。例如,一个8位的向量可以表示为[7:0],其中7是最高有效位(MSB),0是最低有效位(LSB)。例如:
reg [7:0] my_vector;
3.2.1 向量的声明
向量的声明必须为:
type [upper:lower] vector_name;
以下是一些常见和特殊的向量类型的声明例子:
wire [7:0] w; //8-bit 线网 reg [4:1] x; //4-bit 寄存器 output reg [0:0] y; //1-bit 输出端口,y同样是向量 inout wire [3:-2] z; //6-bit 负数范围也可以 output [3:0] a; //4-bit 这里没有标准变量类型,默认为“wire” wire [0:7] b; //8-bit 其中b[0]是最高有效位
在Verilog中,无论是wire [0:7] b;
还是wire [7:0] b;
,都是表示一个8位的wire向量,只是索引的方向相反。
-
对于
wire [0:7] b;
,索引从0到7,b[0]是最低位,b[7]是最高位。 -
对于
wire [7:0] b;
,索引从7到0,b[7]是最高位,b[0]是最低位。
索引的方向只是约定的不同,但不会影响向量的大小或者最高位的位置。
3.2.2 隐式网络
隐式网络(Implicit nets)是在Verilog中未显示声明而自动创建的线网。当使用assign
语句或未声明的内容连接到模块端口时,可能会隐式地创建线网。这些线网没有在代码中明确地定义,而是根据上下文自动推导生成的。
隐式线网会导致一些难以发现的错误。例如,如果打算使用一个多位向量,但不小心使用了隐式线网,则可能会导致意外的行为或功能错误:
module ImplicitNrtsExample( input a, input b, output y ); assign y = a & b; //没有明确声明y的类型,将会隐式创建一个线网 endmodule
为避免这种情况,我们可以显式地声明y
的类型,例如:
output [7:0] y; //声明y是一个八位的向量
在Verilog中,提供了default_nettype none
指令,可以在代码中禁用隐式线网的创建。通过这个指令,可以强制要求所以线网都必须显式地声明,从而帮助减少潜在的错误。
3.2.3 数组
在向量的声明中,向量索引是在向量名称之前编写的,如果括号写在变量名之后,即表示数组。在Verilog中,数组是一种数据结构,用于存储相同类型的元素。数组可以是一维的、多维的,也可以是packed(打包的)或unpacked(未打包的)。
-
一维数组:包含一组元素,每个元素都有一个唯一的索引。
-
多维数组:包含多个维度的元素,每个维度都有一个唯一的索引。
-
打包数组:将元素打包到一个连续的位块中,通常用于表示数据寄存器或信号
-
未打包数组:元素不打包到一个连续的位块中,通常用于表示寄存器或多维数组。
"位块"(bit blob)是一种连续的二进制位组合,通常用于打包数组(packed arrays)中。在打包数组中,多个信号或数据元素被连续地存储在一起,形成一个连续的二进制位块。
例如,在一个打包的8位数组中,每个元素都是一个8位的二进制,这8位连续地存储在一起,形成一个位块。这样的位块可以被整体地传递、处理或存储,而不是需要对每个位进行单独的操作。
位块的概念在硬件描述语言中很常见,因为它能够更有效地表示硬件中的数据结构和信号。
例如:
reg [7:0] mem [255:0]; //256个未打包元素,每个元素是一个8位打包的寄存器向量 reg mem2 [28:0]; //29个未打包元素,每个元素是一个1位寄存器 reg [7:0] mem3 [255:0] //一个8位寄存器向量(reg [7:0]),它被打包在mem3中,形成了一个256个元素的数组。因此,每个数组元素都是一个8位的寄存器向量。
Verilog中的数组允许在硬件描述中方便地组织和访问数据。可以使用数组来表示寄存器、寄存器文件、FIFO队列等。