Verilog 的属性(Attributes) 的系统化培训内容,适用于希望深入理解属性如何在综合、仿真和工具指示中使用的专业工程师。内容将涵盖:属性的定义、语法、使用场景、典型示例、工具兼容性与注意事项。
Verilog 的属性是附加在语句或对象上的元信息(Metadata),不会改变功能行为,但用于指导综合器、仿真器或其他EDA工具的行为,例如:优化、保留、资源映射、布局布线等。
**形象类比:**属性类似于 C 语言中的
__attribute__
,或 Python 中的装饰器@property
。
Verilog 的属性语法标准为:
(* attribute_name = value, attribute_name2 = value2 *) module_name ...
属性前后用 (* ... *)
包裹。
支持多个属性同时声明,属性间用逗号隔开。
可以附加在:
属性 | 含义说明 |
---|---|
keep |
保留信号,禁止优化器移除未使用信号 |
keep_hierarchy |
保留层级结构,不对模块进行层级合并 |
dont_touch |
不允许综合器优化该对象 |
preserve_signal |
在仿真/布局布线阶段保留该信号 |
示例:
(* keep = "true" *) wire clk_internal;
(* dont_touch = "true" *) reg [7:0] debug_data;
属性 | 含义说明 |
---|---|
max_fanout |
限制该信号的扇出数量 |
max_delay |
指定最大路径延迟 |
min_delay |
指定最小路径延迟 |
clock_signal |
声明该信号为时钟信号,有利于工具识别并特殊处理 |
示例:
(* max_fanout = 8 *) wire ctrl_sig;
属性 | 含义说明 |
---|---|
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];
这些主要用于 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
)。// synthesis keep
注释式属性。(* keep = "true", shreg_extract = "no" *) reg [3:0] delay_chain;
(* async_reg = "true" *) reg sync_stage1, sync_stage2;
(* ram_style = "block" *) reg [15:0] buffer [0:1023];
"true"
)。内容 | 要点 |
---|---|
属性用途 | 控制综合/布局布线/优化行为 |
语法形式 | (* 属性名 = 值 *) |
常用属性 | keep , dont_touch , ram_style , async_reg 等 |
兼容建议 | 使用标准属性 + 查阅各厂商工具文档 |