3.20 トレースモード2による構造解析
3.20.1モードの違い
トレースモード2は、概念的に難しい説明を必要とします。Verilogが初めての方は、スキップして構いません。
Version 1.28からトレースモード2を追加しました。3.19トレースモードとの違いは、コンパイルの仕方と、trace_file.txtの生成の有無です。
トレースモード | トレースモード2 | |
コンパイラ | reg a; wire aw=a; awは、aの参照。awとしての実体(シミュレータ上の)はない。実体は、aそのもの。 awは、aにワイヤでつながっているイメージ。 |
reg a; wire aw=a; awは、aを入力とするドライバ出力。従って、バッファ出力という実体をシミュレータ上で持っている。 |
trace_file.txtの生成 | なし | あり |
シミュレーション速度、メモリ | 1とします。 | シミュレーション速度は、数 %ダウンします。 |
設定 | プロジェクトオプション トレースモードをCheckしてください。再コンパイル後に機能します。 |
プロジェクトオプション トレースモード2をCheckしてください。再コンパイル後に機能します。テキストファイルは、プロジェクトフォルダに生成されるのでプロジェクトを作成する必要があります。 |
このようにモードを追加したのは、assign aw=aと言う記述をコンパイラが意識しトレースできるようにするためです。このステートメントは、aの言い換え(Alias)とする見方と、トレースモード2のようにドライバとする見方と2種類の解釈が存在します。 トレースモード2では、awは、バッファの出力であって、バッファという実体が生じ、記述をトレースすることができます。しかし、Alias的な見方をする従来モードでは、バッファは、存在しないのでトレーサビリィティが落ちてしまします。ドライバが存在するとその分メモリとシミュレーションサイクルを必要とするので速度的には、落ちてしまいますが、トレーサビリティの観点からは、あえて最適化しない方がいいのです。
このモードの違いを端的に示すのは、次の例でしょう。
reg a; wire aw=a; initial begin a=1; $dsiplay("aw=%b",aw) end |
これを、二つのモードで走らせてみてください。
トレースモードでは、aw=1,トレースモード2では aw=xになります。トレースモード1では、awの実体は、aなので、a=1で代入されると、結果は、当然1になります。ところが、トレースモード2では、a=1というイベントまでは行きますが、 a=>
バッファ=> awという信号伝播パスの計算は、#時間文や、イベント文に遭遇しなかったので、されません。その結果未だ、xのままということになります。
Verilogの言語仕様では、どちらの結果も許されます。(シミュレータ依存しない書き方は、#10 $dispaly.. とでもすればいいです。この辺の詳細は、言語編のチュートリアルをご参照ください。)
3.20.2 手続き構文 と NET構文
言語解説編でも書きましたが、Verilogシミュレータ内では、2種類の違ったエンジンを切り替えながら、シミュレーションサイクルは進みます。2種類とは、C言語的手続き構文(Procedual)と回路的(NET、structural)構文です。 NET構文(assign文)では、旧来の回路シミュレータ的な動作をし、Procedual構文(always,initial)による動作では、C言語的仮想CPU動作が行われます。(少し脱線しますが、Verilogの目指したものは、この二つの融合だったのではないでしょうか? 回路の記述をするには、NETで、テストベンチを書くには、Procedualで、とするのは、自然な発想でしょう。 )
従って、Veritakトレースファイルは、Procedula/Strcutualそれぞれの解析結果を出力します。
それでは、実際の例で見ていきましょう。
3.20.3 タグファイルの開き方
サンプル フォルダの node_check_test.prjをLoad Project、Goします。 WaveformView信号のScope列をクリックし、ScopeTreeViewをだします。
選択されているSCOPEを右クリックするとメニューがでます。
開いたファイル(trace_file.txt)が、次です。Scopeの下にSINGAL:が続くのは、ScopeTreeViewと同じイメージです。
Note:
タグファイルは、Windowsの下の方に隠れている場合があります。そのときは、Windowsのツールバーが点滅しているので、そこから開いてみてください。
タグファイルには、下のように信号からも飛ぶことができます。
下は、開いたファイルです。タグファイルは、
が組になって記述されています。(テキストで記述されているので、VeriPad以外のEditorのタグジャンプ機能でも飛べますが、VeriPadが真価を発揮するのは、次です。)
上のどちらの行をDBLCLICKしても、当該箇所に飛んで生きます。このとき、SCOPEも一緒に飛ぶ(ScopeTreeViewと連動している)
ので、複数のインスタンス化をしているモジュールでも一意にツールチップをだすことができます。
Note:
SourceDriverの下のlint_test.sub3.subsub2.aregをDBLCLICKすると、ソースに飛ぶます。
このモジュール(subsubmodule)は、6個インスタンス化されていますが、ツールチップをだしてみると、タグファイル上のインスタンス信号になっていることがわかります。値は、WaveformView上T1カーソルの値です。カーソルがでていないとツールチップはでません。
Note:見てお分かりの通り、VeriPadの正規表現検索機能により飛んでいます。
インスタンス化のパラメータは、MSBですが、本インスタンスの場合、7になっていることが分かります。
なお、VeriPad上からも、タグファイルに飛ぶことができます。
3.20.4 タグファイルKEYWORDの意味
タグファイルでは、KEYWORDとして、SCOPE、SIGNAL、PROCEDUAL_LOADS、PROCEDUAL_DRIVERS、Aliases、SourceDriver、Drivers_FANOUTS、DECLARED、ASSIGNEDを定義しています。その意味は以下の通りです。
KEYWORD | 意味 | 例 |
SCOPE | スコープです。SCOPE:の下に複数のSIGNAL:が続きます。 | |
SIGNAL | 信号です。TreeViewで表示される信号すべてです。ただし、メモリはサポートしていません。 | |
PROCEDUAL_LOADS | 手続き構文で、右辺に記述される箇所です。 | initial a=b;// if(b);// a<=b; a<=b[i]; bのProcedual_LOADSは、上記全ステートメント |
PROCEDUAL_DRIVERS | 手続き構文で、左辺に記述される箇所です。 | 上記例aでは、全ステートメント |
Aliases | 別名です。親子モジュール間等、違う名前に変わっていても実体は、同じものをさしてる信号(s)です。 | |
SourceDriver | ドライブしている信号の宣言箇所です。 | reg a;//ここ wire c;//ここ assign c=a ^ b; |
Drivers_FANOUTS | Structualな記述で、右辺に出現する箇所です。 | 上記信号bでは、 assign c=a ^ b |
DECLARED | 宣言箇所です。 | 上記信号cでは、wire c; |
ASSIGNED | 代入されている箇所です。(reg宣言では、DECLAREDと同じになります。 | 上記信号cでは、 assign c=a ^ b; |
ResolverInputs | Resolverに入力されている記述箇所です。 |
次の記述は、WaveformViewの2番目の信号のタグファイルです。[0]は、LSB0で正規化した値のビットです。(Ex. wire [7:3]では、[3]が[0]に相当) LOADS/DRIVERSは、ビットに関係なく1ビットでも記述があったなら出力します。Alisas以下は、全ビットが同じ記述箇所なら、たとえば、[3:0]となりますが、本例の場合、ビット毎の箇所が違うので、ビット毎に展開されています。
SIGNAL: lint_test.res F:\regression_test\node_check_test.v(10):: PROCEDUAL_LOADS: lint_test F:\regression_test\node_check_test.v(58):: PROCEDUAL_DRIVERS: [0] Aliases: lint_test.res F:\regression_test\node_check_test.v(10):: ResolverInputs: lint_test F:\regression_test\node_check_test.v(46):: lint_test F:\regression_test\node_check_test.v(48):: lint_test F:\regression_test\node_check_test.v(49):: SourceDriver: DECLARED: lint_test.res F:\regression_test\node_check_test.v(10):: Drivers_FANOUTS: lint_test.res F:\regression_test\node_check_test.v(43):: |
Notes: