見出し画像

SystemVerilogのプログラミング技術を詳解――近刊『検証のためのSystemVerilogプログラミング』はじめに公開

2022年5月下旬発行予定の新刊書籍、『検証のためのSystemVerilogプログラミング』のご紹介です。
同書の「はじめに」を、発行に先駆けて公開します。


***

はじめに

SystemVerilogは、設計、仕様、検証機能を統一的に記述できるハードウェア記述言語です。しかし、設計分野においては、RTL論理合成のモデリングルールに従わなければならない規則により、使用できるSystemVerilog機能は定型的な機能範囲に限定される場合が多いと考えられます。たとえば、if文、case文、alwaysプロシージャ、各種オペレータ等の使用法を論理合成ルールに従い正確に理解して使用することにより、目的とするRTL設計を達成できます。これに対して、検証分野におけるSystemVerilogの使用となると、事情がまったく異なります。

検証分野においては、設計したデザインを検証するためのテスト環境を、正確かつ効率的に表現し、しかも完全な検証を行わなければなりません。そのためには、SystemVerilogが備える機能を的確に選択して検証に適用する知識、技術、手法が必要になります。一方、SystemVerilogには、検証機能および検証に使用できる機能が多く備えられていますが、それらの機能を使用するための原理、原則、およびルールに関してはそれほど明確にされていません。たとえば、組み合わせ回路やシーケンシャル回路からのレスポンスをサンプリングする最適なタイミングに関して、SystemVerilogとして厳格なルールや推奨する方策が定められているわけではありません。たしかに、LRMを精読すれば、最適なタイミング候補として、checkerインスタンス、program
インスタンス、クロッキングブロック等が解決策になりうることを突き止められますが、その結論に到達するまでに果てしないと思えるほどの努力と時間が費やされます。したがって、万人が最適解に到達できるわけではありません。この点において、検証作業には難しさがあります。

近年では、検証作業の分業化・専門化が進みつつあり、検証技術者には従来よりもさらに専門的な知識が要求されるようになっています。たとえば、アサーションが一例として挙げられると思います。デザイン内に隠れた問題を解決するための的確なアサーションを準備するのは、専門家のみが成しうる技であると言えます。あるいは、ランダムスティミュラスを巧みに生成して、設計時には想定していなかった現象を導き出すことにより設計ミスを表面化する検証手法は、まさに専門家の仕事と言えます。

以上で述べたように、一般的には、検証とは深遠な作業過程を意味しますが、いわゆる検証は至るところに存在します。記述したコードが正しく動作するか否かを確認する意味での検証は典型的な例です。しかも、この種の検証は誰もが遂行しなければならない作業です。本書の目的とするところは、このような広義の意味での検証に必要とされるSystemVerilogのプログラミング技術を解説することです。本書では、多くの場合、解くべき問題を提起し、それに対する解決策を提示します。ときには、複数の解決策が紹介されます。これに対して、読者自身が臨機応変に最適な使用法を選択すればよいと思います。

本書は、検証分野で必要となるプログラミング技術を詳しく解説するために、データタイプに関する基本知識の応用から始まり、プロセス、プロセス間通信機能等の検証作業に不可欠な知識の解説に進み、次第に複雑な技術の解説へと移行します。その過程において、インターフェース、クラス、ランダムスティミュラスの生成などで遭遇する問題解決法と効果的な応用技術を解説します。最終的には、UVMを使用した検証環境の構築法、ファンクショナルカバレッジの検証への適用、パッケージの開発法、およびテストベンチ開発法へと進みます。

本書は、概要を含めて12章で構成され、データタイプの基本的な使用法から、並列処理の記述法と制御法、インターフェースの使用法、検証分野でのクラスの代表的な使用法、UVM、ファンクショナルカバレッジ等の幅広い範囲にわたり検証分野の話題をカバーしています。本書の各章の内容は易から難へと進むように構成されていますが、各章の内容は比較的独立しているので、必要に応じて学習する章の順序を変更してもかまいません。ただし、本書を理解するためにはSystemVerilogの基礎知識が必要です。本書は、SystemVerilogの入門書ではないので、初歩的な解説は含まれていません。

本書のほとんどの章には、LRMに対応する章が存在しますが、本書独自の章もあります。以下、それらの章の内容と意義を概説します。

第9章のUVMは、検証環境の構築にUVMを適用する際のよい参考になるように構成されています。たとえば、シーケンスを階層的に構築して実用的なシナリオ作成技術を実装しています。さらに、テストケースの選択をコマンドラインから指定できるように設計してあるので、実践で必要となる知識の具体的実装例となります。検証環境を構成するそれぞれの検証コンポーネントを省略せずに解説しているので、UVMの学習と復習にも適しています。

