1. 程式人生 > >verilog防綜合語句設定

verilog防綜合語句設定

我在XST綜合時,未接輸出埠的暫存器被優化掉了,
如何防止ISE綜合時你想抓取的訊號不被優化掉:

1.右鍵synthesis,在綜合選項裡將keep hierarchy選擇YES ,或者選擇soft(在綜合時保持層次,在實現時有利用ISE軟體自動進行優化),這樣有利於你從模組中找到你想抓取的訊號和訊號名不被更改。

2.在Constraints Guide中,有防止訊號被優化掉的說明。具體在X:\Xilinx\13.4\ISE_DS\ISE\doc\usenglish\isehelp資料夾下。裡面介紹瞭如何解決訊號被優化的問題。其實ISE的工程設定有“keep_hierarchy”。在程式裡面,也可以通過新增一些語句。如果是Verilog :

      Place the Verilog constraint immediately before the module or instantiation . 
      Specify the Verilog constraint as follows:
      (* 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 as follows:
     attribute keep : string;
    Specify the VHDL constraint as follows:
    attribute keep of signal_name: signal is “{TRUE|FALSE|SOFT}”;

當然,這些都是針對ISE的綜合器XST的,如soft只有在XST裡才可以使用,其它的綜合工具,可以參看相關的文件,這些問題都有專業而又明確的說明。

一、使用Xilinx公司的ChipScope
  使用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訊號進行觀察。
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 ;

[email protected](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型別的訊號
對於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廠商都支援。