スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
webadm | 投稿日時: 2006-8-31 21:24 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
Veritak Verilog HDLシミュレータを使ってみる せっかくダウンロードした菅原システムのVeritak Verilog HDLシミュレータをVHDL->Verilog変換だけに使うのはもったいないのでシミュレーションにも使ってみた。
既にModelSimでシミュレーションしてあればテストベンチのVerilogソースコードがISEのプロジェクトディレクトリに自動生成されて.tfwというファイルタイプで存在するはずなのでそれを.vファイルタイプのものにコピーして保存する。 あとはVeritakのprojectを作成しテストベンチのVerilogソースとテスト対象のVerilog Moduleソースを順番にAddしてsave project。 あとはLoad Projectで作成したプロジェクトファイルを読み込めば一瞬のうちにコンパイルされてシミュレーション準備完了。 特になにもしなくてもGoとやればシミュレーションが開始されテストベンチの最初のブレークポイント($stop)で停止するはず。再度Goすればマニュアルで停止するまでシミュレーションが永遠に実行されることに。 Veritakはシミュレーションが高速なだけでなくすべての信号(モジュール内のreg変数やwire変数まで)波形をファイルに圧縮保存しているので他のシミュレータのように観測したい波形をあらかじめ観測した事象が発生する前に波形表示するように設定しないといけないという面倒な事は不要。目的の事象が発生した頃を見計らって波形表示指定すればファイルから取り出してそれまでの波形をすべて観測することができます。 これは特に問題の事象を見つけてからその前後での関連する他の内部信号を見る必要性が生じた時にシミュレーションをやり直す必要がないのがいいよね。 特に取り扱い説明とか読まなかったけどちょっとの間試行錯誤したらシミュレーションが簡単に出来てしまった。良くできている。 試用は16日間だけだけど実力を評価するには十分すぎる期間。 ライセンス料も1ライセンス$50からなので価格も大変良心的ですぐれたシミュレーターであると実感。 ちょっと気になるのがバグなのか仕様なのか波形を表示した後では現在値を除いて既に表示されているバス信号の値のフォーマットが変更できない点。最初から波形表示に挿入してフォーマットを設定しておけば以降は波形上にもそのフォーマットで表示されるんだけどね、後からは変更がきかないらしい。 |
webadm | 投稿日時: 2006-9-1 10:28 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
Post-Fit SimulationもVeritakでできた 基本的にVerilogを選択してModelSimをインストールしてあればModelSim用のPost-Fit Simulationモデルを借用してVeritakでシミュレーションを行うことは可能なはず。
実際にやってみたら簡単に出来た。 Behavioral Simulationとの違いは、veritakのprojectでシミュレーション対象のVerilog Moduleソース(calendar.v)の代わりにISEのnetgenがModelSimでのPost-Fit Simulation用に生成したtiming modelネットリストファイル(netgen/fit/calendar_timesim.v)を指定し、最後にModelSimのディレクトリにあるXilinx用ライブラリディレクトリ(Xilinx\verilog\src\simprims)をAdd lib dirします。topはBehavioral Simulationで用いたのと同じテストベンチのVerilogソースファイル。 今度はデバイス固有のレジスタ初期化が行われるのでBehavioral Simulationのときと違ってカウンターやレジスタは不定にはなりません。ちょっとModelSimと比べてバス形式の信号を表示するために信号名を一覧から探すのがやっかいですが基本的に同じ結果が得られます。やはりveritakの特徴である追加で信号を見たい時にシミュレーションをやり直す必要がないのは便利ですね。 それと表示信号を追加したあと表示フォーマットが変更できないと書いたのですが、ちゃんと出来ました。ちょっとveritak固有のユーザーインターフェースが癖があって慣れないためおかしな選択範囲が現れたりしてとまどいます。慣れの問題でしょうか。 シミュレーション速度は速度制限がかかるModelSimと比べると圧倒的に速いので長い期間のシミュレーションも躊躇なくできます。 |
webadm | 投稿日時: 2006-9-1 11:35 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
むtiming simulationになってない 波形をよく見たらタイミングシミュレーションになってないことが判明。
ModelSimだとテストベンチから与えた入力信号の変化から内部のレジスタの入力の変化に伝搬するのに遅延がはっきり反映されるのですがVeritakだとまったく遅延なく同時期に変化しています。 これだとsetup/hold time違反とかは見つけられない感じ。 Veritakはfunctional simulationしかできないのかな? ああよく見たらSpecify Section is ignored in Veritakって全部出てるじゃないか。 そういうことね。納得。 タイミングシミュレーションはModelSimじゃないとだめね。 |
webadm | 投稿日時: 2006-9-1 21:00 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
遅延シミュレーションはできた タイミングシミュレーションをModelSimと同水準ではできないけれども遅延を反映したシミュレーションはVeritakのプロジェクトを作成する場所を間違えたためできてなかった。
ISEで作成したプロジェクトのディレクトリ内にVeritakのプロジェクトファイルを作成しないとだめだった。それ以外の場所に作ると遅延が反映されない(遅延0でシミュレーションされる)。 こんどはしっかり外部SELECT信号の入力変化からプリセットされるべきレジスタの入力の変化まで遅延が生じているのがわかる。レジスタのCLKもCLOCK1Mから少し遅延して立ち上がっている。これなら使える。 チュートリアルを読んだら(ちょっとISEのバージョンが相当古い時に書かれたものらしい).SDFファイルとxxxx_timesim.vがあるディレクトリに作成と書かれているが現在のISE 8.2iではISEのプロジェクトファイルがある場所と同じ場所にしないといけないらしい。最初.sdfがあるnetgen/fitディレクトリ上に作ったらまったく遅延が反映されなかったという。 でもこのシミュレーションは実はプリセット入力信号のsetup時間が15nsしかとってない問題のあるテストベンチを使っているのでModelSimでやると一部のレジスタでhold time違反が検出される。 そこがVeritakの限界。実際にはhold time違反が起きていてもその通りに動いてしまう。確かに結果は意図したものとは違った誤った動きをしているのでそれはそれであっているのだが。 このケースでは最初にDAY[5]が正常にセットされず31日がセットされるはずが11日になってしまい次のクロックでたまたま31日になっているだけ。他のレジスタもビット落ちしてセットされかろうじて次のクロックでセットされているように見える。実際に動かしたらどうなるかは謎。ちょっとこれはやばいかもね。 |
webadm | 投稿日時: 2006-9-1 21:52 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
Veritakでもhold time違反は表示されていた 波形上には何も出てこないが、裏のウインドウに山ほどtiming check HOLD FAILSのメッセージが出ていた...orz
裏に出てても気づかないよこれ。 SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 153000ps <- 500ps: posedge test.UUT.YEAR<15>.REG.CLK ==> posedge test.UUT.YEAR<15>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 153000ps <- 500ps: posedge test.UUT.YEAR<12>.REG.CLK ==> posedge test.UUT.YEAR<12>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 253000ps <- 500ps: posedge test.UUT.YEAR<15>.REG.CLK ==> negedge test.UUT.YEAR<15>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 253000ps <- 500ps: posedge test.UUT.YEAR<8>.REG.CLK ==> negedge test.UUT.YEAR<8>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 253000ps <- 500ps: posedge test.UUT.YEAR<12>.REG.CLK ==> negedge test.UUT.YEAR<12>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 253000ps <- 500ps: posedge test.UUT.YEAR<11>.REG.CLK ==> negedge test.UUT.YEAR<11>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 353000ps <- 500ps: posedge test.UUT.YEAR<7>.REG.CLK ==> negedge test.UUT.YEAR<7>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 353000ps <- 500ps: posedge test.UUT.YEAR<3>.REG.CLK ==> negedge test.UUT.YEAR<3>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 353000ps <- 500ps: posedge test.UUT.YEAR<4>.REG.CLK ==> negedge test.UUT.YEAR<4>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 353000ps <- 500ps: posedge test.UUT.YEAR<0>.REG.CLK ==> negedge test.UUT.YEAR<0>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 453000ps <- 500ps: posedge test.UUT.MONTH<1>.REG.CLK ==> negedge test.UUT.MONTH<1>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 453000ps <- 500ps: posedge test.UUT.MONTH<4>.REG.CLK ==> negedge test.UUT.MONTH<4>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 554000ps <- 1500ps: posedge test.UUT.DAY<5>.REG.CLK ==> posedge test.UUT.DAY<5>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 653000ps <- 500ps: posedge test.UUT.HOUR<5>.REG.CLK ==> negedge test.UUT.HOUR<5>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 654000ps <- 1500ps: posedge test.UUT.DAY<5>.REG.CLK ==> negedge test.UUT.DAY<5>.REG.I こっち見ればいいのね。なんていうウインドウなんだろうレポート編集メニューからでないとコピー&ペーストができない。 またしてもあらぬいちゃもんを書いて終わるところだった。 |
webadm | 投稿日時: 2006-9-1 23:03 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
Veritakは意外にタイミング違反チェックが厳しい? 同じISEのPost-Fit Simulationモデルとライブラリを使ってタイミングシミュレーションをModelSimとVeritakでやって比較してみるとVeritakの方がかなり厳しくチェックしているような結果。
ModelSimでは最初のプリセット時の以下の3つしかでない。 # ** Error: C:/Xilinx/verilog/src/simprims/X_FF.v(94): $hold( posedge CLK:552500 ps, posedge I &&& (in_clk_enable1 == 1):554 ns, 3500 ps ); # Time: 554 ns Iteration: 7 Instance: /test/UUT/\DAY<5>.REG\ # ** Error: C:/Xilinx/verilog/src/simprims/X_FF.v(94): $hold( posedge CLK:752500 ps, posedge I &&& (in_clk_enable1 == 1):754 ns, 3500 ps ); # Time: 754 ns Iteration: 6 Instance: /test/UUT/\MINUTE<3>.REG\ # ** Error: C:/Xilinx/verilog/src/simprims/X_FF.v(95): $hold( posedge CLK:852500 ps, negedge I &&& (in_clk_enable1 == 1):854 ns, 3500 ps ); # Time: 854 ns Iteration: 6 Instance: /test/UUT/\MINUTE<3>.REG\ 実際に波形を見ると他のタイミングでもやばそうなヒゲが出ているのであるがレジスタ値が不定になってしまうためか以降は何もエラーが出ない。 Veritakはレジスタのクロックの立ち上がり前後の入力変化も微妙に検出してtiming check FAILSを表示している。 特にDAY[5]に関しては実際ModelSimでもやばいタイミングが2つ観測されるがModelSimでエラーになるのは最初の方だけ。Veritakは両方検出している。これもModelSimはレジスタ値が最初ので不定になるので以降はもうチェックしていないのかもしれないが。 SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 554000ps <- 1500ps: posedge test.UUT.DAY<5>.REG.CLK ==> posedge test.UUT.DAY<5>.REG.I SDF: timing check[0] HOLD[Spec.3500ps] FAILS at simtime 654000ps <- 1500ps: posedge test.UUT.DAY<5>.REG.CLK ==> negedge test.UUT.DAY<5>.REG.I それ以外のレジスタやカウンタレジスタに関しても確かにかなり入力にヒゲが出ているのでそれらがひっかかっている。 ある意味Veritakの方が厳密なのかも。でも波形だけ見てると気がつかないのが難点。 |
webadm | 投稿日時: 2006-9-2 0:42 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
新たな謎が ISEのXSTでの合成したネットリストには何故か16bit長なはずのdispcntレジスタが5bit分しか表示できない。dispcnt[4:0]というのが表示可能なバス信号としてリストに載っているがこれでは全然足らない。実際には最低でも511までカウントするので9bitは無いといけない。FFは実際16bit分ありその信号は個々に観測することができるがばらけている。
今まで気づきもしなかった。 実際にばらけたFFの出力dispcnt<?>.Qを見てみると9bit分がカウントアップしてall 1になったところで0に戻るというのを繰り返している。 dispcnt[4:0]というのはどっから来ているのだろうか? テストベンチを修正してsetup時間を長くすることによってModelSimで出ていたhold time違反は出なくなった。 でもVeritakの方は変わらずに同じ内容が同じ箇所で出ている。 よく両方の波形を見比べると微妙にヒゲの出ているタイミング関係が違っている。ModelSimの場合はVeritakでFAILSが出ているレジスタに関しては確かにヒゲが出ているがクロック立ち上がりから4ns後でありhold timeの3.5nsは侵していない。ところがVeritakの方はクロックの立ち上がりから0.5ns後に入力が0から1に変化しているので3.5nsのhold timeに違反している。 上がModelSimの波形、下がVeritakの波形。ヒゲの発生条件は同じだがカーソルでタイミング関係を測ってみるとCLK立ち上がりからのヒゲまでの間隔が1桁違っている。 この違いはどっから来るのだろう? またしても謎がつきない。 |
webadm | 投稿日時: 2006-9-2 3:51 |
Webmaster ![]() ![]() 登録日: 2004-11-7 居住地: 投稿: 3110 |
Coolrunner-IIだとどちらも問題なし Veritakでタイミング違反が消えないのはXC9500シリーズをターゲットにした場合だけでCoolrunner-IIの場合にはModelSim、Veritakどちらもまったく問題ない。
違いといえばModelSimは既にコンパイル済みのライブラリを使用しているのに対してVeritakはライブラリソースを毎回コンパイルしているという点ぐらいである。あとはシミュレーターの違いというしかない。 Coolrunner-IIのように高速でhold time仕様が大変短くてすむデバイスの場合は相当hold timeが短くて400psぐらいでも問題ないのかもしれない。 XC9500はISE 8.2iがサポートする一番低速なデバイスだけにかなりタイミング的には注意しないといけないのは確か。 たぶんCoolrunner-IIでは問題なく動くのだろう。似たようなヒゲは出ているけども。そもそもヒゲの原因は年月日時分秒のプリセットのためにかなり広範囲に渡ってnPRESET信号が配線されている関係で微妙なロジックハザードが発生するためと思われる。年月日時分秒のレジスタの入力ロジックツリーは大変大きい。実際nPRESETがHIGHになった以降はタイミング違反は起きない。 それにしても単純なバイナリカウンタであるcounter、dispcntでタイミング違反が起きるというのはやっぱりveritakのシミュレータに問題がある疑いはぬぐいきれない。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |