Verilog系列のアナログモデリング言語は市販されている電子シミュレータの多くに実装されています。しかし、Verilog-Aをサポートしているケースもあれば、Verilog-AMSがサポートされているケースもあり、言語に詳しくない方にとっては、混乱をきたす状況になっていました。
この記事では、Verilog-AからVerilog-AMSになった際に修正された点をまとめました。差分をカテゴリ分けしてまとめにしましたので、Verilog-AとVerilog-AMSの差分が一読すれば分かるでしょう。言語差分が分かれば、両方でコードを書かなければいけない場合に参考になります。
なお、無料でVerilog-Aの言語を体験したいのであれば、以下の記事も参考にして下さい。完全な実装ではありませんが、Verilog-Aを試してみることが出来ます。
[pagelink id=1366]
キーワード関係の変更
まず、注意すべき変更点として、関数名や変数名などのキーワードに変更があります。これまでシステム関数だったものが、通常の関数になり、$マークが消えたり、といったケースやその逆のケースもあります。
Verilog-Aにおける表記 | Verilog-AMSにおける表記 |
$realtime | $abstime |
discontinuity(x) | $discontinuity(x) |
$limexp(式) | limexp(式) |
bound_step(定数) | $bound_step(式) |
delay() | absdelay |
$realtimeについては少し状況が分かりにくいです。Verilog-HDLの現状も踏まえて、実数でシミュレーション時間を得る物として$abstimeを新規に導入しています。$realtimeはデジタル文のみで利用可能ですが、$abstimeはアナログ文とデジタル文の両方で使用可能です。
また、$realtimeのtimescaleが1sから1nsに変更されています。Verilog-HDLとの関係を鑑みて、ということと推察されます。
機能追加
Verilog-Aに存在した「$dist_が先頭に付く分布関数」は「$rdist_から始まる分布関数」に変更された。引数が整数ベースから実数ベースに変更されました。純粋な機能拡張と言えます。
初期値の変更
Verilog-AからVerilog-AMSで変更された初期値の扱いは以下の通りです。
- Verilog-Aにおいては、disciplineが空の時、wire型として定義されていた。Verilog-AMSでは定義されていない型として扱われることになった。
- initial_stepとfinal_stepについて、初期値がTRANからALLに変更になった。
- アナロググラウンドの定義が無かったのを追加した。
- disciplineドメインについて、連続であることを想定していたが、デフォルトを連続として、離散も考慮するようにした
- ポートブランチのアクセスについて(a,a)という形から、I(<a>)という表記に変更。
- 暗黙のノードについて、Verilog-Aではdefault_nodetypeマクロで指定する(デフォルト動作はwire)形だったが、Verilog-AMSでは空のdisciplineとドメインタイプ無しがデフォルトとなった。
Verilog-AMSにおける新規追加
以下の機能はVerilog-AMSで追加された機能です。
ceil(式) |
floor(式) |
idtmod(式) |
genvar |
macro-module |
剰余演算を実数に拡張 |
timer関数とtransition関数に時間tolerance指定の引数を追加 |
groundキーワードによるアナロググラウンドネット定義 |
ただし、groundキーワードでアナロググラウンドネットを定義する様にしたため、Verilog-Aではgroundキーワードでグラウンドネットとして使えたものが使えなくなっています。
配列初期化について
初期のVerilog-Aでは、配列の初期化は導入されていませんでした。Verilog-AMSではC言語などでもみられる配列表記が導入されています。
aa[0:1] = {2.1=(1), 4.5=(2)}
Verilog-AとVerilog-AMSの両方に対応するコードを記述する際には、配列初期化は使用しない方が賢明でしょう。
その他
以下も修正されています。地味に関数定義のキーワードの微修正があるので注意です。
- アナログ関数の定義について、functionからanalog functionに変更した。
- 補助単位であるキロについて、Verilog-AではKのみだったので、kもサポートした(大文字と小文字の両方をサポート)。
- default_nodetypeマクロを廃止し、default_disciplineマクロを導入した。
機能の廃止
Verilog-AMSにて、以下のキーワードは廃止されました。
- forever
- generate
加えて、Verilog-AMSでは空文(Null文)について、制限が厳しくなりました。すべてのケースでは許容されず、case文や条件分岐文、イベント記述などに限定されます。
今後Verilog-Aコードを記述するときのヒント
今後、Verilog-AやVerilog-AMSのコードを記述する場合は、Verilog-AMSの書式を意識しながら書くと良いでしょう。一方にしかない機能についてはなるべく使わないことが望ましいです。また、デフォルト動作が変わっている物については、明確にデフォルト値を指定してやれば今後問題が起こる可能性が低くなります(timescaleなど)。
一方で悩ましいのが、キーワードが変わっている物です。Verilog-Aではシステム関数として定義していたものが、Verilog-AMSでは変わっていたりすると、先頭の$マークの有無が変わってしまう、という問題があります。
ある程度は割り切りが必要ですが、確実に両対応が必要となるなら、中間関数を用意したり、define文を駆使する、などの対応が必要でしょう。最も、こういった一覧は実はそこまで多くないので、grepやsedを駆使して置換していく、という選択肢もあります。
Verilog-Aが登場した1996年から、実は世界のVerilog-A事情はあまり良くなっていません。特にフリーのコンパイラが広く使われることはなく、基本的には商用の物です。そして、Verilog-AMSも登場していますが、Verilog-AMSに対応しはじめたシミュレータが出始めたのも割と最近の様です。某社のシミュレータはVerilog-AMSと書いてありますが、Verilog-Aの解説がメインだったり、対応もそこまで進んでいない状況に見えます。
こういった状況を考えると、これからもVerilog-Aを使わざるを得ない状況がありますから、Verilog-AとVerilog-AMS間での移植性を考えながら、モデリングを進める、というのは非常に重要でしょう。
もし、業務で活用する場合には、注意を払ってみてください。
最後に
今回は、Verilog-AからVerilog-AMSに進化した際に、どういった変更が行われたか、を整理してみました。Verilog-AもVerilog-AMSも活用しているエンジニアは少ないからか、移行・移植時に参考となる情報がなかったため、まとめました。
今回の記事がVerilogでのモデリング開発の参考になれば幸いです。