防止FPGA設計中綜合後的訊號被優化

weixin_33716557發表於2017-06-15

來源:5.防止FPGA設計中綜合後的訊號被優化

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


一、使用Xilinx公司的ChipScope

使用ChipScope觀察晶片內部的訊號之前,先要把需要觀察的訊號新增到ChipScope訊號觀察列表當中。也就是說,我們必須能夠在綜合的網表檔案中找到相應的訊號。如果是使用XST綜合的話,最好保留晶片內部結構的層次,這樣就可以在相應的子模組查詢需要觀察的訊號。預設情況下,Chipscope只能觀察reg型別的訊號。但是通過設定屬性也是可以觀察wire型訊號的。使用不同的綜合工具需要新增的屬性也不一樣。

  • 1、使用XST綜合
    在ChipScope中新增一些引腳的訊號,但列表中並沒有顯示,原因是綜合的地方沒設定好,應該將XST的屬性設定成如下:
    Synthesize - XST 右鍵 Process Properties..,Synthesis Options 內設定 keep hierarchy 處為 YES

    4176027-42495bb53d804ffd.png

    (1) 對於reg型訊號,如果被ISE優化掉,一般可以把這個訊號和其他沒有被優化的訊號進行“與”、“或”等操作。這樣就可以達到觀察訊號的目的。
    (2)對於wire型號,對於ISE12.3以後的版本,XST綜合,以Spartan3為例,可以使用

(* KEEP="TRUE"*) wire  [15:0]   CPLD_ _AD;

這樣就可以在查詢訊號的訊號找到wire型別的CPLD_ _AD訊號進行觀察。

  • 2、使用Synplify Pro綜合
    Synplify Pro對wire、reg型別的訊號有著不同的綜合屬性。
    (1)對於wire型訊號,使用/* synthesis syn_keep=1 */綜合屬性,例如下面的語句:
wire [7:0] data_in /* synthesis syn_keep=1 */;

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

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

二、使用Altera公司的SignalTap
  • 1、使用Altera自帶的綜合器綜合
    Altera自帶的綜合器為了防止某些訊號綜合器優化掉,也有自己的一套綜合約束屬性。
    (1)對於reg型訊號,為了防止Altera自帶綜合器將其優化掉,可以新增noprune屬性。這樣就可以防止某些暫存器訊號被優化掉。也可以使用/*synthesis noprune*/綜合屬性。
`include "define.v"
module SignalTap_test(
                Clk     ,
                Rst     ,
                Cnt                        
                ) /*synthesis noprune*/ ;

input   wire        Clk ;
input   wire        Rst ;
output  reg [7:0]     Cnt ;

always@(posedge Clk or posedge Rst)
begin
    if( Rst == 1'b1)
        Cnt <= 8'h0;
    else
        Cnt <= #`ULDY Cnt + 1'b1;
end

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型訊號來說,要想觀察此類訊號,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、一般情況下,訊號經常被優化掉,還是與程式碼風格或者邏輯設計有冗餘有關的,所以還是應該儘量提高程式碼質量。在不能解決的時候再新增綜合約束。

相關文章