理解 Verilog 标量与向量:位、寄存器与线网类型
Verilog 需表示单个位和位组。例如单个位时序元件是触发器,而 16 位时序元件是可存 16 位的寄存器。为此 Verilog 提供 标量 和 向量 线网和变量。
标量与向量
无范围声明的线网或 reg 视为 1 位宽,即 标量。若指定范围,则成为多位实体即 向量。
wire o_nor; // 单标量线网
wire [7:0] o_flop; // 8位向量线网
reg parity; // 单标量变量
reg [31:0] addr; // 32位向量变量存地址
范围赋予寻址向量中单个位的能力。向量最高有效位 (MSB) 作为范围左值,最低有效位 (LSB) 作为右值。
wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority; // msb=15, lsb=0
wire [my_msb: 2] prior; // 非法
上例创建 16 位宽线网 priority。注意 msb 和 lsb 必须是常量表达式,不能用变量替代。但它们可以是任意整数值——正、负或零;lsb 值可大于、等于或小于 msb 值。
位选择
向量变量中任意位可单独选择并赋新值,称为 位选择。若位选择越界或为 x 或 z,返回值为 x。
reg [7:0] addr; // 8位 reg 变量 [7,6,5,4,3,2,1,0]
addr[0] = 1; // 给 addr 第 0 位赋 1
addr[3] = 0; // 给 addr 第 3 位赋 0
addr[8] = 1; // 非法:addr 不存在第 8 位
部分选择
可选择一段连续位范围,称为 部分选择。分为常量部分选择和索引部分选择两种。
reg [31:0] addr;
addr[23:16] = 8'h23; // 位 23 到 16 将被新值 'h23 替换 -> 常量部分选择
变量部分选择可在循环中有效选择向量部分。起始位可变,但宽度必须常量。
[ +: ] // 从起始位向上递增部分选择
[ -: ] // 从起始位向下递减部分选择
module des;
reg [31:0] data;
int i;
initial begin
data = 32'hFACE_CAFE;
for (i = 0; i < 4; i++) begin
$display ("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
end
$display ("data[7:0] = 0x%0h", data[7:0]);
$display ("data[15:8] = 0x%0h", data[15:8]);
$display ("data[23:16] = 0x%0h", data[23:16]);
$display ("data[31:24] = 0x%0h", data[31:24]);
end
endmodule
仿真日志
ncsim> run data[8*0 +: 8] = 0xfe // ~ data [8*0+8 : 8*0] data[8*1 +: 8] = 0xca // ~ data [8*1+8 : 8*1] data[8*2 +: 8] = 0xce // ~ data [8*2+8 : 8*2] data[8*3 +: 8] = 0xfa // ~ data [8*3+8 : 8*3] data[7:0] = 0xfe data[15:8] = 0xca data[23:16] = 0xce data[31:24] = 0xfa ncsim: *W,RNQUIE: Simulation is complete.
常见错误
module tb;
reg [15:0] data;
initial begin
$display ("data[0:9] = 0x%0h", data[0:9]); // Error: Reversed part-select index expression ordering
end
endmodule
Verilog
- Verilog 入门:数字电路设计完整教程
- 掌握 Verilog 拼接操作:实用指南
- 深入理解 Verilog 赋值语句:类型、语法与最佳实践
- Verilog阻塞与非阻塞赋值:关键区别详解
- 掌握Verilog函数:高效RTL设计的复用利器
- 理解Verilog任务:函数vs任务、语法与用法全解析
- 深入理解 Verilog 中的赋值间延迟与赋值内延迟
- Verilog 时钟发生器设计与实现指南
- 掌握 Verilog 数学函数:高效硬件设计的利器
- 掌握 Verilog $timeformat:精度控制与显示格式化
- 理解与打印 Verilog 任意作用域下的 Timescale
- 掌握 Verilog 文件 I/O:打开、读取、写入和关闭