5.防止FPGA設計中綜合后的信號被優化


     隨着FPGA設計復雜程度越來越高,芯片內部邏輯分析功能顯得越來越重要。硬件層次上的邏輯分析儀價格十分昂貴,而且操作比較復雜。目前,FPGA芯片的兩大供應商都為自己的FPGA芯片提供了軟件層面上的邏輯分析儀,可以幫助我們在線分析芯片內部邏輯。而且操作簡單方便。但是往往因為某些原因,有些信號在綜合的時候就會被優化掉,就可能會導致我們的設計失敗,當然在為邏輯分析儀添加觀察信號的時候也無法找到該信號。從而對設計、調試人員的工作帶來一定的不便。下面就分別以Xilinx公司的邏輯分析儀ChipScope和Altera公司的SignalTap做以下總結:

一、使用Xilinx公司的ChipScope

ChipScope中添加一些引腳的信號,但列表中並沒有顯示,原因是綜合的地方沒設置好,應該將XST的屬性設置成如下:keep hierarchy 處為YES

  使用ChipScope觀察芯片內部的信號的之前先要在把需要觀察的信號添加到ChipScope信號觀察列表當中。也就是說,我們必須能夠在綜合的網表文件中找到相應的信號。如果是使用XST綜合的話,最好保留芯片內部結構的層次,這樣就可以在相應的子模塊查找需要觀察的信號。默認情況下,Chipscope只能觀察reg類型的信號。但是通過設置屬性也是可以觀察wire型信號的。使用不同的綜合工具需要添加的屬性也不一樣。

1、使用XST綜合。

(1)對於reg型信號,如果被ISE優化掉,一般有可以把這個信號和其他沒有被優化的信號進行“與”、“或”等操作。這樣就可以達到觀察信號的目的。

(2)對於wire型號,對於ISE12.3以后的版本,XST綜合,以Spartan3為例,可以使用(* KEEP="TRUE"*) wire [15:0] CPLD_ _AD;這樣就可以在查找信號的信號找到wire類型的CPLD_ _AD信號進行觀察。再不行就用reg引出。

2、使用Synplify Pro綜合

也可參考:http://hi.baidu.com/vvbaba/item/94bb1b33af6c4b33b3c0c56e

Synplify Pro對wire、reg類型的信號有着不同的綜合屬性。

(1) 對於wire型信號,使用/* synthesis syn_keep=1 */綜合屬性,例如下面的語句:

1 wire  [7:0]  data_in  /* synthesis syn_keep=1 */;

(2) 對於reg型信號,使用/* synthesis preserve = 1 */綜合屬性,例如下面的語句:

1 reg  [7:0]   data_in  /* synthesis preserve = 1 */;

二、使用Altera公司的SignalTap

1、使用Altera自帶的綜合器綜合

Altera自帶的綜合器為了防止某些信號綜合器優化掉,也有自己的一套綜合約束屬性。

(1)對於reg型信號,為了防止Altera自帶綜合器將其優化掉,可以添加noprune屬性。這樣就可以防止某些寄存器信號被優化掉。也可以使用/*synthesis noprune*/綜合屬性。

01 `include "define.v"
02 module SignalTap_test(
03                 Clk     ,
04                 Rst     ,
05                 Cnt
06                 ) /*synthesis noprune*/ ;
07
08 input   wire        Clk ;
09 input   wire        Rst ;
10 output  reg [7:0]     Cnt ;
11 always@(posedge Clk or posedge Rst)
12 begin
13     if( Rst == 1'b1)
14         Cnt <= 8'h0;
15     else
16         Cnt <= #`ULDY Cnt + 1'b1;
17 end
18 endmodule

如上例(假設Cnt信號會被優化掉),這樣添加綜合屬性之后,整個module的reg信號都不會被優化掉。

跟reg相關的綜合屬性,除了/*synthesis noprune*/可用,還有一個/*synthesis preserve*/可用

二者的差別在於:

/*synthesis noprune*/ 避免Quartus II優化掉output 型的reg信號。

/*synthesis preserve*/ 避免Quartus II把reg信號當成VCC或者GND等常數

同時單獨的reg信號也可以: (*preserve*) reg [3:0] cnt;防止被優化掉。

(2) 對於wire類型的信號

對於wire型信號來說,要想觀察此類信號,Altera綜合器提供了/*synthesis keep*/ 綜合屬性。如 wire [7:0] Cnt /*synthesis keep*/; 對於Quartus II 9.0以后的版本也可以使用(“keep”) wire [7:0] Cnt ;的寫法。

此外,/*synthesis keep*/也支持對reg型信號,使用它也可以防止reg型信號被優化掉。但是也有可能出現這樣的情況,有的信號即使經過此處理,仍然會被綜合工具優化掉,致使無法找到它。這個時候就需要對其使用“測試屬性”,可以加入probe_port屬性,把這兩個屬性結合在一起,即就是:

( *synthesis, probe_port,keep *) 即可,這種方法同時適應於wire和reg型信號類型。

2、使用Synplify Pro綜合

使用Synplify Pro綜合時防止信號被優化掉的方法和使用Xilinx公司 ChipScope使用Synplify Pro綜合時添加的綜合約束一樣,因為Synplify Pro是專業的綜合廠商,所以對主流的FPGA廠商都支持。

三、總結

1、以上的方法也不一定是全部都可以使用,有時候因為版本不對應就會導致信號依然會被優化掉。不過經過輪詢之后發現,ISE 12.3以后的版本、Quartus II 9.0之后的版本、Synplify Pro 9.0.1以后的版本都可以使用。

2、一般情況下,信號經常被優化掉,還是與代碼風格或者邏輯設計有冗余有關的,所以還是應該盡量提供代碼質量。在不能解決的時候再添加綜合約束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM