SystemVerilog って何?
SystemVerilogは、長年使われた Verilog-HDL をベースにして数々の改良を施した言語です。
Verilog-HDL の欠点をカバーしただけでなく、VHDL、SystemC や C++等の便利な機能や最新の検証手法を取り入れて IEEE 標準にしました。SystemVerilog を導入すると、RTL設計と検証の期間を大幅に短くできるだけでなく、デザインの再利用性や回路品質が向上します。
SystemVerilog の優位点
1. RTL の記述量が大幅に減ります!
SystemVerilog は、Verilog-HDL と同じ情報量で記述量を削減するための工夫がされています。 特にテストベンチは数分の1の大きさにできますので、今までテストベンチを C++などで記述されていた多くの方が SystemVerilog へ移行されています。では、どのようにして RTL の記述量が減るのでしょうか。
(1) 冗長記述の削除
Verilog-HDL は何回も "ポート名" と "型" の宣言を行なうのが面倒です。 Verilog-HDL は "module" のポートを介して接続するので、バスに接続された各 "module" の冗長なポートや型の宣言は大変な工数でした。 SystemVerilog はポート名とネット名が同じ時はポート名を省略することができます。記述が短くなるだけでなく、ポート名の変更時に修正漏れを防げるので設計の再利用にも便利です。
module alt_tec1 (
output[31:0] d_out, |
always 文でも信号名の記述が不要です。
(2) 多次元と列挙型配列
(a) 多次元配列
Verilog-HDL は1次元配列しかサポートしませんが、SystemVerilog は多次元配列をサポートします。配列へのアクセスが容易になり記述量が減ります。
logic [3:0][1:0][7:0] mem [255 : 0 ] ; |
(b) 列挙データ型
列挙データ型をサポートします。列挙データ型を使うと数値に名前を付けられますので、ステートマシンの各状態値を分かりやすい名称にして、シミュレーション結果の波形グループを "01001" のような数字でなく、"Red" などのステートの名称で表示できるので便利です。
Verilog-HDL は下記の記述になりますが、
parameter Red = 0, Green = 1, Yellow = 2; |
SystemVerilog は1行で定義できます。デザインの見通しが良くなりますね。
typedef enum reg {Red, Green, Yellow} signal; |
(3) オブジェクト指向
ソフトウェア業界では、ますます複雑になるプログラムに対処するために、C++ はオブジェクト指向の手法を取り入れました。
そして、SystemVerilog でもその主要な機能をサポートします。この機能を使用して同じ処理を関数にすると、テストベンチ側で効率的に再利用性の高いテストベンチを作成できます。
説明が長くなるので 詳しくはソフトウェア技術者に聞いてください。
構造体(struct):
型やサイズの異なる関連のある変数をまとめて1つの変数にするものです。構造体の各値は各々のメモリー領域に割り当たえますが、共用体は1つのメモリー領域に値を割り当てます。
共有体(union):
構造体と似ていますが、共用体は1つのメモリー領域に値を割り当てます。1つのメモリ領域からデータを切り出すときに便利です。各値はメンバー名でアクセスできます。
クラス(class):
構造体を機能拡張したもので、データと関数を持つことができます。
例えば、円の面積を求める式を "circle class" として定義し、テストベンチの中で "circuit class" 関数に半径の値を入れると自動的に "円の面積の値" を得ることができます。この "circuit class" は他のデザインでも使えるので、次にテストベンチを作る際に便利です。もちろん、設計済み "circle class" の中身を次回に設計する際に検証する必要はありません。再利用を考慮した設計は開発工数削減に重要です。
2.シミュレーション速度が速くなります!
SystemVerilog は論理とテストベンチの記述量が大幅に減るので シミュレーション速度が速くなるのは当然ですが、さらに高速化のための工夫がされています。
(1) 2値のデータ・タイプをサポート
Verilog-HDL のデータ・タイプは4値型ですが、SystemVerilog は新たに2値型もサポートします。設計初期の段階に2値型を使うとメモリ使用量が減るだけでなく、シミュレーション速度が高速になります。
(2) モジュール毎に時間単位や時間精度を指定可能
Verilog-HDL は モジュールごとに時間単位や時間精度を指定できませんでしたが、SystemVerilog は モジュール毎に指定できるようになりました。
検証済みで精度が不要なブロックは時間精度を緩め、未検証のブロックは精度を高めたシミュレーションをおこなうと全体のシミュレーション速度が速くなります。
(3) データ配列のコピー
Verilog-HDL は一度に1つの配列しかアクセスできないので、下記のようにループを多用します。
for (i=1; i<=256; i=i+1); |
SystemVerilog では、ループを使用せずに一度に全配列をコピーするので処理が早くなります。
Out_data = In_data; |
(4) Cプログラムとのインタフェース
Verilog-HDL は、Cプログラムとのインターフェースに PLI を使っていましたが オーバーヘッドが大きい問題がありました。SystemVerilog は 新たに DPI (Direct Programming Interface) をサポートして、Cプログラムとのインターフェースが高速になり Cプログラムを使った時のシミュレーションが高速になります。
3.記述ミスが減少します!
(1) RTL がコンパクトになりデザインの見通しが良くなります
1.で、SystemVerilog は冗長記述を削減したと説明しましたが、ポート名変更時のケアレミス防止になります。また、RTL がコンパクトになるとデザインの見通しが良くなるので記述ミスが減ります。特に、修正やデザインを再利用する時のミスが減少します。
(2) 新しい構文をサポート
ミスを減らすための新しい構文をサポートしました。
(a) 設計者の意図通りのalways文
Verilog-HDL でalways文を使うときは、注意しないと設計者が意図した回路とは違う回路が合成されることがありました。そこで、新しい always 文(always_comb/always_ff/always_latch)がサポートされて、組み合わせ回路/レジスタ/ラッチを意図通りに生成できるようになりました。
(b) サイクルベースのテストベンチ記述
Verilog-HDL は、同期設計でもテストベンチの記述は時間で指定します。遅延調整する度にミスが多く発生していたので、SystemVerilog はサイクルベースの記述“clocking”をサポートします。
(c) 並列処理や優先度の定義
if文やcase文で各条件が並列処理できるときには、“unique”、逆に各条件に優先順位があるときは、“priority”を使うと、設計者が意図するように並列可能か優先順位を持つのかを指定できます。
(3) 変数の緩和
Verilog-HDL は組み合わせ回路でも“reg”を使ったり、“reg”と“wire”の使い分けで間違えることが多かったのですが、SystemVerilogでは全て“logic”で宣言できます。
|
![]() |
|
4. 導入がとっても簡単!
新しい言語に多くのメリットがあっても、新たに費用が発生したり、既存の設計資産や設計フローを扱えなかったり、他社のツールで扱えないと導入は困難です。
その点、SystemVerilogは Verilog 2001の構文もサポートしていますので、既存の設計手法を変更せずに少しずつ新しい構文を習得しながら Verilog-HDL から SystemVerilog へ移行できます。
もちろん、アルテラが無償で提供している Quartus®II Web Edition と ModelSim®-Altera Strarter Edition でも数年前から SystemVerilog を標準でサポートしています。(※ 未サポートの構文もあります。)
次回は、SystemVerilog の特徴を最大限に活用する方法をご紹介します。