來源:5.防止FPGA設(shè)計中綜合后的信號被優(yōu)化
隨著FPGA設(shè)計復(fù)雜程度越來越高特幔,芯片內(nèi)部邏輯分析功能顯得越來越重要署隘。硬件層次上的邏輯分析儀價格十分昂貴蓬戚,而且操作比較復(fù)雜。目前椰苟,F(xiàn)PGA芯片的兩大供應(yīng)商都為自己的FPGA芯片提供了軟件層面上的邏輯分析儀抑月,可以幫助我們在線分析芯片內(nèi)部邏輯。而且操作簡單方便舆蝴。但是往往因?yàn)槟承┰颍?strong>有些信號在綜合的時候就會被優(yōu)化掉谦絮,就可能會導(dǎo)致我們的設(shè)計失敗,當(dāng)然在為邏輯分析儀添加觀察信號的時候也無法找到該信號洁仗。從而對設(shè)計挨稿、調(diào)試人員的工作帶來一定的不便。下面就分別以Xilinx公司的邏輯分析儀ChipScope和Altera公司的SignalTap做以下總結(jié):
一京痢、使用Xilinx公司的ChipScope
使用ChipScope觀察芯片內(nèi)部的信號之前,先要把需要觀察的信號添加到ChipScope信號觀察列表當(dāng)中篷店。也就是說祭椰,我們必須能夠在綜合的網(wǎng)表文件中找到相應(yīng)的信號。如果是使用XST綜合的話疲陕,最好保留芯片內(nèi)部結(jié)構(gòu)的層次方淤,這樣就可以在相應(yīng)的子模塊查找需要觀察的信號。默認(rèn)情況下蹄殃,Chipscope只能觀察reg類型的信號携茂。但是通過設(shè)置屬性也是可以觀察wire型信號的。使用不同的綜合工具需要添加的屬性也不一樣诅岩。
-
1讳苦、使用XST綜合
在ChipScope中添加一些引腳的信號带膜,但列表中并沒有顯示,原因是綜合的地方?jīng)]設(shè)置好鸳谜,應(yīng)該將XST的屬性設(shè)置成如下:
Synthesize - XST 右鍵 Process Properties..膝藕,Synthesis Options 內(nèi)設(shè)置 keep hierarchy 處為 YES
(1) 對于reg型信號,如果被ISE優(yōu)化掉咐扭,一般可以把這個信號和其他沒有被優(yōu)化的信號進(jìn)行“與”芭挽、“或”等操作。這樣就可以達(dá)到觀察信號的目的蝗肪。
(2)對于wire型號袜爪,對于ISE12.3以后的版本,XST綜合薛闪,以Spartan3為例辛馆,可以使用
(* KEEP="TRUE"*) wire [15:0] CPLD_ _AD;
這樣就可以在查找信號的信號找到wire類型的CPLD_ _AD信號進(jìn)行觀察。
-
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自帶的綜合器為了防止某些信號綜合器優(yōu)化掉硕并,也有自己的一套綜合約束屬性法焰。
(1)對于reg型信號,為了防止Altera自帶綜合器將其優(yōu)化掉倔毙,可以添加noprune屬性埃仪。這樣就可以防止某些寄存器信號被優(yōu)化掉。也可以使用/*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
如上例(假設(shè)Cnt信號會被優(yōu)化掉)卵蛉,這樣添加綜合屬性之后,整個module的reg信號都不會被優(yōu)化掉么库。
需要注意的是:描述綜合屬性的語句一定要添加在“;”前面傻丝。
跟reg相關(guān)的綜合屬性,除了/*synthesis noprune*/
可用诉儒,還有一個/*synthesis preserve*/
可用葡缰。二者的差別在于:
-
/*synthesis noprune*/
避免Quartus II優(yōu)化掉output 型的reg信號。 -
/*synthesis preserve*/
避免Quartus II把reg信號當(dāng)成VCC或者GND等常數(shù)。
同時單獨(dú)的reg信號也可以: (*preserve*) reg [3:0] cnt;
防止被優(yōu)化掉泛释。
(2)對于wire型信號來說滤愕,要想觀察此類信號,Altera綜合器提供了/*synthesis keep*/
綜合屬性胁澳。如
wire [7:0] Cnt /*synthesis keep*/;
對于Quartus II 9.0以后的版本也可以使用(“keep”) wire [7:0] Cnt ;
的寫法该互。
此外,/*synthesis keep*/
也支持對reg型信號韭畸,使用它也可以防止reg型信號被優(yōu)化掉宇智。
但是也有可能出現(xiàn)這樣的情況,有的信號即使經(jīng)過此處理胰丁,仍然會被綜合工具優(yōu)化掉随橘,致使無法找到它。這個時候就需要對其使用“測試屬性”锦庸,可以加入probe_port
屬性机蔗,把這兩個屬性結(jié)合在一起,即就是:
( *synthesis, probe_port,keep *)
即可甘萧,這種方法同時適應(yīng)于wire和reg型信號類型萝嘁。
-
2、使用Synplify Pro綜合
使用Synplify Pro綜合時防止信號被優(yōu)化掉的方法和使用Xilinx公司 ChipScope使用Synplify Pro綜合時添加的綜合約束一樣扬卷,因?yàn)镾ynplify Pro是專業(yè)的綜合廠商牙言,所以對主流的FPGA廠商都支持。
三怪得、總結(jié)
1咱枉、以上的方法也不一定全部都可以使用,有時候因?yàn)榘姹静粚?yīng)就會導(dǎo)致信號依然會被優(yōu)化掉徒恋。不過經(jīng)過輪詢之后發(fā)現(xiàn)蚕断,ISE 12.3以后的版本、Quartus II 9.0之后的版本入挣、Synplify Pro 9.0.1以后的版本都可以使用亿乳。
2、一般情況下径筏,信號經(jīng)常被優(yōu)化掉风皿,還是與代碼風(fēng)格或者邏輯設(shè)計有冗余有關(guān)的,所以還是應(yīng)該盡量提高代碼質(zhì)量匠璧。在不能解決的時候再添加綜合約束。