SystemVerilog
[Wikipedia|▼Menu]

SystemVerilogパラダイムハードウェア記述言語(ハードウェア記述言語はプログラミング言語ではない)
登場時期2002年 (2002)
最新リリースIEEE 1800-2017/ 2018年2月21日 (6年前) (2018-02-21)
型付け弱い静的型付け
影響を受けた言語Verilog
拡張子.sv
テンプレートを表示

SystemVerilog は、ハードウェア記述言語Verilog HDLを拡張した言語で、主に検証に関する機能が拡張・統合されている。2002年に ⇒Accelleraに対して Superlog 言語を寄付したことで生まれた[1]。検証機能の部分はシノプシスが提供した OpenVera に基づいている。2005年、SystemVerilog は IEEE Standard 1800-2005 として標準化された[2]
全体構成

SystemVerilog は Verilog-2005 の拡張であり、機能的に上位互換となっている。以下では、Verilog-2001 から SystemVerilog で拡張した部分について解説する。Verilog-2001 との共通部分は Verilog を参照。

Verilog HDLと同様、その機能は、

設計機能 - 電子回路およびシミュレータで利用可能

検証機能 - シミュレータで、テストやデバッグ時に利用

に大別できる。
論理合成

Verilog HDL同様、どの機能が合成可能で、どの機能が不可能かは実装次第であり言語マターではない。例えば Altera の Quartus II 11.0 では、共用体はできないが、構造体は論理合成可能である[3]
設計機能

ここでは、主に、論理合成可能である可能性が高いと思われる物を述べる(前述のように実装次第であり言語マターではないため)。
新たなデータ型

多次元詰め込み配列により、Verilog の "registers" と "memories" を統合拡張した:reg [1:0][2:0] my_var[32];

本来の Verilog では変数名の左には一次元の宣言しかできなかった。SystemVerilog は任意の詰め込み次元を指定可能である。詰め込み配列型の変数には整数算術実体を 1:1 でマップする。上記の例では、my_var の各要素は6ビットの整数を表す。名前の右側にある次元(例では32)は詰め込み型でない次元である。Verilog-2001 と同様、詰め込み型でない次元は任意の次元の指定が可能である。

列挙データ型により、数値実体に意味のある名前をつけることが可能となった。列挙型で宣言された変数は、他の列挙型とは cast なしで代入できない。これはパラメータには当てはまらない。Verilog-2005 での列挙型の実装に合わせたためである。typedef enum reg [2:0] { RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW} color_t;color_t my_color = GREEN;

このように、設計者は基となる算術型(この場合 reg [2:0])を指定し、その値に名前を付ける。メタ値 X と Z を使うこともでき、不正状態を表すのに使う。

新しい整数型: SystemVerilog では byte、shortint、int、longint という二値統合型を定義しており、それぞれ8ビット/16ビット/32ビット/64ビットである。bit 型は不定長の二値型であり、reg と似たような働きをする。二値型では reg では使えるメタ値 X と Z が使えない。このため、シミュレーションの高速化を期待する。Verilog-2001 にもある integer と time はそのまま四値が使える。

浮動小数点型: real (64ビット)に加えて、shortreal (32ビット)を追加。

構造体と共用体はC言語と同様の働きをする。SystemVerilog ではこれらに詰め込み型属性を導入し、詰め込み型配列のビット列に構造体や共用体を 1:1 で対応させることができる:typedef struct packed { bit [10:0] expo; bit sign; bit [51:0] mant;} FP;FP zero = 64'b0;
Unique/priority if/case

入れ子になった if や case 文において、unique属性を指定することで必ず1つの分岐(case)だけが実行されることを指示できる(どれも実行できない場合はエラーとなる)。つまり、各ケースは並行して実行可能である。if や case 文での priority属性は条件を順次評価していくことを示す。これまでアノテーションで synopsys full_case parallel_case を使って指示していたことを正式にキーワードとして指示できるようになったのである。
手続き的ブロック

Verilog の always ブロックに加え、SystemVerilog では設計構造をより意識した手続きブロックを新たに提供している。これによってEDAツールはどういう動作が求められているのかを正確に把握できるようになる。

always_comb ブロックは組合せ論理を生成する。シミュレータはブロック内の文からセンシティビティ・リストを推定する:always_comb begin tmp = b * b - 4 * a * c; no_root = (tmp < 0);end

always_ff ブロックは順序論理(FF回路)を推定する:always_ff @(posedge clk) count <= count + 1;

always_latch ブロックはラッチを推定する。この場合もセンシティビティ・リストはコードから推定できる:always_latch if (en) q <= d;
検証機能

以下の検証機能は論理合成不可能であることが多いと思われる。目的としては、シミュレーター用に拡張可能で柔軟なテストベンチの生成を支援するためのものである。
新たなデータ型

string データ型は任意長のテキスト文字列を表す。

設計で使われる静的配列に加え、SystemVerilog は動的配列、連想配列、キューを提供する:int da[]; // 動的配列int da[string]; // 文字列をインデックスとする連想配列int da[$]; // キューinitial begin da = new[16]; // 16要素を生成end

動的配列は非詰め込み型の配列のように働くが、上で示したように動的に生成されなければならない。この配列は必要に応じてサイズを変更できる。連想配列はユーザー指定のキーの型とデータ型による二分探索木のようなものである。キーによる暗黙の順序付けがあり、辞書式順序で読み出すことができる。キューは C++STL にある deque 型の機能とほぼ同等のものを提供する。要素の追加や削除がキューの両端から可能である。これらのデータ型は大規模設計で必要となる複雑なデータ型の生成を可能とする。
クラス

SystemVerilog はオブジェクト指向プログラミングモデルも提供する。

SystemVerilog クラスは、単一インタフェースモデルである。Javaの interface のように複数のインタフェースを使用することはできない。SystemVerilog のクラスは型をパラメータ化でき、C++ のテンプレートのような機能を提供する。しかし、関数テンプレートやテンプレートの特殊化は対応していない。

ポリモーフィズム機能はC++と似ている。virtual 指定で関数を書くことで、派生型がその関数の制御を奪うことができる。

カプセル化とデータ隠蔽は local および protected というキーワードで実現され、任意のアイテムに指定して隠蔽できる。デフォルトでは、全てのクラス属性が public である。

SystemVerilog のクラスのインスタンスは new キーワードで生成する。function new でコンストラクタを定義できる。SystemVerilog はガベージコレクションもサポートしており、インスタンスを明示的に解放・消去する機能はない。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:26 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef