ISE - 如何防止信號被優化

 

在一個複雜的設計中,我們往往會抓大量的信號,而ISE14.7編譯代碼的時候會把一些有相同邏輯的信號給優化掉,這會導致我們在選擇信號的時候找不到想要抓取的信號,針對這種情況給大家提供兩個解決辦法。

 

方法一:

 

1、在你想要抓取的所有信號前面加上(*KEEP = “TRUE”*)

       (*KEEP = "TRUE"*)reg [3:0] R_cnt;

 

       Place the Verilog constraint immediately before the module or instantiation . 

       Specify the Verilog constraint as follows:

       (* KEEP = “{TRUE|FALSE |SOFT}” *)

 

2、選中Synthesize-XST,鼠標右鍵在彈出的菜單欄中選擇Process Properties...

 

 

 

3、Synthesis_Options中的-keep hierarchy是設置綜合後層次結構的。
如果選了這個,那麼綜合後MAP的時候就會保持你RTL設計的層次結構。
好處在於,設置之後,你用CHIPSCOPE調試時看到的層次結構跟你的設計是一樣的,找信號很方便。
缺點在於,xilinx 的工具就不能在設計層次間進行設計優化了。
所以,建議你設成 “soft”,意思就是綜合後保持層次結構,但是P&R的時候可以打破層次結構進行優化。

 

 

4、設置完畢以後重新綜合,然後重新在.cdc選擇要抓取的信號。

 

方法二:

 

上面一種方法根據我的經驗並不能100%的保證信號不被綜合掉,所以還有另外一種方法是寫一段冗餘邏輯把信號進行運算然後賦值給一個輸出,並把輸出引到頂層綁定一個空閒的管腳,這種情況我的處理方法是:

假設要抓取的信號是(*KEEP = "TRUE"*)reg [3:0] R_cnt;

1、定義1個輸出信號O_test;

       Output O_test;

2、把要抓取的信號各位相或然後賦值給O_test

       assign O_test = | R_cnt ;

       R_cnt前面的“|”表示把R_cnt的每一bit按位相或,這行代碼和

  assign O_test = R_cnt[0] | R_cnt[1] | R_cnt[2] ;

  綜合出來的邏輯是一模一樣的

3、把O_test引到頂層並在約束文件中分配一個空餘管腳

通過這種增加冗餘邏輯的方式,R_cnt信號一般不會被綜合掉,我自己在平時的使用中會先使用第一種方法,如果發現第一種方法還是把我想看的關鍵信號綜合掉了的話就採用第二種方法。

 

 

發佈了116 篇原創文章 · 獲贊 310 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章