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
? 示例:
reg [7:0] counter;always @(posedge clk or posedge rst)if (rst)counter <= 8'd0;elsecounter <= counter + 1;
?? 注意:
reg
≠ “寄存器” → 它是過程變量 ,綜合后是否為寄存器取決于賦值方式 reg
不能在連續賦值中使用(如 assign
)
2. integer
類型(32 位有符號)
? 用途:
用于循環變量、調試計數器、文件操作等仿真環境 不能聲明位寬 是 signed
類型
? 示例:
integer i;initial beginfor (i = 0; i < 10; i = i + 1)$display("i = %d", i);
end
?? 注意:
綜合工具對 integer
支持有限,推薦用于仿真或將其替換為 reg [31:0]
3. real
與 realtime
? 用途:
表示小數、浮點數(如仿真中的模擬溫度、噪聲等) 不能進行按位操作
? 示例:
real pi;
initial beginpi = 3.1415926;$display("PI = %f", pi);
end
?? 不可綜合
4. time
類型(64 位無符號)
? 用途:
time t_start, t_end;initial begint_start = $time;#100;t_end = $time;$display("Elapsed time = %0t", t_end - t_start);
end
5. genvar
(生成變量)
? 用途:
在 generate-for
塊中,用于宏展開 不能用于仿真運算,僅用于代碼生成時的循環變量
genvar i;
generatefor (i = 0; i < 8; i = i + 1) begin : gen_blkassign y[i] = a[i] & b[i];end
endgenerate
四、變量賦值類型:阻塞與非阻塞
1. 阻塞賦值 =
按順序執行,一條語句執行完才執行下一條 用于組合邏輯建模
a = b;
b = a; // b 會等于原始 b,而不是 a
2. 非阻塞賦值 <=
同步更新,常用于時序邏輯(always @(posedge clk)) 表示“值將在時鐘沿之后統一更新”
a <= b;
b <= a; // 同一時刻交換
🚨 常見誤用
always @(posedge clk) begina = 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