非原创 ,从知乎转载过来的 ,转载地址
https://zhuanlan.zhihu.com/p/36790736
ASYNC_REG属性一般用于跨时钟域的数据同步上,该属性指定:寄存器可以接受异步数据或者该寄存器是一个位于同步链上的同步寄存器。
在仿真过程中,当发生时序违例时,寄存器默认行为会输出X或不定态,从而进可能在多个路径上传输不定态。ASYNC_REG能够使得在发生时许违例时输出上次已知值。
在附加了ASYNCREG属性后,在综合的过程中将不会优化该寄存器及其周边逻辑,同时也影响optimization,place&routing以提高MTBF(mean time between failure)。在布局时,将会确保同步链上的寄存器摆放尽可能接近一最大化MTBF,直接相连的带有该属性的寄存器将会直接放进单个SLICE/CLB(如果寄存器同时带有ASYNC_REG和IOB属性,IOB将优先于ASYNC_REG,寄存器将会被存放至ILOGIC block)。
如下例所示,,sync_0,sync_1将会被放至同一个SLICE/CLB内:
(*ASYNC_REG="TRUE"*)reg sync_0,sync_1;
always @(posedge clk)
begin
sync_1<=sync_0;
sync_0<=en;
其电路图及布局图分别如下图所示:
综合电路图
布局图
属性原语:
verilog:
(* ASYNC_REG = "{TRUE|FALSE}" *)
Verilog Syntax Example
// Designates sync_regs as receiving asynchronous data
(* ASYNC_REG = "TRUE" *) reg [2:0] sync_regs;
XDC Syntax
set_property ASYNC_REG value [getcells <instance_name>]
Where
• <instance_name> is a register cell.
XDC Syntax Example
# Designates sync_regs as receiving asynchronous data
set_property ASYNC_REG TRUE [get_cells sync_regs*]