VIVADO属性标记(Attribute) 和 综合/实现指令
2025-07-15
8
0
1. 调试相关标记
(1) mark_debug
功能:标记信号用于 ILA 调试,在 Vivado 中自动插入探针。
示例:
(* mark_debug = "true" *) reg [7:0] counter; // 标记 counter 信号用于调试
(2) keep
功能:防止信号被优化掉(即使未被使用)。
示例:
(* keep = "true" *) wire unused_signal; // 强制保留该信号
(3) dont_touch
功能:禁止工具优化指定模块或信号(综合和实现阶段均保留)。
示例:
(* dont_touch = "true" *) module my_module (...); // 禁止优化整个模块
(* dont_touch = "true" *) wire critical_net; // 禁止优化特定网络
2. 时序约束相关标记
(1) async_reg
功能:标记同步寄存器链中的寄存器,优化跨时钟域同步,确保信号在异步时钟域之间安全传递,避免亚稳态(Metastability)问题。
示例-跨时钟域同步:
典型的 两级同步器 设计中,标记同步寄存器以增强可靠性:
(* async_reg = "true" *) reg sync_ff1, sync_ff2; // 标记为同步链寄存器
always @(posedge clk_dest) begin
sync_ff1 <= signal_src; // 第一级同步
sync_ff2 <= sync_ff1; // 第二级同步
end
示例-多比特信号同步:
对于多比特信号(如计数器),需配合 格雷码(Gray Code) 或 握手协议,避免数据错位:
(* async_reg = "true" *) reg [1:0] sync_ff [0:1]; // 多级同步数组
always @(posedge clk_dest) begin
sync_ff[0] <= data_src; // 第一级
sync_ff[1] <= sync_ff[0]; // 第二级
end
- 亚稳态风险:当信号从一个时钟域传递到另一个异步时钟域时,寄存器的输出可能进入亚稳态(无法稳定到 0 或 1)。
- 同步链优化:通过 async_reg 标记,工具会确保同步寄存器不会被优化(如合并、删除),并优先布局在低延迟路径上。
(2) max_delay
/ min_delay
功能:手动指定信号的最大/最小延迟(单位:ns)。
示例:
(* max_delay = 5.0 *) wire data_bus; // 约束该信号最大延迟为 5ns
3. 综合优化控制
(1) full_case
功能:告诉综合工具 case
语句已覆盖所有情况,避免生成锁存器。
示例:
always @(*) begin
(* full_case *)
case (sel)
2'b00: out = a;
2'b01: out = b;
default: out = c; // 确保无遗漏
endcase
end
(2) parallel_case
功能:指示综合工具 case
语句的选项是互斥的,可并行优化。
示例:
always @(*) begin
(* parallel_case *)
case (priority)
3'b001: out = 1;
3'b010: out = 2;
default: out = 0;
endcase
end
(3) srl_style
功能:指定移位寄存器的实现方式(register
/srl
/srl_reg
)。
示例:
(* srl_style = "srl" *) reg [7:0] shift_reg; // 使用 SRL 资源而非触发器
4. 实现阶段控制
(1) clock_buffer_type
功能:指定时钟缓冲器类型(如 BUFG
/BUFH
)。
示例:
(* clock_buffer_type = "BUFG" *) wire clk_core; // 强制使用 BUFG
(2) iob
功能:强制信号映射到 I/O 寄存器(输入或输出)。
示例:
(* iob = "true" *) reg output_reg; // 输出信号绑定到 IO 寄存器
5. 其他实用标记
(1) downto
/ to
功能:显式声明向量的方向(兼容性用途)。
示例:
(* downto *) wire [7:0] big_endian; // 明确使用 [7:0] 而非 [0:7]
(2) use_dsp48
功能:强制算术操作使用 DSP48 单元。
示例:
(* use_dsp48 = "yes" *) reg [17:0] multiplier; // 使用 DSP48 实现乘法
完整示例:综合调试与优化
module top (
input clk,
input [1:0] sel,
output reg [7:0] result
);
(* mark_debug = "true" *) reg [7:0] counter; // 标记为调试信号
(* keep = "true" *) wire [7:0] temp; // 防止优化
(* async_reg = "true" *) reg [1:0] sync_ff; // 跨时钟域同步
// 使用 DSP48 实现乘法
(* use_dsp48 = "yes" *)
always @(posedge clk) begin
result <= counter * sel;
end
// 综合优化控制
always @(*) begin
(* full_case, parallel_case *)
case (sel)
2'b00: temp = 8'hFF;
2'b01: temp = 8'h0F;
default: temp = 8'h00;
endcase
end
endmodule
注意事项
- 语法兼容性:
- Verilog 使用
(* *)
包裹属性,VHDL 使用attribute
关键字。
- Verilog 使用
- 作用域:
- 部分标记(如
dont_touch
)可应用于模块、实例或信号。
- 部分标记(如
- 优先级:
- 实现约束(如
max_delay
)会覆盖综合阶段的优化指令。
- 实现约束(如
如果需要针对特定场景(如低功耗设计、高速接口)的标记用法,可以进一步探讨!