UVMはAccelleraが開発を行ってきて、UVM 1.2の時点でIEEEに寄贈され、IEEE 1800.2-2017 (UVM 2017)として正式に標準化された。その後IEEE 1800.2-2020 (UVM 2020)にアップデートが行われた。正式にIEEEの標準となったUVM 2017以降は、IEEEでは仕様のみを策定し、そのSystem Verilogでの実装をAccelleraがReference Implementationと言う形でリリースしてきた。
晴れて正式に標準化されたのでIEEE版のUVMが業界標準として広く使われると思われた。しかし実際にはそうはならずに、今でもUVM 1.2が主流で、殆どのユーザーはUVM 1.2か場合によっては1.1d辺りを使っている。なぜならIEEE版のUVMはUVM 1.1d/1.2と互換性が無く、過去のテストベンチに適用できず、資産としてまったく活用できないというクソどうしようもない状況だからである。そりゃユーザーからしたら大したメリットもないのにわざわざ苦労してまで今ある資産を捨てる訳がない。バ〇なんじゃないだろうか。
しかし、Accelleraもようやくその事に気付いて反省し、UVM 2020-2.0と言うReference Implementationではこれまでのポリシーを変更し、UVM 1.1d/1.2と十分な下位互換性を保ってリリースをする事となった。
私はその辺の事情を以下Siemens(旧Mentor Graphics)のWebinarで知った。
2022年にはリリースされるのかと思って楽しみに待っていたのだが、一向にリリースさる気配もなく、そんな事はすっかりと忘れていた。そしたら、Accelleraのサイトで2023年6月にUVM 2020-2.0 Reference Implementationのリリースがひっそりとアナウンスされていた。
最近これに気付いたので本当に下位互換性が保たれているか見てやろうと思ってちょっとだけ使ってみた。
まず以下、AccelleraのサイトからUVM 2020-2.0 Reference Implementationをダウンロードして展開。
tarコマンドで展開する場合には>tar xvfz <File Name>で展開できるはず。
そして以下、ライセンスフリーのVivado Simulator (xsim) 2023.1と、とあるぼったくり商用シミュレータとで試してみた。
Vivado Simulator (xsim)はUVM 1.2しか内蔵されていないのでAccelleraからダウンロードしたUVMを使う必要がある。それに対し、商用シミュレータは最新のバージョンでUVM 1.2は当然、UVM 2017, UVM 2020に加えて最新のUVM 20202-2.0もきっちり内蔵しているのでダウンロードした外部のUVMを使う必要はない。しかし一応ダウンロードした外部UVMも試してみた。因みにそのシミュレータではコンパイル時に-ntb_opts uvm-1.2/ieee/ieee-2020/ieee-2020-2.0の様なオプションを付けて指定すると各バージョンの内蔵UVMを使う事ができる。
テストベンチはそれぞれUVM 1.2で正常にコンパイルおよびSimulation実行できていたものを使った。
UVM Version | xsim | 某商用sim |
---|---|---|
内蔵UVM 1.2 | 〇 | 〇 |
内蔵UVM 2017 | ― | × |
内蔵UVM 2020 | ― | × |
内蔵UVM 2020-2.0 | ― | 〇 |
外部UVM 1.2 | × | 〇 |
外部UVM 2020-2.0 | × | 〇 |
Vivado Simulator (xsim)は内蔵のUVM 1.2以外は1.2とか2020-2.0とか関係なく外部のUVMは全くダメだった。Analyzeは通るが何故かElaborationでSegmentation Faultになる。ふざけるな。 まあライセンスフリーなので仕方あるまいと諦めるしかない。さすがにぼったくり商用シミュレータは外部のUVMをコンパイルした物でも問題なく使える。標準ライブラリなのでそれで当たり前ではあるが。そして想定通り2017, 2020では1.2と互換性がなくコンパイル不可であったが、Accelleraが宣言した通り、2020-2.0であれば、1.2向けに作ったテストベンチも問題なくコンパイルされ実行ができた。期待通りである。
ダウンロードしたUVM 1.2とUVM 2020-2.0のドキュメントをざっと見比べてみた。ドキュメントはそれぞれのUVMのインストールパスの
<UVM_PATH>/docs/html/index.html
をブラウザで開けば見られる。よく参照する人はPCにインストールしてこれをブラウザのブックマークに入れておくなり、タスクバーに追加してすぐに起動できるようにしておくと良いだろう。
以下、Class Referenceの目次だけ抜き出して比べてみた。左がUVM 1.2で右がUVM 2020-2.0のもの。UVM 1.2から随分とバッサリと削ってしまっているけど大丈夫かこれ?UVM 1.2から無くした物は下位互換性の為に実装は戻すけどドキュメントには残さないと言う方針らしいが、主要なclassが殆どなくなってるじゃないの。uvm_test/env/agent/monitor/driver/sequencer/scoreboardと言った絶対使うコンポーネントがごっそりなくなってるけどいいの?
と言う訳で、UVM 2020-2.0でようやくまともに使えそうな正式バージョンになった様なので、我々ユーザーとしては、シミュレータさえきちんと対応していれば、今後このバージョンのクラスライブラリを使って行くのが良いであろう。バグフィックスや性能向上もされているそうだし。ただし、使用するUVMのクラスライブラリのバージョンを変えると言うだけで、ユーザー側の実装は今まで通り、現在主流のUVM 1.2の方式のままで行くべきである。敢えてIEEE版の実装に変える必要はない。せっかく業界標準としてみんなで同じやり方にして来たのにそうコロコロと変えられてはたまったものではない。そして、今後余程ユーザー側のメリットがない限りは、おそらく殆どの人も同じように考え、UVM 1.2ベースの実装をし続けてIEEE版の実装が普及すると言う事はまずないであろう。
以下Vivado Simulatorで試してみた環境のGitHubのリンク。
> make
でコンパイルとテスト実行をするが、そのままだと内蔵UVM 1.2で問題なく動くので外部UVMを使って試したい場合はMakefileの以下をExternal UVM側を有効にしてUVM_PATHとかを編集して実行してください。
#-------- For Internal UVM ----------
VLOG_OPT := -L uvm
ELAB_OPT := -L uvm
#------------------------------------
#-------- For External UVM ----------
#UVM_PATH := $(HOME)/UVM/uvm-1.2
#UVM_PATH := $(HOME)/UVM/1800.2-2020-2.0
#VLOG_OPT := --define UVM_NO_DPI --include $(UVM_PATH)/src $(UVM_PATH)/src/uvm_pkg.sv
#ELAB_OPT :=
#------------------------------------
そして以下、一応参考資料としてIEEE 1800.2-2020のReference Manualのリンク。登録は必要ですが無償でダウンロードできます。
UVM 1.2の資料はAccelleraのダウンロードページから入手できます。