SystemVerilogの基礎知識【その1】
2023年10月16日 更新
みなさん、こんにちは。
SystemVerilogは検証用に使用されている場面が多いですが、筆者はデザイン開発への浸透はまだまだだなと感じています。
Verilogを使用されていた方にとっては、SystemVerilogは上位互換なので、入りやすいかと思います。
「記述の簡略化」、「その簡略化によって防げる記述ミス」、「解析にかかる時間削減」など多くのメリットがあるため、本ブログではSystemVerilogについて書いていこうと思います。
また、今回はSystemVerilogの概要やVerilogから見て便利になった内容を記載したいと思います。
このブログは「FPGA設計ブログ一覧」の
1. コーディング・IP設定・プリミティブ設定 のひとつです。
目次
SystemVerilogとは?
SystemVerilog はハードウェア言語の1つで、Verilog-HDLを拡張(改良)した言語です。Verilog-HDLから検証に関する機能が強化、改善されています。
SystemVerilogの特長をまとめると以下の通りです。
- Verilogの上位互換のため、VerilogからSystemVerilogへの移行が簡単
- RTLの記述量が減る
- 記述ミスの減少
- シミュレーション時間の短縮
ハードウェア設計で主に使用される言語は、VHDLやVerilogになります。
Verilog記述からSystemVerilog記述に移行する場合、これまでの設計資産をそのまま使用することが可能です。そして、SystemVerilogの新たな機能を使うことができるようになります。
拡張子について
SystemVerilogのファイル拡張子は、".sv" です。ちなみに、Verilogのファイル拡張子は、".v"になります。
これまでの言語の歴史としては
SystemVerilog3.0 | 2002年リリース |
---|---|
SystemVerilog3.1 | 改訂版 |
SystemVerilog3.1a | 改訂版 |
IEEE Std 1800-2005 | 2005年リリース |
IEEE Std 1800-2012 | 2012年リリース |
IEEE Std 1800-2017 | 2018年リリース(現在のSystemVerilog) |
上記の「IEEE Std 1800-2017」が現在リリースされているSystemVerilogの最新になります。
SystemVerilogの利便性
SystemVerilogはどのように便利になっているのでしょうか。
VerilogとSystemVerilogの差分について以下に記載します。
はじめに、必ず使用するalways文について説明します。
always文
主に使用するalways_comb / always_latch / always_ff があります。
用途によって、使い分けます。
・always_comb
組み合わせ回路で使用します。
always文では、センシティビティ・リストに必要な信号をすべて記述しないと、意図した動作にならない場合があります。
always_combの場合には、センシティビティ・リストの記述が不要になるため記述量も減り、ミスが減ることになります。
<記述例>
always_comb begin
if (select) begin
data_out = data_in_a;
end else begin
data_out = data_in_b;
end
end
・always_latch
ラッチ部で使用します。
always文では、if文やcase文で条件漏れによって、意図しないラッチが生成される場合があります。
always_latchの場合、明示的にラッチ記述になるため、ミスが減ります。
<記述例>
always_latch begin
if (enable) begin
data_out <= data_in;
end
end
・always_ff
フリップフロップで使用します。
always文と同様な記述をします。
マルチドライブできません。
<記述例>
always_ff@(posedge clock, posedge reset) begin
if(reset) begin
data_out <= '0';
end else begin
data_out <= data_in;
end
end
上記の、always_comb / always_latch / always_ff がサポートされたことで、設計者の意図通りの動作が生成できるようになりました。
宣言文(logic宣言)
宣言文では、いろいろと増えている内容がありますが、一番使用できる「logic宣言」について以下に記載します。
SystemVerilogでは、宣言文で「logic宣言」が追加されています。
これは、Verilogの「wire宣言」「reg宣言」の位置づけとなります。
そのため、wire/reg宣言の使い分けをせず、assign文やalways文で使用できます。(VHDLの"signal"と同等です。)
<記述例>
Verilogの場合
wire [3:0] data_a;
wire [7:0] data_b;
reg [7:0] counter;
SystemVerilogの場合
logic [3:0] data_a;
logic [7:0] data_b;
logic [7:0] counter;
注意として、logic宣言の後ろに直接の代入はできません。
その場合は、logic宣言ではなくwire宣言を使用ください。
次に、多次元配列と列挙データ型について述べていきます。
多次元配列
Verilogでは、一次元配列のサポートのみでしたが、SystemVerilogでは多次元配列がサポートされています。
これは、大きな改良だと思います。
いままで一次元のみだったので、展開した記述を行っていたかと思います。
多次元ができることで、開発の幅が広がります。(記述の削減)
<記述例>
logic [1:0] mem [127 : 0 ] ;
列挙データ型
SystemVerilogでは、列挙データ型をサポートします。
数値に直接、名前をわりあてることが可能です。
そのため、ステートマシン記述の各状態が解かりやすく、可読性が良くなるため、記述ミス削減になります。
<記述例>
parameter UP = 0 , DOWN = 1 , RIGHT = 2 , LEFT = 3;
シミュレーションでは、波形で表示される"0" or "1"の数値ではなく、上記で設定したように“UP/DOWN”のようなステートマシンで記述した名称で表示されるので便利な部分があります。
このように可読性が上がることで、設計時の記述ミス、シミュレーション時の動作の確認を進めやすくなるので、SystemVerilogは品質の向上につながります。
おわりに
いかがでしたでしょうか。SystemVerilogの基礎知識についてご理解いただければ幸いです。
次回は、検証時(SystemVerilog)に便利になった話をよく聞きますので、その辺の内容をお伝えできればと思います。
弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。
サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。
FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。
最後までお付き合いいただきありがとうございました。
このブログは「FPGA設計ブログ一覧」の
1. コーディング・IP設定・プリミティブ設定 のひとつです。