概述
對設(shè)計中的信號施加DONT_TOUCH約束,可以避免這些信號在綜合編譯過程中被優(yōu)化掉。例如,有些信號節(jié)點在綜合或布局布線編譯過程中可能會被優(yōu)化掉,但是我們希望在后期調(diào)試過程中能夠監(jiān)控到這些信號,此時就可以使用DONT_TOUCH約束達(dá)到保留這些信號的目的。又如,有時在設(shè)計中會對一些高扇出的信號進(jìn)行手動的邏輯復(fù)制,也可以使用DONT_TOUCH約束避免它們被優(yōu)化掉。
工程實踐
下面有一個簡單的例子,看看DONT_TOUCH約束如何使用。原始代碼如下,目前只有一個寄存器vga_valid,它對應(yīng)了adv7123_blank_n、vga_r、vga_g、vga_b等信號的輸出。
reg vga_valid;
always @(posedge clk or negedge rst_n)
vga_valid<= vga_origin_vld;??
assign adv7123_blank_n = vga_valid;
assign vga_r = vga_valid ? vga_rdb:5'd0;
assign vga_g = vga_valid ? vga_gdb:6'd0;
assign vga_b = vga_valid ? vga_bdb:5'd0;
編譯工程后,點擊RunImplementation,打開實現(xiàn)界面。
點擊菜單Reports à Report High Fanout Nets。
如圖,設(shè)定From cells為[get_cells-hierarchical "*vga_valid*"],即查看所有帶vga_valid字符的信號。
此時,可以看到當(dāng)前vga_valid信號的扇出為17。
這個例子中,vga_valid的扇出為,其實并不多。但是在實際工程中,我們可以通過類似的方式查看到設(shè)計中高扇出的關(guān)鍵信號節(jié)點。然后,我們會如下在代碼中,對這樣的信號做邏輯復(fù)制。意圖減少單個信號的扇出。
reg vga_valid1;
reg vga_valid2;
always @(posedge clk or negedge rst_n)
vga_valid1<= vga_origin_vld;
always @(posedge clk or negedge rst_n)
vga_valid2<= vga_origin_vld;
assign adv7123_blank_n = vga_valid1;
assign vga_r = vga_valid2 ? vga_rdb:5'd0;
assign vga_g = vga_valid1 ? vga_gdb:6'd0;
assign vga_b = vga_valid2 ? vga_bdb:5'd0;
如圖,可惜我們做過邏輯復(fù)制的代碼,最終綜合實現(xiàn)下來,并沒有減少扇出,和原始代碼實現(xiàn)的效果完全一樣。怎么回事?綜合工具太聰明了,識別了你這個小伎倆,為了減少設(shè)計資源消耗,綜合工具默認(rèn)優(yōu)化掉了代碼中新增加的vga_valid2。
但是,工具并不懂我們真正的心思,怎么辦?此時DONT_TOUCH約束就派上用場了。如下,在不希望被綜合優(yōu)化的2個寄存器前面,加上(*dont_touch ="true"*)的語法。
(*dont_touch = "true"*) reg vga_valid1;
(*dont_touch = "true"*) reg vga_valid2;
重新編譯后,我們看到,代碼生效了。vga_valid1和vga_valid2分擔(dān)了原本vga_valid的扇出。
-
寄存器
+關(guān)注
關(guān)注
31文章
5250瀏覽量
119195 -
網(wǎng)表
+關(guān)注
關(guān)注
0文章
14瀏覽量
7608
原文標(biāo)題:物理約束實踐:網(wǎng)表約束DONT_TOUCH
文章出處:【微信號:FPGA快樂學(xué)習(xí),微信公眾號:FPGA快樂學(xué)習(xí)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論