Verilog,VHDL等のHW記述言語のシミュレータ

このエントリーをはてなブックマークに追加
2えーしっ君
> 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

では、ごきげんよう。