[FPGA]如何使用SignalTap觀察wire與reg值

  1. 簡介
      在FPGA程序調試時,我們除了仿真還經常的會用到SignalTap進行板級調試,其可以真實有效的反應某些變量的變化,方便我們理解內在跳轉,方便Debug的運行。SignalTap需要制定時鐘,根據需求進行選擇,其採樣遵循奈奎斯特因採樣定律。

      我們在Debug中有時會經常遇到這樣的情況,在SignalTap中並不能觀察到所有的變量值。有些變量添加進入面板後會變紅,這就表示SignalTap抓取不到此數值。出現這一現象的原因是,綜合器在綜合時對一些變量進行了優化,所以就顯示不出來了。下文將針對兩種變量類型,wire和reg來分別講述如何讓其正常的顯示出來。這一部分的知識其實很簡單就是,基本思想就是使用綜合屬性Synthesis Attribute來控制綜合時的一些優化。

  2. wire型變量
      有關於變量的綜合屬性這一塊也可以在Quartus中的language template中查看。wire型變量的綜合屬性在Quartus 13中的template中顯示如下,其主要命令爲keep命令。Quartus軟件中給出了相關的介紹。

// Prevents Quartus II from minimizing or removing a particular
// signal net during combinational logic optimization. Apply
// the attribute to a net or variable declaration.

(* keep *) wire ;
(* keep *) reg ;
  其主要是爲了防止相關wire型變量在綜合時被優化或者是被省略。

  總結出wire型變量的綜合屬性配置方法有以下兩種。

a) (* keep * ) wire ;
b) wire /* synthesis keep */;
  其中,第一種寫法爲verilog-2001標準,第二種爲之前的標準,兩者可兼容。需要注意的是在採用第二種寫法時,註釋部分一定要寫在分號之前。

回到頂部
2. reg型變量
  reg 型變量的綜合屬性在Quartus 13中的template中顯示如下,其主要命令爲preserve和noprune命令。

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

(* preserve *) ;
(* preserve *) module (…);
  防止優化掉某一個reg型的部分或整體,可以用於某一個特定的變量也可以用於一個module中的所有reg型變量。

// Prevents Quartus II from removing or optimizing a fanout free register.
// Apply the attribute to the variable declaration for an object that infers
// a register.

(* noprune *) ;
  防止優化掉一個沒有扇出的reg型變量,有可能是無關量,有可能是中間量。

  總結出reg型變量綜合屬性配置的方法有以下幾種。

a) (* noprune *) reg ;
b) (* preserve *) reg ;
c) (* preserve *) module (…);
d) reg /* synthesis noprune */;
e) reg /* synthesis preserve */;
f) module (…)/* synthesis preserve */;
  同樣有兩種寫法,是兩種標準,讀者可任意選擇一款覺得方便的。同樣注意的是分號的位置,因爲比較重要多一多說幾遍。reg型有兩種,一般自行選擇,如果不行就換另外一種試試,總是會有一款ok的形式。

回到頂部
3. 總結
  有了這樣的可調綜合屬性,在進行板級調試時可以任意添加中間變量來觀察運行狀況,極大程度上方便了Debug,提高了效率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章