概述
對設計中的信號施加DONT_TOUCH約束,可以避免這些信號在綜合編譯過程中被優化掉。例如,有些信號節點在綜合或布局布線編譯過程中可能會被優化掉,但是我們希望在后期調試過程中能夠監控到這些信號,此時就可以使用DONT_TOUCH約束達到保留這些信號的目的。又如,有時在設計中會對一些高扇出的信號進行手動的邏輯復制,也可以使用DONT_TOUCH約束避免它們被優化掉。
工程實踐
下面有一個簡單的例子,看看DONT_TOUCH約束如何使用。原始代碼如下,目前只有一個寄存器vga_valid,它對應了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,打開實現界面。
點擊菜單Reports à Report High Fanout Nets。
如圖,設定From cells為[get_cells-hierarchical "*vga_valid*"],即查看所有帶vga_valid字符的信號。
此時,可以看到當前vga_valid信號的扇出為17。
這個例子中,vga_valid的扇出為,其實并不多。但是在實際工程中,我們可以通過類似的方式查看到設計中高扇出的關鍵信號節點。然后,我們會如下在代碼中,對這樣的信號做邏輯復制。意圖減少單個信號的扇出。
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;
如圖,可惜我們做過邏輯復制的代碼,最終綜合實現下來,并沒有減少扇出,和原始代碼實現的效果完全一樣。怎么回事?綜合工具太聰明了,識別了你這個小伎倆,為了減少設計資源消耗,綜合工具默認優化掉了代碼中新增加的vga_valid2。
但是,工具并不懂我們真正的心思,怎么辦?此時DONT_TOUCH約束就派上用場了。如下,在不希望被綜合優化的2個寄存器前面,加上(*dont_touch ="true"*)的語法。
(*dont_touch = "true"*) reg vga_valid1;
(*dont_touch = "true"*) reg vga_valid2;
重新編譯后,我們看到,代碼生效了。vga_valid1和vga_valid2分擔了原本vga_valid的扇出。
-
寄存器
+關注
關注
31文章
5343瀏覽量
120419 -
網表
+關注
關注
0文章
15瀏覽量
7655
原文標題:物理約束實踐:網表約束DONT_TOUCH
文章出處:【微信號:FPGA快樂學習,微信公眾號:FPGA快樂學習】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論