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 等 |
兼容建议 | 使用标准属性 + 查阅各厂商工具文档 |