Vivado綜合屬性系列之一 ASYNC_REG
一、屬性簡介
?????????ASYNC_REG屬性的作用對象為寄存器,寄存器添加該屬性后,即表明寄存器的數(shù)據(jù)輸入口D接收的是來自異步時鐘觸發(fā)器的數(shù)據(jù)或是該寄存器在一個同步鏈中屬于同步寄存器。ASYNC_REG更多的是使用在異步跨時鐘域中。
????????在Vivado綜合的過程中,對于添加了ASYNC_REG屬性的寄存器,會將該屬性放置到網(wǎng)表的前面,這也能保證網(wǎng)表不會被優(yōu)化掉,在后面的流程中將正確地對網(wǎng)表進(jìn)行處理。
?????????ASYNEC_REG的值為布爾型,即只能為TRUE或FALSE,默認(rèn)值為FALSE,
????????代碼文件使用模板:???(* ASYNC_REG="true" *) reg? sync_regs;
????????XDC使用模板:set_property? ASYNC_REG? TRUE [get_cells sync_regs]
二、示例
? ? ? ? 2.1 工程說明
????????設(shè)計(jì)工程中有三個寄存器reg1,reg2,Q,reg2和Q具有相同的時鐘,reg1和reg2時鐘來源不同,reg1的輸出到reg2,reg2輸出到Q,即reg1->reg2->Q,對reg2和Q設(shè)置ASYNC_REG。
????????2.2 工程代碼
module async_reg(src_clk,des_clk,ce,d,Q);
input src_clk, des_clk,ce,d;
output Q;
reg reg1;
(*ASYNC_REG="true"*)reg Q,reg2;
always@(posedge src_clk)
begin
? ? if(!ce)
? ? ? ? reg1<=0;
? ? else
? ? ? ? reg1<=d;
end
always@(posedge des_clk)
begin
? ? if(!ce)
? ? ? ? reg2<=0;
? ? else
? ? ? ? reg2<=reg1;
end
always@(posedge des_clk)
begin
? ? if(!ce)
? ? ? ? Q<=0;
? ? else
? ? ? ? Q<=reg2;
end
endmodule
????????2.3 生效確認(rèn)
????????在TCL console中使用tcl命令驗(yàn)證屬性是否標(biāo)記,執(zhí)行如下兩條命令
set register [get_cells -hierarchical -filter "REF_NAME==FDRE"]? //獲取所有的寄存器
get_property ASYNC_REG $register? //獲取具有屬性ASYNC_REG的寄存器,
????????結(jié)果如下圖,第一條命令執(zhí)行后得到三個寄存器Q_reg reg1_reg reg2_reg,
第二條命令執(zhí)行后可知只有第1、3個寄存器Q_reg,reg2_reg具有屬性ASYNC_REG,符合設(shè)計(jì)要求。

????????