亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Verilog

理解 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

  1. Verilog 入门:数字电路设计完整教程
  2. 掌握 Verilog 拼接操作:实用指南
  3. 深入理解 Verilog 赋值语句:类型、语法与最佳实践
  4. Verilog阻塞与非阻塞赋值:关键区别详解
  5. 掌握Verilog函数:高效RTL设计的复用利器
  6. 理解Verilog任务:函数vs任务、语法与用法全解析
  7. 深入理解 Verilog 中的赋值间延迟与赋值内延迟
  8. Verilog 时钟发生器设计与实现指南
  9. 掌握 Verilog 数学函数:高效硬件设计的利器
  10. 掌握 Verilog $timeformat:精度控制与显示格式化
  11. 理解与打印 Verilog 任意作用域下的 Timescale
  12. 掌握 Verilog 文件 I/O:打开、读取、写入和关闭