導航:首頁 > 源碼編譯 > ise寄存器如何不被編譯器優化

ise寄存器如何不被編譯器優化

發布時間:2022-11-14 01:06:26

1. Xilinx ISE 編譯時,place & route 很慢.

個人看法,有兩種可能:
1. 你的工程佔用資源較多,隨著資源的消耗,如果工程很大,ISE需要反復將之前布線好的部分進行優化,以騰出空間給後面的邏輯,所以越到後來布通所花費的時間就越長;
2. 你的約束中有較為苛刻或是不合理的時序約束,ISE需要花大量的優化計算去滿足你的約束。
歡迎討論。

2. ISE 綜合時 模塊為什麼會被優化掉是程序設計的問題嗎

一般模塊被優化掉是沒有模塊的沒有輸入信號,我覺得你應該在你模塊的輸入信號里仔細檢查是否有關鍵的信號沒有被驅動;尤其像時鍾信號、復位信號等;代碼還要你自己好好檢查啊

3. 如果聲明的寄存器變數過多,超過機器可用的寄存器是如何處理的

寄存器只是用來做中轉的,不要把它當成普通變數來使用。不要聲明那麼多,而且大多數編譯器對寄存器變數只是一個參考,寄存器不夠時編譯器會把寄存器變數處理成普通變數,這時寄存器變數已經意義不大。實際上現在很多編譯器在優化時都會自動識別出那些頻繁使用的變數,會把這些頻繁使用的變數優化成寄存器變數。

4. 如何防止寄存器被優化掉

Verilog里也可以加keep屬性的
lycxy521 (2010-11-01 21:26:04)
謝謝分享,最近正在學,希望有幫助
wangbo19852008 (2011-9-26 16:47:42)
注意:人家問的是在ISE的XST綜合工具,你們回答的都是在QII的綜合工具或者Synplify綜合工具中的防止寄存器優化的約束,我試了就沒一個好用的,悲劇,看清楚再回答啊!
Fei_Fly (2011-9-26 17:50:59)
在這個BUF兩端的信號線上加上下面的屬性(Verilog HDL版本): wire bufin /* synthesis syn_keep=1 xc_props="X" */; 具體解釋: 1、syn_keep=1就是保留這個信號線,是它成為一個instance(synplify的),然後就可以對它添加XILINX的約束屬性; 2、xc_props=「」是synplify為XILINX保留留的約束屬性,可以透傳到ISE的實現中去,從而約束實現過程。 3、「X」屬性是在MAP時識別的KEEP屬性,如果用XST綜合就只需要在信號線的兩端加上X屬性就可以透傳到MAP中去。但是synplify並不能識別,因此需要通過以上的方法將X屬性透傳到MAP中去。 類似在 VHDL中也適用 attribute syn_keep of temp01 : signal is true; attribute xc_props of temp01 : signal is "X";
110500623 (2011-9-27 16:30:44)
可以試下(* KEEP="TRUE" *)

5. 如何提高ISE的編譯速度

如果你的cpu夠強你應該學會如何利用好它來加速你的代碼編譯速度,那麼你怎麼才能夠最大限度讓你的cpu發燒呢?

下面是一個對比:

比如我的cpu是i7 3770k,

編譯cocos2d-x的libcocos2d工程:

不優化:

1>Time Elapsed 00:01:35.25

優化後:

1>Time Elapsed 00:00:21.66

效果顯著!!!

參考網頁:

Visual Studio 2010中C++並行構建調優(1)
http://developer.51cto.com/art/201003/189235.htm

1>cl : Command line warning D9030: '/Gm' is incompatible with multiprocessing; ignoring /MP switch

解決辦法是:

Properties -> Configuration Properties -> C/C++ -> Code Generation -> Enable Minimal Rebuild -> No(/Gm-)

Properties -> Configuration Properties -> C/C++ -> Geneal -> Multi-processor Compilation -> Yes(/MP)

一些含義和拓展資料:

Enable minimal rebuild
通過保存關聯信息到.IDB文件,使編譯器只對最新類定義改動過的源文件進行重編譯,提高編譯速度

