(* ASYNC_REG = “true“ *) (* shift_extract = “{no}“ *)
·
一、(* 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
四、综合建议
-
异步时钟域交叉:总是使用
ASYNC_REG -
关键时序路径:考虑使用
shift_extract保证性能 -
结合使用:在同步链中同时使用这两个属性可以获得最好的时序特性
这些属性帮助综合工具理解设计意图,生成更可靠的硬件实现。
更多推荐


所有评论(0)