4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HDLAdvent Calendar 2022

Day 18

Introduction to SystemVerilog - 1

Last updated at Posted at 2022-12-17

序章

対象者

  • 論理回路を知っている方
  • 同期回路を知っている方

内容

ハードウェア記述言語(HDL)の一つ、SystemVerilog(SV)をマニュアルを使用して紹介します。仕様を詳細に説明しても読んでいる時点で挫折することが想定できるので、このシリーズではできるだけ専門的な用語の使用は避けて平易にそして簡潔に説明するように努めています。そして、基本的な文法やユーザー定義型やalways_combといったSV特有のものも取り上げます。

参考文献

IEEE 1800-2017: SystemVerilog (SV)
https://www.accellera.org/downloads/ieee

モジュール

論理回路は例えば加算回路や制御回路といった目的に沿ったなんらかの機能単位で構成されています。この構成単位をモジュールと呼びます。

加算回路では全加算回路を複数接続して一つの整数加算回路を構成するように全加算回路を一つのモジュールとして構成する時、そのモジュールを複数接続して整数加算回路というモジュールを構成することが想像できると思います。このようにモジュールがモジュールを包含する記述を行うことで複数の回路で構成された一つの回路を記述します。これはソフトウェア開発言語での関数と同じ”コンセプト”です。

回路はソフトウェアと違い実際に物理的に構成されるものなので関数呼び出しではなく、モジュールをオブジェクト言語でいうインスタンスとして利用します。インスタンスを記述しそのオブジェクトに名前をを与え、ポートを結線して使用しそのように記述します。

インスタンス名がinstance_nameのモジュールの記述は

module instance_name ( ... );
...
endmodule

という形式でmoduleendmodule内に回路を記述します。このモジュールをインスタンスとしてobject_nameという名前で使用する際は例えば次のように記述します。

instance_name object_name (
...
);

モジュール(インスタンス)を記述したとしてそれを利用する際は結線を必要とします。そのインターフェイスとなるポートを定義することで可能にします。先の例のインスタンス名がinstance_nameの記述にポート記述を追加すると例えばポート宣言は

module instance_name (
    input   a,
    input   b,
    input   ci,
    output  d,
    output  co
);
...
endmodule

のように記述します。inputはこのモジュールへの入力、outputはこのモジュールからの出力を示す宣言子です。この例では入力としてabciという入力ポート、dcoという出力ポートを宣言しています。他に双方向ポートはinoutで宣言します。ポートを列挙する際は","で区切ります。

このモジュールを使用する際は例えば、

instance_name object_name (
    .a(     w_a     ),
    .b(     w_b     ),
    .ci(    w_ci    ),
    .d(     w_d     ),
    .co(    w_co    )
);
...
endmodule

と記述します。.a( w_a )ではポートaについて他のところで宣言されたオブジェクトw_aを使用して結線しています。コンマ+ポート名+(+結線用オブジェクト+)で記述します。また列挙する際は","で区切ります。

ポート宣言は他の方法もありますがこの宣言の仕方を使用すればインスタンスとして使用する際にポートの順番をモジュール記述の際のポート宣言順番を守らなくても良くなります。例えば、

instance_name object_name (
    .d(     w_d     ),
    .a(     w_a     ),
    .ci(    w_ci    ),
    .b(     w_b     ),
    .co(    w_co    )
);
...
endmodule

と記述しても問題ないです。

ここまでの内容で全加算回路をモジュールとして例えば


module full_adder (
    input   a,  // source a
    input   b,  // source b
    input   ci, // carry-in
    output  d,  // output c
    output  co  // carry-out
);
    /* Sum                      */
    assign d    = a ^ b ^ ci;

    /* Carry-Out                */
    assign co   = ( a & b & ~ci ) | ( ~a & b & ci ) | ( a & ~b & ci );

endmodule

と記述できます。コメントは他の言語同様に/**/で挟んだり//で記述できます。

このシリーズでは、こう記述すべきといったマナー講師のような説明はしませんので、チームメンバー内でコーディングルールを決めてそれに従ってください。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?