Enable Incremental Compilation
同樣通過.IDB文件保存的信息,只重編譯最新改動過的函數

/MP (Build with Multiple Processes)

http://msdn.microsoft.com/en-us/library/bb385193.aspx

/Gm (Enable Minimal Rebuild)

http://msdn.microsoft.com/en-us/library/kfz8ad09.aspx

6. ISE綜合(Verilog HDL),信號被優化問題

(1)所有綜合工具都支持的結構:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,mole,negedge,posedge,operators,output,parameter。
(2)所有綜合工具都不支持的結構:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
(3)有些工具支持有些工具不支持的結構:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。

建立可綜合模型的原則
要保證Verilog HDL賦值語句的可綜合性,在建模時應注意以下要點:
(1)不使用initial。
(2)不使用#10。
(3)不使用循環次數不確定的循環語句,如forever、while等。
(4)不使用用戶自定義原語(UDP元件)。
(5)盡量使用同步方式設計電路。
(6)除非是關鍵路徑的設計,一般不採用調用門級元件來描述設計的方法,建議採用行為語句來完成設計。
(7)用always過程塊描述組合邏輯,應在敏感信號列表中列出所有的輸入信號。
(8)所有的內部寄存器都應該能夠被復位,在使用FPGA實現設計時,應盡量使用器件的全局復位端作為系統總的復位。
(9)對時序邏輯描述和建模,應盡量使用非阻塞賦值方式。對組合邏輯描述和建模,既可以用阻塞賦值,也可以用非阻塞賦值。但在同一個過程塊中,最好不要同時用阻塞賦值和非阻塞賦值。
(10)不能在一個以上的always過程塊中對同一個變數賦值。而對同一個賦值對象不能既使用阻塞式賦值,又使用非阻塞式賦值。
(11)如果不打算把變數推導成鎖存器,那麼必須在if語句或case語句的所有條件分支中都對變數明確地賦值。
(12)避免混合使用上升沿和下降沿觸發的觸發器。
(13)同一個變數的賦值不能受多個時鍾控制,也不能受兩種不同的時鍾條件(或者不同的時鍾沿)控制。
(14)避免在case語句的分支項中使用x值或z值。

不能綜合的語句:

1、initial
只能在test bench中使用,不能綜合。(我用ISE9.1綜合時,有的簡單的initial也可以綜合,不知道為什麼)

2、events
event在同步test bench時更有用,不能綜合。

3、real
不支持real數據類型的綜合。

4、time
不支持time數據類型的綜合。

5、force 和release
不支持force和release的綜合。

6、assign 和deassign
不支持對reg 數據類型的assign或deassign進行綜合,支持對wire數據類型的assign或deassign進行綜合。

7、fork join
不可綜合,可以使用非塊語句達到同樣的效果。

8、primitives
支持門級原語的綜合,不支持非門級原語的綜合。

9、table
不支持UDP 和table的綜合。
10、敏感列表裡同時帶有posedge和negedge

如:always @(posedge clk or negedge clk) begin...end

這個always塊不可綜合。
11、同一個reg變數被多個always塊驅動

12、延時

以#開頭的延時不可綜合成硬體電路延時,綜合工具會忽略所有延時代碼,但不會報錯。

如:a=#10 b;

這里的#10是用於模擬時的延時,在綜合的時候綜合工具會忽略它。也就是說,在綜合的時候上式等同於a=b;

13、與X、Z的比較

可能會有人喜歡在條件表達式中把數據和X(或Z)進行比較,殊不知這是不可綜合的,綜合工具同樣會忽略。所以要確保信號只有兩個狀態:0或1。

7. 如何防止寄存器被優化掉

在這個BUF兩端的信號線上加上下面的屬性(Verilog HDL版本): wire bufin /* synthesis syn_keep=1 xc_props="X" */; 具體解釋:
1、syn_keep=1就是保留這個信號線,是它成為一個instance(synplify的),然後就可以對它添加XILINX的約束屬性;
2、xc_props=「」是synplify為XILINX保留留的約束屬性,可以透傳到ISE的實現中去,從而約束實現過程。
3、「X」屬性是在MAP時識別的KEEP屬性,如果用XST綜合就只需要在信號線的兩端加上X屬性就可以透傳到MAP中去。但是synplify並不能識別,因此需要通過以上的方法將X屬性透傳到MAP中去。類似在 VHDL中也適用 attribute syn_keep of temp01 : signal is true; attribute xc_props of temp01 : signal is "X";

8. 請教register unsigned long

寄存器變數 register,直接放到cpu中的變數 適合使用頻繁的變數,可以提高運行速度。只限於整形,字元型,指針型的局部變數。但一般CPU寄存器是有限的,申請多了是無效的自動降為自動變數,也就是普通變數(auto 預設)。不同的CPU,可用的寄存器變數時不同的。此外,有時使用寄存器變數或者說某些頻繁使用的變數被編譯器優化為寄存器變數,將會導致一些問題:我曾經就遇到過,例如說while(i < N){....}在調試時發現i >或 =N時依然在循環中,因為它沒有從內存中讀值,讀的是臟數據,而在調試時,調試器是讀的內存,程序運行時是讀的寄存器,所以程序看起來就是無法理解,後來在該變數前加上volatile以防止編譯器優化它為寄存器變數才解決問題。

9. 如何防止ISE綜合時信號不被優化掉

1.右鍵synthesis,在綜合選項里將keephierarchy選擇YES
,或者選擇soft(在綜合時保持層次,在實現時有利用ISE軟體自動進行優化),這樣有利於你從模塊中找到你想抓取的信號和信號名不被更改。
2.在Constraints
的問題。其實ISE的工程設置有「keep_hierarchy」。在程序裡面,也可以通過添加一些語句。如果是Verilog:
Place the Verilog constraint
immediately before the mole or instantiation.
Specify the Verilog constraint asfollows:
(* KEEP = 「{TRUE|FALSE |SOFT}」 *)
假如我們要觀察的一個信號cnt:reg[10:0]cnt;,那麼就按照
文檔中的介紹,要保持此信號不被綜合,則:(* KEEP =「TRUE」 *)reg[10:0]cnt ,或者(*keep=「true」 *)reg[10:0]cnt
這樣就可以實現ChipScope的觀察而不被優化掉了。類似的VHDL:
Declare the VHDL constraint asfollows:
attribute keep : string;
當然,這些都是針對ISE的綜合器XST的,如soft只有在XST里才可以使用,其它的綜合工具,可以參看相關的文檔,這些問題都有專業而又明確的說明。

10. 怎麼指定某段代碼不被編譯器優化掉

在C語言中, 某些語句,如:
int a;
a = 0;
a = 1;
a =2; 這個可能編譯器會把前面兩句給優惠掉, 這個如果 前面兩句也是必須要執行的, 可以把 int a 改成 volatile int a。
在編譯的時候, 編譯器可能會預測到某個變數的值, 就把中間的沒有必要的語句給優化掉,volatile 關鍵字就是告訴編譯器,不要做這樣的預測性優化, 按照文本代碼來翻譯。

閱讀全文

與ise寄存器如何不被編譯器優化相關的資料

熱點內容
python字元串中符號 瀏覽:785
python正則表達式貪婪模式 瀏覽:648
愛國精神指的是什麼app 瀏覽:408
壽司解壓系列全集視頻 瀏覽:913
物體三維重建演算法 瀏覽:984
fuli直播app哪個好 瀏覽:918
租辦公室用什麼app 瀏覽:106
醫師定期考核刷題app哪個好 瀏覽:338
導出dmp文件命令 瀏覽:288
手機百度網盤怎麼解壓密碼文件 瀏覽:585
索引重新編譯 瀏覽:606
命令與征服4免cd補丁完美版 瀏覽:428
kotlin編譯為native 瀏覽:142
家用編譯機 瀏覽:552
電子加密貨幣最新政策 瀏覽:382
androidcanvas撤銷 瀏覽:272
安卓手機怎麼把圖標全部下移 瀏覽:188
飢荒被伺服器踢出怎麼進 瀏覽:173
c編譯器哪款好 瀏覽:734
快手寶哥發明什麼app 瀏覽:823