SignalTap II Logic Analyzer 無法觀測到信號?


在Quartus SignalTap 工具中加入信號,發現加入的信號變成紅色,如圖所示的data_slave[7..0]

這樣的信號是沒有辦法觀測的,不會根據SignalTap 的Clock和Trigger進行更新,原因是Synthesis過程將它省略,

添加綜合選項(Synthesis Attribute)可以讓綜合器保留這些對頂層模塊輸入輸出沒有幫助的信號,常用的有:

wire[7:0] cnt/*synthesis keep*/;  // Keep the Entity of Wire
reg signed[11:0] corr_i_out/*synthesis preserve*/; // Keep the Entity of Register

實際上,對於組合邏輯的輸出可以用keep,而時序邏輯塊的輸出信號常用preserve選項。

 

同時,紅色的無效SignalTap信號會影響SignalTap中其他的信號。這樣的空頭支票放入SignalTap組件之中,很大概率會影響系統的時序,比如,使得其他待觀測的信號全部觀察不到了!

在設計調試的時候一定要取消這樣的“空頭支票”。

 

*****************************************************************************

*****************************************************************************

************ Quartus中,綜合選項preserve和noprune選項的差別:

在Quartus模板代碼插入工具中,有綜合選項的選項,Altera給出的形式和說明分別如下:

// Prevents Quartus Prime from optimizing away a register.
// Apply the attribute to the variable declaration for an object that infers a register.

(* preserve *) <variable_declaration>;
(* preserve *) module <module_name>(...);
// Prevents Quartus Prime from removing or optimizing a fanout free register.
// Apply the attribute to the variable declaration for an object that infers a register.

(* noprune *)  <variable_declaration>;

在幫助文檔中,有更詳細的解釋,關鍵點總結如下:

(1)preserve

preserve屬性防止Quartus在“分析與綜合”過程中縮減或者刪除那個指定的寄存器,這個綜合屬性可以將寄存器預留給仿真器或者SignalTap,方便我們進行觀測。preserve屬性還可以在設計初期防止寄存器被優化消失,比如寄存器輸入總是賦“邏輯1”這樣的常量,“分析-綜合”器會把這個寄存器的特性認為是“不關心上電后的初值”,進而綜合(Synthesis)的結果將這個寄存器省略(消除)了。如果加入preserve這個選項就會使這個寄存器實體存在。

另外,preserve屬性不能阻止綜合器優化那些重復(duplication)或者分組捆綁(pack)的寄存器。重復和分組捆綁的詳細情況保存在Analysis& Synthesis Netlist Optimizations和Fitter Netlist Optimizations報告中。更加詳盡的寄存器綜合選項請查看Netlist Optimizations選項。

同時,preserve選項有兩個重要的局限性:

如果寄存器有preserve屬性,那么它不會被綜合成為狀態機的元素。(就是說,有可能破壞綜合器對於狀態機的合成)

preserve屬性不能防止綜合器刪除那些無扇出的寄存器。(對於無扇出的寄存器,請用noprune選項進行保留)

Verilog 2001規范中,可以這樣賦予preserve屬性:

(*preserve*) reg dout_reg;

還可以這樣進行屬性賦予:

reg dout_reg/* synthesis preserve */;

在定義module時,也可以給這個模塊賦予preserve屬性,這樣下來,模塊中的所有reg都有了preserve的綜合屬性,形式如下:

(* preserve *) module my_block(rst, clk, ...);

(2)noprune

noprune大概是no prune(不要修剪)的緊湊寫法。該屬性阻止綜合器刪除那些不會直接、間接驅動頂層模塊output(或者inout)端口的寄存器(比如說無扇出的寄存器)。noprune屬性與preserve屬性不同,preserve屬性會讓綜合器保留那些本可以簡化成常量邏輯的寄存器,還有那些可以合並在一起的寄存器(邏輯值共用一個源)。

在很多情況下,我們作為設計者都想使用這些無扇出(Fan-out Free)的寄存器。比如:這個寄存器在進一步的設計中會被用來驅動一些電路(預留位置);用來送入SignalTap進行觀察調試;用來驅動SignalProbe引腳。

實際上,Quartus編譯器將noprune屬性翻譯為Preserve Fan-out Free Register Node選項交給綜合器進行處理。

在Verilog 2001中的用法如法炮制:

(* noprune *) reg dout_reg;

reg dout_reg/* synthesis noprune */; 

 

*************************************************************************************************************************

*************************************************************************************************************************

使用經驗:

(1)有的時候,用noprune不能觀測到,信號在SignalTap中為紅的。這個時候用preserve屬性,可以將信號觀測到,但是原理圖上失去了狀態機。

(2)有的時候,給狀態機的stat變量用preserve屬性標注,這樣會使得State Machine Viewer中失去該狀態機,stat變量可以被觀測到,但是系統工作不正常(???)。這時將其他內部reg用noprune屬性標注,觀測和功能都正常了。(什么原因?!?!)


免責聲明!

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



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