すべての振る舞いコードは module と endmodule の内側に書きます。作成したいデジタル設計が何であれ、module ブロックの中に入ります。ポートを定義しても、しなくてもよく、信号をブロックに入れる input や、ブロックから出す output を許可します。 モジュール 以下の空のモジュールは testbench と呼ばれます。英数字と _ を含むなら何でも命名可能です。 module testbench; endmodule 別のモジュールを見てみましょう。いくつかの信号(d, clk, rstb)が入力として、q が出力として宣言されています。 module d
一連のVerilog文は通常、シミュレーションで順次実行されます。これらの文は 手続き ブロック内に配置されます。Verilogには主に2種類の 手続き ブロックがあります:initial と always 構文 initial [single statement] initial begin [multiple statements] end initialブロックの用途 initial ブロックは合成可能ではないため、デジタル要素を持つハードウェア回路図に変換できません。したがって、initialブロックはシミュレーションでの使用以外に大きな目的はありません。これらのブロックは主に
前回の記事では always ブロックで組み合わせ論理を実装する例を示しました。always ブロックは、フリップフロップのような値を保持するメモリ要素を持つ 順序 論理の実装にも主に使用されます。 JKフリップフロップ JKフリップフロップは値を格納するフロップの一種で、データ入力 j と k、リセット rstn、クロック clk を持ちます。真理値表は以下の通りで、通常NANDゲートで実装されます。 rstnjkqコメント 0000リセットアサート時、出力は常に0 100保持j=k=0で出力は前回値を保持 1011k=1で出力は1 1100k=0で出力は0 111トグルj=k=1で出
Verilogの always ブロックは順序論理と組み合わせ論理の両方に使用できます。前回の記事で assign 文を使った設計例をいくつか示しました。同じ設計群を今度は always ブロックで探ります。 例 #1:シンプルな組み合わせ論理 以下のコードは、センシティビティリスト内の信号のいずれかが値を変化させると更新される reg 型の出力信号 z を持つシンプルなデジタル組み合わせ論理を実装します。センシティビティリストは @ 演算子の後、括弧内で宣言されます。 module combo (input a, b, c, d, e, output reg z); always @ (
always ブロックはVerilogの 手続き ブロックの1つです。alwaysブロック内の文は順次実行されます。 構文 always @ (event) [statement] always @ (event) begin [multiple statements] end always ブロックは特定のイベントで実行されます。イベントはセンシティビティリストで定義されます。 センシティビティリストとは? センシティビティ リストは、alwaysブロックがいつ実行されるかを定義する式で、@ 演算子の後、括弧 ( ) 内で指定します。このリストには、値の変化でalwaysブロックを
複数ビットのVerilogワイヤや変数を、連結演算子 { と } でカンマ区切りで結合し、より大きなマルチネットワイヤや変数を形成できます。連結にはワイヤや変数に加え、式とサイズ指定付き定数もオペランドとして使用可能です。 連結の全サイズを計算するため、各オペランドのサイズは既知でなければなりません。 Verilog連結の例 wire a, b; // 1ビットワイヤ wire [1:0] res; // aとbを格納する2ビットワイヤ // res[1]はaを、res[0]はbを追従 assign res = {a, b}; wire [2:0] c;
処理できないデータは無意味です。デジタル回路とコンピュータシステムには常に何らかの計算が必要です。合成ツールが適切なハードウェア要素を実現するためのVerilog演算子を見ていきましょう。 Verilog算術演算子 除算または剰余演算子の第2オペランドが0の場合、結果はXになります。累乗演算子のいずれかのオペランドが実数なら、結果も実数になります。累乗演算子の第2オペランドが0なら結果は1(a0)です。 演算子説明 a + baプラスb a - baマイナスb a * ba乗算b a / ba除算b a % baモジュロb a ** baのb乗 module des; reg [7:
Verilogの assign 文は通常、wire データ型の信号を継続的に駆動するために使用され、組み合わせ論理として合成されます。ここでは assign 文を使ったさらなる設計例を紹介します。 例 #1:シンプルな組み合わせ論理 以下のコードは、出力ワイヤ z が assign 文で継続的に駆動され、デジタル方程式を実現するシンプルなデジタル組み合わせ論理を実装します。 module combo ( input a, b, c, d, e, output z ); assign z = ((a & b) | (c ^ d) & ~e); endmodule モジュー
wire タイプや類似のワイヤライクなデータ型の信号には、値の連続代入が必要です。例えば、ブレッドボード上でピースを接続する電気ワイヤを考えてみてください。片側に +5V の電池を接続し続ける限り、もう片側に接続されたコンポーネントは必要な電圧を得られます。 Verilogでは、この概念は assign 文によって実現されます。ここで、あらゆる wire や類似のワイヤライクなデータ型を、値で継続的に駆動できます。値は定数でも、複数の信号で構成される式でも構いません。 assign構文 代入構文はキーワード assign で始まり、その後に信号名(単一信号または異なる信号ネットの連結)が続
前回の記事で見たように、より大規模で複雑な設計は、複数のモジュールを階層的に統合することで構築されます。モジュールは他のモジュール内で インスタンス化 でき、これらの インスタンス のポートを親モジュール内の他の信号と接続できます。 これらのポート接続は、順序付きリストまたは名前による方法で行えます。 順序付きリストによるポート接続 モジュールインスタンス化時のポート式リストと、親モジュール内の信号を接続する方法の1つは 順序付きリスト です。 mydesign は module で、別のモジュール tb_top 内で d0 という名前でインスタンス化されます。ポートは、モジュール宣言の
ポートは、特定のモジュールへの入力および出力として機能する一連の信号であり、モジュールと通信する主要な手段です。モジュールをPCB上に実装された製造済みチップと見なせば、チップと通信する唯一の手段がそのピンであることは明らかです。ポートはピンのようなもので、設計が外部と信号を送受信するために使われます。 ポートの種類 ポート説明 Input設計モジュールは input ポートを通じてのみ外部から値を受信可能 Output設計モジュールは output ポートを通じてのみ外部へ値を送信可能 Inout設計モジュールは inout ポートで値を送受信両方可能 ポートはデフォルトで wire
module は特定の機能を実装するVerilogコードのブロックです。モジュールは他のモジュール内に埋め込むことができ、上位モジュールは下位モジュールの入出力ポートを通じて通信します。 構文 module は module と endmodule キーワードで囲む必要があります。モジュール名は module キーワードの直後に指定し、オプションでポートリストを宣言できます。ポートリストで宣言されたポートは、モジュール本体内で再宣言できません。 module ([port_list]); // モジュールの内容 endmodule // ポートリストが空のモジュールも可能 module
ネットまたは変数の 配列 宣言はスカラでもベクトルでも可能です。識別子名の後にアドレス範囲を指定することで任意の次元を作成でき、これを多次元配列と呼びます。配列は reg、wire、integer、real データ型で使用可能です。 reg y1 [11:0]; // スカラreg配列、深さ12、各1ビット幅 wire [0:7] y2 [3:0]; // 8ビットベクトルネット、深さ4 reg [7:0] y3 [0:1][0:3]; // 2次元配列、行2、列4、各8ビット幅 配列の特定要素にアクセスするには、各次元のインデックスを指定する必要があり、他の変数の式でも
Verilogでは個々のビットとビットグループの両方を表現する必要があります。例えば、1ビットの順序要素はフリップフロップですが、16ビットの順序要素は16ビットを保持するレジスタです。このため、Verilogにはスカラとベクトルのネットと変数があります。 スカラとベクトル 範囲指定なしで宣言されたネットまたは reg は1ビット幅の スカラ と見なされます。範囲が指定されると、そのネットまたは reg は複数ビットのエンティティである ベクトル になります。 wire o_nor; // 1ビットスカラネット wire [7:0] o_flop; // 8ビットベクトルネッ
Verilogにおけるデータ型の主な目的は、フリップフロップ内のビットのようなデータ保存要素や、ロジックゲートや順序構造を接続するワイヤのような伝送要素を表現することです。 変数が保持する値とは? ほぼすべてのデータ型は、real と event を除き、以下の4つの値のいずれかのみを取ります: 0ロジック0、または偽条件を表す 1ロジック1、または真条件を表す x未知のロジック値(0か1のどちらか)を表す zハイインピーダンス状態を表す これらの値がタイミング図やシミュレーション波形でどう表現されるかを示します。多くのシミュレータでは、赤 が X、中央の オレンジ がハイインピーダ
Verilogの字句規則はC言語と似ており、トークンのストリームで構成されます。字句トークンは1文字以上で構成され、コメント、キーワード、数値、文字列、空白があります。すべての行はセミコロン ; で終了する必要があります。 注意:Verilogは大文字小文字を区別するため、var_a と var_A は別物です。 コメント Verilogには2種類のコメントがあります: 単一行コメント:// で始まり、行末までをコメントとして扱う 複数行コメント:/* で始まり */ で終わり、ネスト不可 ただし、単一行コメントを複数行コメント内にネストすることは可能です。 // これは単一行コメン
Verilog言語の詳細を見る前に、チップ設計における抽象化レイヤーを理解しておくと良いでしょう。 最上位はシステムレベルアーキテクチャで、様々なサブブロックを定義し、機能別にグループ化します。例えば、プロセッサクラスタは複数のコア、キャッシュブロック、キャッシュコヒーレンスロジックを持ち、これらは入出力信号を持つ単一ブロックとしてカプセル化・表現されます。 次のレベルでは、各サブブロックがハードウェア記述言語で記述され、個々のブロックの機能が正確に記述されます。この段階では、回路図やテクノロジライブラリといった低レベル実装詳細は無視されます。例えば、コントローラブロックは、その機能のより
典型的な設計フローは以下の構造に従い、複数のステップに分解できます。これらのフェーズの一部は並行して、一部は順次進行します。業界で一般的なプロジェクト設計サイクルを見ていきましょう。 要件定義 半導体企業の顧客は通常、そのチップを自社システムや最終製品で使用する別の企業です。そのため、顧客の要件もチップ設計の方向性を決める上で重要な役割を果たします。最初のステップは、要件を収集し、最終製品の市場価値を試算し、プロジェクトに必要なリソースを評価することです。 仕様策定 次のステップは、設計すべきチップの機能、インターフェース、全体アーキテクチャを抽象的に記述する「仕様」をまとめることです。例
IC(集積回路)設計の初期には、エンジニアがトランジスタとその接続を紙に物理的に描いて設計し、シリコン上で製造可能な形にしていました。回路が大規模・複雑になるにつれ、より多くのエンジニア、時間、リソースが必要となり、やがてIC設計をより良い方法で行う必要性が生じました。 VHDLが開発され、エンジニアが望むハードウェアの機能を記述すれば、自動化ツールがそれを組み合わせ論理ゲートや順序論理といった実際のハードウェア要素に変換できるようになり、設計プロセスが向上しました。Verilogは、このプロセスを簡素化し、ハードウェア記述言語(HDL)をより堅牢で柔軟なものにするために開発されました。今日
Verilogは、FPGAやASIC向けにデジタル ロジックをモデル化、シミュレーション、合成するためのハードウェア記述言語(HDL)です。近い従兄弟であるVHDLとともに、Verilogは学術カリキュラムと商用製品開発の両方で業界標準言語となっています。 プログラマブル ロジックやシリコン設計の世界に初めて触れる方のために、このガイドではVerilogの基礎を説明し、すべてのデジタル システムの基礎要素であるシンプルなANDゲートの構築方法を示します。 JavaやCのような高水準ソフトウェア言語とは異なり、Verilogはゲート レベルでハードウェアを記述します。その結果、コードを直接シリコ
Verilog