第11章は、汎用的な機能の開発法を具体的なパッケージとして例示してあります。それぞれの機能は、単なるSystemVerilog記述例の紹介ではなく、実用的な機能として実装されています。それぞれの実装コードからプログラミング技術を学ぶことができるだけでなく、それらの機能を活用して読者自身のツールへと進化させることもできると思います。

第12章は、テストベンチの開発法をまとめた章です。検証におけるタイミングのとり方の基本的な手法を簡潔にまとめてあるので、テストベンチ開発時のよい参考になると思います。組み合わせ回路とシーケンシャル回路の両方に分けて検証法を記述しているので、この章を早い時期に読んでおくと効果的かもしれません。
 
 
***

著:篠塚 一也(有限会社アートグラフィックス)

◆ハードウェア検証に欠かせないSystemVerilogのプログラミング技術を、膨大で複雑な仕様書を丁寧に紐解きながら解説◆

データタイプの基本的な使用法をはじめとして、並列処理、インターフェースやクラスの使用法などからUVM、ファンクショナルカバレッジといった実践的な応用例まで、ハードウェア検証の話題が幅広く網羅されています。
 
複雑な検証機能やわかりにくい仕様も、コードで手を動かしながらつまずくことなく学べるよう工夫されています。それだけでなく、パッケージの開発例やテストベンチの構築例など、実践的なコードも多数掲載されています。
 
SystemVerilogのより効率的な記述法や、厳密な検証方法を学びたい方におすすめの1冊です。


【目次】
第1章 概要

 1.1 検証例
 1.2 特別な条件がない場合の検証
 1.3 仕様変更を考慮した検証
 1.4 プラットフォーム独立なテストベンチ
 1.5 近年の検証手法
 1.6 イベント解除と実行の流れ
 1.7 本書の対象者と目的
 1.8 本書の構成と読み方
 1.9 例題に関して
 1.10 本書の記法

第2章 データタイプ
 2.1 typedef文
 2.2 2-state型と4-state型
 2.3 enumデータタイプ
 2.4 stringデータタイプ
 2.5 アレイ
 2.6 ストラクチャ
 2.7 ユニオン

第3章 プロセス
 3.1 実行順序依存性
 3.2 triggeredメソッド
 3.3 forkブロック
 3.4 RNG
 3.5 プロセス制御
 3.6 実行順序依存性の回避

第4章 プロセス間通信機能
 4.1 セマフォ
 4.2 メールボックス
 4.3 event

第5章 タスクとファンクション
 5.1 概要
 5.2 ポート
 5.3 サブルーティンの呼び出しと標準値の設定
 5.4 値を戻すファンクション
 5.5 再帰呼び出し
 5.6 DPI

第6章 インターフェース
 6.1 モジュールによる検証環境
 6.2 近年の検証手法
 6.3 virtualインターフェース
 6.4 クロッキングブロック
 6.5 virtualインターフェースを使用した検証環境例

第7章 クラス
 7.1 概要
 7.2 クラスインスタンスの管理
 7.3 インスタンスと階層
 7.4 サブクラスの判定
 7.5 インターフェースクラス

第8章 ランダムスティミュラスの生成
 8.1 素朴なランダムスティミュラス生成
 8.2 簡単な制約条件による乱数発生
 8.3 クラスによるランダムスティミュラス生成
 8.4 randcase

第9章 UVM
 9.1 UVMによる検証環境
 9.2 検証環境の構成要素
 9.3 テストの実行

第10章 ファンクショナルカバレッジ
 10.1 概要
 10.2 カバレッジモデルの定義
 10.3 カバレッジ計算
 10.4 カバレッジ計算例

第11章 パッケージの開発法
 11.1 GCLパッケージの概要
 11.2 GCLパッケージ使用法
 11.3 GCLパッケージの構成
 11.4 共通定義ファイル
 11.5 gcl_clock_gen( )ファンクション
 11.6 gcl_dlink_tクラス
 11.7 gcl_dlist_tクラス
 11.8 gcl_make_format( )ファンクション
 11.9 gcl_max_len( )ファンクション
 11.10 gcl_process_manager_tクラス
 11.11 gcl_process_tクラス
 11.12 gcl_random_string( )ファンクション
 11.13 gcl_reverse_string( )ファンクション
 11.14 gcl_sprint_center( )ファンクション
 11.15 gcl_sprint_left( )ファンクション
 11.16 gcl_sprint_right( )ファンクション
 11.17 gcl_sprint_string( )ファンクション

第12章 テストベンチ
 12.1 概要
 12.2 組み合わせ回路
 12.3 シーケンシャル回路
 12.4 テストベンチ手法のまとめ

参考文献
索引


この記事が気に入ったらサポートをしてみませんか?