Verilog,VHDL等のHW記述言語のシミュレータ
> 1
> 私の勝手な予想だと、AND,OR等をマシン語レベルのADDやSUB等に置き換えてシミュレ
> ートしてるのかと思っています。
HDLでは信号を4値とか9値で表現してますよね。ですから、VerilogやVHDLの演算子を、
単純にマシン語レベルの演算命令に変換しただけでは、ハードウェアの正しいモデリン
グはできません。
ですから、信号値を正しくモデリングするには(1さんが「マシン語レベルに置き換え」
と言っているので、ここではHDL記述をCに変換するコンパイル型シミュレータをつくる
として話をすると)、
- 0, 1, X, Z, ...を表現可能なデータ型をつくっておく
- そのデータ型に対して演算およびレゾリューションつき代入を行うメソッドを定義す
る
- HDL記述を、これらのデータ型と演算の組み合わせに変換する
というのが、一般的な実装方法になると思います。
3 :
えーしっ君:2001/02/11(日) 23:07
sageてしまった。スマソ。
ところで、HDLシミュレータをつくるには、もうひとつ解決しなければならない重要な問
題があります。それは、プロセスのスケジューリングをしなければならないということ
です。
つまり、HDLで記述されたモデルでは、一見、alwaysブロックやprocessブロックが、信
号の変化に応じてバラバラに動作しているように見えますが、これを実行可能なモデル
に変換するには、これら(alwaysブロックやprocessブロックに該当するCのファンクショ
ン)を、mainから「一筆書き」で実行できるように並べる必要があるってことです。
しかし、実際には、事前に(シミュレーション開始前に)プロセスどうしの依存関係をし
らべてスタティックにスケジューリングすることは困難なので、ダイナミック・スケジ
ューリングをするシミュレータが多いようです(特にサイクルベースでないシミュレー
タは、間違いなくダイナミック・スケジューリングをしていると思われます)。
以下のようにすれば、ダイナミック・スケジューリングを実現できます:
- イベント・キューを用意しておく
- プロセスを評価する
- 評価の結果、そのプロセスが信号を変化させたら、どの信号が変化したか、という情
報をイベント・キューに入れる
- すると、その信号が入力になっているプロセスの評価が発生する
- その結果、それらのプロセスが信号を変化させたら、またイベント・キューに情報を
入れる
- この一連の動作をえんえんと繰り返し、すべてのイベントの伝播がおさまってイベン
ト・キューが空っぽになったら、次のサイクルに移る
…もちろん、本当は、1さんがいうように、
> マシン語レベルのADDやSUB等に置き換えて
ということがパーフェクトに実現できれば、夢の超高速シミュレータが実現できるでし
ょう。しかし、実際のシミュレータは、ダイナミック・スケジューリングをするシミュ
レーション・カーネルも持っているし、たかだか1ビットぶんの信号オブジェクトも内部
ではenumで宣言されている、というのが現状です。ですから、HDLシミュレータは遅くて
メモリもバカ食いなのです。
4 :
えーしっ君:2001/02/11(日) 23:38
では、最後に、役に立つリンクをば。
まずは、
The Open SystemC Initiative:
http://www.systemc.org シミュレータに興味をもたれているなら、噂ぐらいは聞いたことがあると思います。
SystemCというのは、C++でHWをモデリングするためのフレーム・ワーク(クラス・ライブ
ラリ)です。上記サイトで名前を書けば、無償で入手できます。
上の書き込みで、シミュレータがどのようにHWモデルをCに変換するかを説明しました
が、SystemCフレーム・ワークをつかってHWのモデルを手でガリガリ書くことは、シミュ
レータがHWモデルをCに変換する過程を、自分の手でやることと同じことです。
ですから、HWのモデリングを理解するには、よい教材になると思います。
SystemCフレーム・ワークには、以下のものが用意されています。
- 4値の信号をモデリングするためのデータ・タイプ
- これらのデータ・タイプで演算するためのオーバーロードされた演算子
- ダイナミック・スケジューラを隠蔽したmainルーチン
つぎに、
GPLなEDAのページ
http://www.geda.coelacanth.com/ ここから辿れる以下のリンク集には、シミュレータ、その他、フリーなEDAおよび、EDA
プログラミングの素材がたくさんあります。
http://www.opencollector.org/summary.php3 では、ごきげんよう。