Vivado
+ -

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

注意事项

  1. 语法兼容性
    • Verilog 使用 (* *) 包裹属性,VHDL 使用 attribute 关键字。
  2. 作用域
    • 部分标记(如 dont_touch)可应用于模块、实例或信号。
  3. 优先级
    • 实现约束(如 max_delay)会覆盖综合阶段的优化指令。

如果需要针对特定场景(如低功耗设计、高速接口)的标记用法,可以进一步探讨!

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!