一、(* ASYNC_REG = "true" *)

1、作用:

标识一个寄存器是异步时钟域同步链的一部分。

2、使用场景:

// 典型的异步信号同步链
(* ASYNC_REG = "true" *) reg sync_stage0;
(* ASYNC_REG = "true" *) reg sync_stage1;
(* ASYNC_REG = "true" *) reg sync_stage2;

always @(posedge clk_dest or posedge rst) begin
    if (rst) begin
        sync_stage0 <= 1'b0;
        sync_stage1 <= 1'b0;
        sync_stage2 <= 1'b0;
    end else begin
        sync_stage0 <= async_signal;
        sync_stage1 <= sync_stage0;
        sync_stage2 <= sync_stage1;
    end
end

3、效果:

  • 告诉工具这些寄存器需要被放置在同一个 SLICE 中

  • 避免被优化掉(如寄存器复制)

  • 提高 MTBF(平均无故障时间)


二、(* shift_extract = "{no}" *)

1、作用:

禁止工具从寄存器中提取 SRL(Shift Register LUT)。

2、使用场景:

(* shift_extract = "{no}" *) reg [7:0] delay_line;

always @(posedge clk) begin
    delay_line <= {delay_line[6:0], data_in};
end

3、效果:

  • 强制使用触发器实现移位寄存器

  • 避免使用 LUT 实现的 SRL

  • 保证时序一致性


三、典型应用示例

module async_sync (
    input  wire clk_dest,
    input  wire rst,
    input  wire async_input,
    output wire sync_output
);

// 异步信号同步链,防止亚稳态
(* ASYNC_REG = "true" *) (* shift_extract = "{no}" *) reg stage0;
(* ASYNC_REG = "true" *) (* shift_extract = "{no}" *) reg stage1;
(* ASYNC_REG = "true" *) (* shift_extract = "{no}" *) reg stage2;

always @(posedge clk_dest or posedge rst) begin
    if (rst) begin
        stage0 <= 1'b0;
        stage1 <= 1'b0;
        stage2 <= 1'b0;
    end else begin
        stage0 <= async_input;  // 可能发生亚稳态
        stage1 <= stage0;       // 亚稳态概率降低
        stage2 <= stage1;       // 基本消除亚稳态
    end
end

assign sync_output = stage2;

endmodule

四、综合建议

  1. 异步时钟域交叉:总是使用 ASYNC_REG

  2. 关键时序路径:考虑使用 shift_extract 保证性能

  3. 结合使用:在同步链中同时使用这两个属性可以获得最好的时序特性

这些属性帮助综合工具理解设计意图,生成更可靠的硬件实现。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