FPGA基础 -- Verilog语言要素之变量类型

Verilog 变量类型(Variable Types)


一、什么是变量类型?

在 Verilog 中,变量类型用于保存过程赋值结果(由 always 或 initial 块赋值),通常用于建模寄存器、状态、计数器等"带记忆"的硬件行为。

它与 wire 不同,变量不代表电路连接线 ,而是代表一个可以存储值的逻辑存储单元。


二、常见变量类型一览表

变量类型 位宽支持 默认值 可综合 用途说明
reg ✔ x ✔ 最常用,建模时序逻辑
integer ❌(固定32位) x ✔(有限支持) 仿真用的整数、循环变量
real ❌ 0.0 ❌ 浮点数仿真使用,不可综合
realtime ❌ 0.0 ❌ 精确时间建模(和 real 相同)
time ❌(64位) x ✔(有限) 表示时间戳
genvar ✔(宏展开) 无 ✔ generate 块中用于宏生成的变量

三、重点变量类型详解

1. reg 类型(最常用)

✅ 用途:
  • 建模寄存器或组合逻辑的中间变量
  • 必须在过程块中赋值:always, initial
✅ 示例:
verilog 复制代码
reg [7:0] counter;

always @(posedge clk or posedge rst)
  if (rst)
    counter <= 8'd0;
  else
    counter <= counter + 1;
⚠️ 注意:
  • reg ≠ "寄存器" → 它是过程变量 ,综合后是否为寄存器取决于赋值方式
  • reg 不能在连续赋值中使用(如 assign)

2. integer 类型(32 位有符号)

✅ 用途:
  • 用于循环变量、调试计数器、文件操作等仿真环境
  • 不能声明位宽
  • 是 signed 类型
✅ 示例:
verilog 复制代码
integer i;

initial begin
  for (i = 0; i < 10; i = i + 1)
    $display("i = %d", i);
end
⚠️ 注意:
  • 综合工具对 integer 支持有限,推荐用于仿真或将其替换为 reg [31:0]

3. real 与 realtime

✅ 用途:
  • 表示小数、浮点数(如仿真中的模拟温度、噪声等)
  • 不能进行按位操作
✅ 示例:
verilog 复制代码
real pi;
initial begin
  pi = 3.1415926;
  $display("PI = %f", pi);
end
⚠️ 不可综合

4. time 类型(64 位无符号)

✅ 用途:
  • 表示时间单位,如延迟、时间戳
verilog 复制代码
time t_start, t_end;

initial begin
  t_start = $time;
  #100;
  t_end = $time;
  $display("Elapsed time = %0t", t_end - t_start);
end

5. genvar(生成变量)

✅ 用途:
  • 在 generate-for 块中,用于宏展开
  • 不能用于仿真运算,仅用于代码生成时的循环变量
verilog 复制代码
genvar i;
generate
  for (i = 0; i < 8; i = i + 1) begin : gen_blk
    assign y[i] = a[i] & b[i];
  end
endgenerate

四、变量赋值类型:阻塞与非阻塞

1. 阻塞赋值 =

  • 按顺序执行,一条语句执行完才执行下一条
  • 用于组合逻辑建模
verilog 复制代码
a = b;
b = a;  // b 会等于原始 b,而不是 a

2. 非阻塞赋值 <=

  • 同步更新,常用于时序逻辑(always @(posedge clk))
  • 表示"值将在时钟沿之后统一更新"
verilog 复制代码
a <= b;
b <= a;  // 同一时刻交换

🚨 常见误用

verilog 复制代码
always @(posedge clk) begin
  a = b;  // ❌ 错误:应使用非阻塞赋值
end

五、变量类型的可综合性对比

类型 可综合 常见用法
reg ✔ 状态寄存器、计数器
integer ✔(有限) 仿真循环变量
real ❌ 仿真模型
time ✔(有限) 延迟监测、时间戳
genvar ✔(宏生成) 结构展开、模块实例化

✅ 总结:变量与线网类型对比表

属性 Net (wire) Variable (reg, integer, ...)
可用于 assign ✔ ❌
可用于 always ❌ ✔
表示含义 连接信号线 存储状态
初始值 z x(除 integer)
多驱动 支持 不支持
合成为电路 ✔(组合逻辑) ✔(组合或时序逻辑)

✅ 建议实践风格

场景 推荐使用
寄存器、状态机、计数器 reg
循环变量、仿真测试 integer
组合中间变量(always) reg 或 logic
时序逻辑建模 非阻塞 <=
组合逻辑建模 阻塞 =
generate-for 宏生成 genvar
相关推荐
自小吃多9 小时前
【Verilog/FPGA】存储器(数组)
嵌入式硬件·fpga开发
szxinmai主板定制专家9 小时前
RK3588+FPGA异构架构|高速数据采集+边缘AI落地应用全解析
人工智能·嵌入式硬件·fpga开发·架构·zynq
明德扬15 小时前
FPGA MIPI 多路视频聚合方案
fpga开发·mipi视频拼接·mipi多路拼接·mipi协议·mipi视频拼接方案·fpga mipi方案·mipi csi
XMAIPC_Robot15 小时前
为什么大型储能需要边缘 AI 协调控制器?RK3588+FPGA 高速采集方案
人工智能·嵌入式硬件·fpga开发·arm+fpga·rk3588+fpga·协调控制器
szxinmai主板定制专家15 小时前
RK3576+CODESYS+RK182X+FPGA异构架构:半导体精密设备一体化控制器方案
人工智能·fpga开发·架构·rk3576+codesys
szxinmai主板定制专家15 小时前
半导体设备控制器:RK3576+CODESYS+RK182X异构架构,实现晶圆视觉检测与运动联动闭环
人工智能·fpga开发·架构·视觉检测·边缘计算·codesys·rk3576
szxinmai主板定制专家17 小时前
FPGA高速IO+RK182X AI算力|RK3576+CODESYS工业自动化运动控制平台设计
运维·人工智能·嵌入式硬件·fpga开发·自动化·zynq
FPGA小徐17 小时前
原理图分析:Type-C 转串口(CH340C)最小系统板 CSDN 博客
fpga开发
智感子17 小时前
FPGA采集:高采样率数据流与存储
fpga开发
狂奔蜗牛(bradley)1 天前
拒绝SOEM黑盒!死磕EtherCAT主站:ARM+FPGA架构、DC同步与状态机修复等,50+篇实战开发文档全公开
arm开发·fpga开发·架构