Verilog 的屬性(Attributes) 的系統化培訓內容,適用于希望深入理解屬性如何在綜合、仿真和工具指示中使用的專業工程師。內容將涵蓋:屬性的定義、語法、使用場景、典型示例、工具兼容性與注意事項。
一、什么是 Verilog 的屬性(Attribute)
Verilog 的屬性是附加在語句或對象上的元信息(Metadata),不會改變功能行為,但用于指導綜合器、仿真器或其他EDA工具的行為,例如:優化、保留、資源映射、布局布線等。
**形象類比:**屬性類似于 C 語言中的
__attribute__
,或 Python 中的裝飾器@property
。
二、Verilog 屬性的語法
Verilog 的屬性語法標準為:
(* attribute_name = value, attribute_name2 = value2 *) module_name ...
🔹 語法規則說明:
-
屬性前后用
(* ... *)
包裹。 -
支持多個屬性同時聲明,屬性間用逗號隔開。
-
可以附加在:
- module 定義上
- wire/reg/parameter/port 定義上
- always/assign/process 塊上
- 實例化語句上
三、常見的 Verilog 屬性及用途分類
1. 保留/不優化類屬性
屬性 | 含義說明 |
---|---|
keep | 保留信號,禁止優化器移除未使用信號 |
keep_hierarchy | 保留層級結構,不對模塊進行層級合并 |
dont_touch | 不允許綜合器優化該對象 |
preserve_signal | 在仿真/布局布線階段保留該信號 |
📌 示例:
(* keep = "true" *) wire clk_internal;
(* dont_touch = "true" *) reg [7:0] debug_data;
2. 時序與布線類屬性
屬性 | 含義說明 |
---|---|
max_fanout | 限制該信號的扇出數量 |
max_delay | 指定最大路徑延遲 |
min_delay | 指定最小路徑延遲 |
clock_signal | 聲明該信號為時鐘信號,有利于工具識別并特殊處理 |
📌 示例:
(* max_fanout = 8 *) wire ctrl_sig;
3. 綜合優化建議類屬性
屬性 | 含義說明 |
---|---|
async_reg | 聲明該寄存器為異步域跨時鐘寄存器,用于CDC優化 |
shreg_extract | 指示是否將移位寄存器提取為 SRL(Shift Register LUT) |
ram_style | 強制指定綜合器將存儲器推導為 block/distributed RAM |
rom_style | 同上,應用于 ROM 指示 |
📌 示例:
(* async_reg = "true" *) reg sync_stage1, sync_stage2;
(* ram_style = "block" *) reg [7:0] memory_array [0:255];
4. 約束布局布線/區域屬性
這些主要用于 Vivado 的 pblock、區域約束等。
屬性 | 含義說明 |
---|---|
loc | 強制指定元件位置(常用于 IOB、BRAM、DSP) |
box_type | 指定約束邊界類型(硬/軟) |
bel | Basic Element Location(用于邏輯資源的綁定) |
📌 示例(Vivado):
(* loc = "SLICE_X12Y34" *) reg my_reg;
四、屬性兼容性與工具支持情況
工具名稱 | 屬性支持情況說明 |
---|---|
Vivado | 屬性使用最廣泛,如 keep , dont_touch , async_reg |
Quartus Prime | 使用類似但部分為專用語法,如 syn_keep , noprune |
Diamond | 支持 Lattice 特定屬性,如 syn_keep , syn_ramstyle |
Yosys | 支持部分屬性,推薦結合 (* keep *) 和 (* blackbox *) |
💡 建議:
- 交叉平臺時使用 標準屬性名(如
keep
,ram_style
)。 - 針對特定工具使用官方文檔推薦的屬性組合,例如 Quartus 中使用
// synthesis keep
注釋式屬性。
五、實際工程中的使用案例
🎯 案例 1:防止移位寄存器被優化掉
(* keep = "true", shreg_extract = "no" *) reg [3:0] delay_chain;
🎯 案例 2:聲明異步跨時鐘同步寄存器
(* async_reg = "true" *) reg sync_stage1, sync_stage2;
🎯 案例 3:強制推導為 Block RAM
(* ram_style = "block" *) reg [15:0] buffer [0:1023];
六、注意事項
- 屬性不會改變 RTL 語義,僅為工具提供優化/保留/映射建議。
- 有些屬性只有在綜合階段生效,仿真器會忽略。
- 屬性值應為字符串,推薦加雙引號(如
"true"
)。 - 不同工具的屬性名略有不同,應查看工具鏈官方支持手冊。
七、小結
內容 | 要點 |
---|---|
屬性用途 | 控制綜合/布局布線/優化行為 |
語法形式 | (* 屬性名 = 值 *) |
常用屬性 | keep , dont_touch , ram_style , async_reg 等 |
兼容建議 | 使用標準屬性 + 查閱各廠商工具文檔 |