使用邏輯分析儀時(shí)如何防止reg_wire型信號(hào)被優(yōu)化掉
隨著FPGA設(shè)計(jì)復(fù)雜程度越來(lái)越高,芯片內(nèi)部邏輯分析功能顯得越來(lái)越重要。硬件層次上的邏輯分析儀價(jià)格十分昂貴,而且操作比較復(fù)雜。目前,F(xiàn)PGA芯片的兩大供應(yīng)商都為自己的FPGA芯片提供了軟件層面上的邏輯分析儀,可以幫助我們?cè)诰€(xiàn)分析芯片內(nèi)部邏輯。而且操作簡(jiǎn)單方便。但是往往因?yàn)槟承┰颍行?strong>信號(hào)在綜合的時(shí)候就會(huì)被優(yōu)化掉,就可能會(huì)導(dǎo)致我們的設(shè)計(jì)失敗,當(dāng)然在為邏輯分析儀添加觀(guān)察信號(hào)的時(shí)候也無(wú)法找到該信號(hào)。從而對(duì)設(shè)計(jì)、調(diào)試人員的工作帶來(lái)一定的不便。下面就分別以Xilinx公司的邏輯分析儀ChipScope和Altera公司的SignalTap做以下總結(jié):
一、使用Xilinx公司的ChipScope使用ChipScope觀(guān)察芯片內(nèi)部的信號(hào)的之前先要在把需要觀(guān)察的信號(hào)添加到ChipScope信號(hào)觀(guān)察列表當(dāng)中。也就是說(shuō),我們必須能夠在綜合的網(wǎng)表文件中找到相應(yīng)的信號(hào)。如果是使用XST綜合的話(huà),最好保留芯片內(nèi)部結(jié)構(gòu)的層次,這樣就可以在相應(yīng)的子模塊查找需要觀(guān)察的信號(hào)。默認(rèn)情況下,Chipscope只能觀(guān)察reg類(lèi)型的信號(hào)。但是通過(guò)設(shè)置屬性也是可以觀(guān)察wire型信號(hào)的。使用不同的綜合工具需要添加的屬性也不一樣。
1、使用XST綜合。(1)對(duì)于reg型信號(hào),如果被ISE優(yōu)化掉,一般有可以把這個(gè)信號(hào)和其他沒(méi)有被優(yōu)化的信號(hào)進(jìn)行“與”、“或”等操作。這樣就可以達(dá)到觀(guān)察信號(hào)的目的。
(2)對(duì)于wire型號(hào),對(duì)于ISE12.3以后的版本,XST綜合,以Spartan3為例,可以使用(* KEEP="TRUE"*) wire [15:0] CPLD_ _AD;這樣就可以在查找信號(hào)的信號(hào)找到wire類(lèi)型的CPLD_ _AD信號(hào)進(jìn)行觀(guān)察。
2、使用Synplify Pro綜合Synplify Pro對(duì)wire、reg類(lèi)型的信號(hào)有著不同的綜合屬性。
(1) 對(duì)于wire型信號(hào),使用/* synthesis syn_keep=1 */綜合屬性,例如下面的語(yǔ)句:
wire[7:0]data_in/*synthesissyn_keep=1*/;
(2) 對(duì)于reg型信號(hào),使用/* synthesis preserve = 1 */綜合屬性,例如下面的語(yǔ)句:
reg[7:0]data_in/*synthesispreserve=1*/;
二、使用Altera公司的SignalTap
1、使用Altera自帶的綜合器綜合Altera自帶的綜合器為了防止某些信號(hào)綜合器優(yōu)化掉,也有自己的一套綜合約束屬性。
(1)對(duì)于reg型信號(hào),為了防止Altera自帶綜合器將其優(yōu)化掉,可以添加noprune屬性。這樣就可以防止某些寄存器信號(hào)被優(yōu)化掉。也可以使用/*synthesis noprune*/綜合屬性。
`include"define.v"moduleSignalTap_test( Clk, Rst, Cnt )/*synthesisnoprune*/;inputwireClk;inputwireRst;outputreg[7:0]Cnt;always@(posedgeClkorposedgeRst)begin if(Rst==1'b1) Cnt<=8'h0; else Cnt<=#`ULDYCnt+1'b1;endendmodule
如上例(假設(shè)Cnt信號(hào)會(huì)被優(yōu)化掉),這樣添加綜合屬性之后,整個(gè)module的reg信號(hào)都不會(huì)被優(yōu)化掉。
跟reg相關(guān)的綜合屬性,除了/*synthesis noprune*/可用,還有一個(gè)/*synthesis preserve*/可用
二者的差別在于:
/*synthesis noprune*/ 避免Quartus II優(yōu)化掉output 型的reg信號(hào)。
/*synthesis preserve*/ 避免Quartus II把reg信號(hào)當(dāng)成VCC或者GND等常數(shù)
同時(shí)單獨(dú)的reg信號(hào)也可以: (*preserve*) reg [3:0] cnt;防止被優(yōu)化掉。
(2) 對(duì)于wire類(lèi)型的信號(hào)
對(duì)于wire型信號(hào)來(lái)說(shuō),要想觀(guān)察此類(lèi)信號(hào),Altera綜合器提供了/*synthesis keep*/ 綜合屬性。如 wire [7:0] Cnt /*synthesis keep*/; 對(duì)于Quartus II 9.0以后的版本也可以使用(“keep”) wire [7:0] Cnt ;的寫(xiě)法。
此外,/*synthesis keep*/也支持對(duì)reg型信號(hào),使用它也可以防止reg型信號(hào)被優(yōu)化掉。但是也有可能出現(xiàn)這樣的情況,有的信號(hào)即使經(jīng)過(guò)此處理,仍然會(huì)被綜合工具優(yōu)化掉,致使無(wú)法找到它。這個(gè)時(shí)候就需要對(duì)其使用“測(cè)試屬性”,可以加入probe_port屬性,把這兩個(gè)屬性結(jié)合在一起,即就是:
( *synthesis, probe_port,keep *) 即可,這種方法同時(shí)適應(yīng)于wire和reg型信號(hào)類(lèi)型。
2、使用Synplify Pro綜合使用Synplify Pro綜合時(shí)防止信號(hào)被優(yōu)化掉的方法和使用Xilinx公司 ChipScope使用Synplify Pro綜合時(shí)添加的綜合約束一樣,因?yàn)镾ynplify Pro是專(zhuān)業(yè)的綜合廠(chǎng)商,所以對(duì)主流的FPGA廠(chǎng)商都支持。
三、總結(jié)1、以上的方法也不一定是全部都可以使用,有時(shí)候因?yàn)榘姹静粚?duì)應(yīng)就會(huì)導(dǎo)致信號(hào)依然會(huì)被優(yōu)化掉。不過(guò)經(jīng)過(guò)輪詢(xún)之后發(fā)現(xiàn),ISE 12.3以后的版本、Quartus II 9.0之后的版本、Synplify Pro 9.0.1以后的版本都可以使用。
2、一般情況下,信號(hào)經(jīng)常被優(yōu)化掉,還是與代碼風(fēng)格或者邏輯設(shè)計(jì)有冗余有關(guān)的,所以還是應(yīng)該盡量提供代碼質(zhì)量。在不能解決的時(shí)候再添加綜合約束。