Vlsi-design-verilog-introduction
VLSIデザイン-Verilogの概要
Verilogは、ハードウェア記述言語(HDL)です。 ネットワークスイッチやマイクロプロセッサ、メモリ、フリップフロップなどのデジタルシステムを記述するために使用される言語です。 つまり、HDLを使用することで、あらゆるレベルのあらゆるデジタルハードウェアを記述することができます。 HDLで記述された設計は、テクノロジーに依存せず、設計とデバッグが非常に簡単で、通常、特に大規模な回路では回路図よりも有用です。
Verilogは、多くの抽象化レベルで設計をサポートしています。 主要な3つは-
- 行動レベル
- レジスタ転送レベル
- ゲートレベル
行動レベル
このレベルは、並行アルゴリズム(動作)によってシステムを記述します。 すべてのアルゴリズムはシーケンシャルです。つまり、1つずつ実行される一連の命令で構成されています。 機能、タスク、ブロックが主要な要素です。 設計の構造的な実現には関係ありません。
レジスタ転送レベル
レジスタ転送レベルを使用する設計では、操作を使用する回路の特性とレジスタ間のデータ転送を指定します。 RTLコードの最新の定義は、「合成可能なコードはすべてRTLコードと呼ばれます」です。
ゲートレベル
論理レベル内では、システムの特性は論理リンクとそのタイミングプロパティによって記述されます。 すべての信号は離散信号です。 明確な論理値( 0 '、
1'、 X '、
Z`)のみを持つことができます。 使用可能な操作は、定義済みのロジックプリミティブ(基本ゲート)です。 ゲートレベルのモデリングは、論理設計の正しい考えではない場合があります。 ゲートレベルコードは、合成ツールなどのツールを使用して生成され、彼のネットリストはゲートレベルシミュレーションとバックエンドに使用されます。
字句トークン
Verilog言語のソーステキストファイルは、字句トークンのストリームです。 トークンは1つ以上の文字で構成され、各単一文字は1つのトークンにのみ含まれます。
Verilog HDLで使用される基本的な字句トークンは、Cプログラミング言語のものと似ています。 Verilogでは大文字と小文字が区別されます。 すべてのキーワードは小文字です。
ホワイトスペース
空白には、スペース、タブ、改行、フォームフィードの文字を含めることができます。 これらの文字は、トークンの分離に使用される場合を除いて無視されます。
空白文字は、空白、タブ、キャリッジリターン、改行、フォームフィードです。
コメント
コメントを表す2つの形式があります
- 1)単一行コメントは、トークン//で始まり、キャリッジリターンで終わります。
例://これは単一行の構文です
例:/* これは複数行の構文です*/
番号
2進数、8進数、10進数、または16進数の形式で数値を指定できます。 負の数は2の補数で表されます。 Verilogでは、整数、実数、符号付きおよび符号なしの数値を使用できます。
構文は次のように指定されます-<サイズ> <基数> <値>
サイズまたはサイズなしの数値は<Size>で定義でき、<radix>は2進数、8進数、16進数、10進数のいずれかを定義します。
識別子
識別子は、関数、モジュール、レジスタなど、オブジェクトの定義に使用される名前です。 識別子は、アルファベット文字またはアンダースコア文字で始まる必要があります。 Ex. A_Z、a_z、_
識別子は、アルファベット、数字、アンダースコア、および$文字の組み合わせです。 長さは最大1024文字です。
オペレータ
演算子は、条件を設定したり、変数を操作したりするために使用される特殊文字です。 変数に対して操作を実行するために使用される1つ、2つ、時には3つの文字があります。
Ex. >、&plus;、〜、&! =.
Verilogキーワード
Verilogで特別な意味を持つ単語は、Verilogキーワードと呼ばれます。 たとえば、assign、case、while、wire、reg、and、or、nand、およびmodule。 識別子として使用しないでください。 Verilogキーワードには、コンパイラディレクティブ、システムタスクおよび関数も含まれます。
ゲートレベルモデリング
Verilogには、論理ゲート、伝送ゲート、スイッチなどのプリミティブが組み込まれています。 これらは設計作業にはほとんど使用されませんが、合成後の世界ではASIC/FPGAセルのモデリングに使用されます。
ゲートレベルモデリングには2つの特性があります-
ドライブ強度-出力ゲートの強度は、ドライブ強度によって定義されます。 ソースに直接接続されている場合、出力は最も強くなります。 接続が導電性トランジスタを介している場合、および少なくともプルアップ/ダウン抵抗を介して接続されている場合、強度は低下します。 通常、ドライブ強度は指定されません。この場合、デフォルトの強度はstrong1とstrong0です。
遅延-遅延が指定されていない場合、ゲートには伝播遅延がありません。 2つの遅延が指定されている場合、最初の遅延は立ち上がり遅延を表し、2番目の遅延は立ち下がり遅延を表します。 1つの遅延のみが指定されている場合、立ち上がりと立ち下がりの両方が等しくなります。 合成では遅延を無視できます。
ゲートプリミティブ
Verilogでは、1つの出力と多くの入力を使用する基本的な論理ゲートが使用されます。 GATEは、N個の入力と1個の出力に対してVerilogで使用するために、and、nand、or、nor、xor、xnorのいずれかのキーワードを使用します。
トランスミッションゲートプリミティブ
トランスミッションゲートプリミティブには、バッファとインバータの両方が含まれます。 単一の入力と1つ以上の出力があります。 以下に示すゲートのインスタンス化構文では、GATEはキーワードbufまたはNOT gateを表します。
例:Not、buf、bufif0、bufif1、notif0、notif1
ない-n outoutインバーター
Buf – n出力バッファ
Bufifo –トライステートバッファー、アクティブローイネーブル
Bufif1 –トライステートバッファー、アクティブHighイネーブル
Notifo –トライステートインバーター、アクティブローイネーブル
Notif1 –トライステートインバーター、アクティブHighイネーブル
データ型
値セット
Verilogは、主に4つの基本的な値で構成されています。 Verilogで使用されるすべてのVerilogデータタイプは、これらの値を保存します-
0(論理ゼロ、または偽条件)
1(論理1、または真の条件)
x(不明な論理値)
z(高インピーダンス状態)
xおよびzの使用は、合成では非常に制限されています。
Wire
ワイヤは、回路内の物理的なワイヤを表すために使用され、ゲートまたはモジュールの接続に使用されます。 ワイヤの値は読み取りのみが可能で、関数またはブロックでは割り当てられません。 ワイヤは値を保存できませんが、常に連続的な割り当てステートメントによって、またはワイヤをゲート/モジュールの出力に接続することによって駆動されます。 ワイヤの他の特定のタイプは-
ワンド(ワイヤードAND)-ここでワンドの値は、それに接続されているすべてのデバイスドライバーの論理ANDに依存します。
- Wor(ワイヤードOR)*-ここで、Worの値は、それに接続されているすべてのデバイスドライバーの論理ORに依存しています。
- Tri(トライステート)*-ここでは、triに接続されるすべてのドライバーはzでなければなりません。ただし、1つのみ(triの値を決定します)を除きます。
登録
reg(レジスタ)はデータオブジェクトであり、1つの手続き型割り当てから次の割り当てへの値を保持しており、異なる関数と手続き型ブロックでのみ使用されます。 regは単純なVerilogの可変タイプのレジスタであり、物理的なレジスタを意味することはできません。 マルチビットレジスタでは、データは符号なし数値の形式で格納され、符号拡張は使用されません。
例-
reg c;//単一の1ビットレジスタ変数
reg [5:0] gem;//6ビットのベクトル。
reg [6:0] d、e;//2つの7ビット変数
入力、出力、入力
これらのキーワードは、タスクまたはモジュールの入力、出力、および双方向ポートを宣言するために使用されます。 ここでは、入力ポートと入出力ポートはワイヤータイプで、出力ポートはワイヤー、reg、wand、wor、またはtriタイプに構成されています。 常に、デフォルトはワイヤタイプです。
例
整数
整数は、汎用変数で使用されます。 これらは主にループで使用されます-インデックス、定数、およびパラメーター。 それらは「reg」タイプのデータタイプです。 明示的に宣言されたreg型は符号なしのデータとして格納するのに対し、それらは符号付きの数値としてデータを格納します。 コンパイル時に整数が定義されていない場合、デフォルトのサイズは32ビットになります。
整数が定数を保持している場合、シンセサイザーはコンパイル時に必要な最小幅に調整します。
例
Supply0、Supply1
Supply0はロジック0(グランド)に接続されたワイヤを定義し、supply1はロジック1(電源)に接続されたワイヤを定義します。
例
Time
時間は、シミュレーション時間を保持するために$ timeシステムタスクと組み合わせて使用できる64ビットの量です。 時間は合成ではサポートされていないため、シミュレーション目的でのみ使用されます。
例
パラメータ
パラメーターは、モジュールを使用するときに設定できる定数を定義しています。これにより、インスタンス化プロセス中にモジュールをカスタマイズできます。
オペレータ
算術演算子
これらの演算子は算術演算を実行します。 &plus;および-は、単項(x)または二項(z-y)演算子として使用されます。
算術演算に含まれる演算子は-
&プラス; (加算)、-(減算)、*(乗算)、/(除算)、%(モジュラス)
例-
関係演算子
これらの演算子は、2つのオペランドを比較し、結果を1ビットまたは1ビットで返します。
wireおよびreg変数は正です。 したがって、(-3’d001)= = 3’d111および(−3b001)> 3b110。
関係演算に含まれる演算子は-
- ==(等しい)
- !=(等しくない)
- >(より大きい)
- > =(以上)
- <(より小さい)
- ⇐(以下)
例
ビット単位の演算子
2つのオペランド間でビットごとの比較を行うビット単位の演算子。
ビットごとの操作に含まれる演算子は-
- * | (ビットごとのOR) * 〜(ビットごとのNOT) * ^(ビットごとのXOR) * 〜または〜(ビットごとのXNOR)
例
論理演算子
論理演算子はビット単位の演算子であり、単一ビットのオペランドにのみ使用されます。 0または1の単一ビット値を返します。 整数またはビットのグループ、式で機能し、すべての非ゼロ値を1として処理できます。 一般に、論理演算子は式で機能するため、条件ステートメントで使用されます。
論理演算に含まれる演算子は-
- ! (論理否定)
- &&(論理AND)
- || (論理OR)
例
削減演算子
縮約演算子は、ビットごとの演算子の単項形式であり、オペランドベクトルのすべてのビットに対して作用します。 これらも単一ビット値を返します。
削減操作に含まれる演算子は-
- &(削減AND)
- | (削減OR)
- 〜&(NANDの削減)
- 〜| (縮小NOR)
- ^(縮小XOR)
- 〜または〜(縮小XNOR)
例
シフト演算子
シフト演算子。構文の第2オペランドで指定されたビット数だけ第1オペランドをシフトします。 空いている位置は、両方向、左シフトおよび右シフトのゼロで埋められます(使用記号の拡張はありません)。
シフト操作に含まれている演算子は-
- <<(左にシフト)
- >>(右シフト)
例
空席は0で埋められます*/
連結演算子
連結演算子は、2つ以上のオペランドを組み合わせて、より大きなベクトルを形成します。
連結操作に含まれる演算子は-\ {}(連結)です
例
レプリケーション演算子
複製演算子は、アイテムの複数のコピーを作成しています。
レプリケーション操作で使用される演算子は-\ {n \ {item}}(アイテムのn倍のレプリケーション)
例
条件演算子
条件演算子はマルチプレクサに合成します。 C/C ++で使用されているのと同じ種類で、条件に基づいて2つの式のいずれかを評価します。
条件付き操作で使用される演算子は-
(調子) ? (条件が真の場合の結果)-
(条件が偽の場合の結果)
例
オペランド
リテラル
リテラルは、Verilog式で使用される定数値のオペランドです。 2つの一般的に使用されるVerilogリテラルは次のとおりです-
- String -文字列リテラルオペランドは、二重引用符( "")で囲まれた文字の1次元配列です。
- 数値-定数オペランドは、2進数、8進数、10進数、または16進数で指定されます。
例
n-ビット数を表す整数
F-4つの可能な基本形式の1つ-
bは2進数、oは8進数、dは10進数、hは16進数です。
ワイヤー、Regs、およびパラメーター
ワイヤ、reg、およびパラメータは、Verilog式のオペランドとして使用されるデータ型です。
ビット選択「x [2]」およびパーツ選択「x [4:2]」
ビット選択とパート選択は、角括弧「[]」を使用して、ワイヤ、reg、またはパラメータベクトルからそれぞれ1ビットと複数ビットを選択するために使用されます。 ビット選択と部分選択は、メインデータオブジェクトが使用されるのと同じ方法で、式のオペランドとしても使用されます。
例
関数呼び出し
関数呼び出しでは、関数の戻り値は、最初にレジスタまたはワイヤに割り当てる必要なく、式で直接使用されます。 オペランドのタイプの1つとして関数呼び出しを配置するだけです。関数呼び出しの戻り値のビット幅を知っていることを確認する必要があります。
モジュール
モジュール宣言
Verilogでは、モジュールは主要な設計エンティティです。 これは、名前とポートリスト(引数)を示します。 各ポートの入出力タイプ(入力、出力、または入出力)と幅を指定する次の数行。 デフォルトのポート幅は1ビットのみです。 ポート変数は、wire、wand、で宣言する必要があります。 。 。、reg。 デフォルトのポート変数はwireです。 通常、入力はモジュール外でラッチされるため、入力は有線です。 信号が内部に保存されている場合、出力はregタイプです。
例
継続的な割り当て
モジュールの連続的な割り当ては、値をワイヤに割り当てるために使用されます。これは、常時または初期ブロックの外側で使用される通常の割り当てです。 この割り当ては、明示的なassignステートメントを使用して、または宣言中にワイヤに値を割り当てるために行われます。 連続割り当ては、シミュレーション時に継続的に実行されます。 assign文の順序は影響しません。 右側の入力信号のいずれかを変更すると、左側の出力信号が変更されます。
例
モジュールのインスタンス化
モジュール宣言は、実際のオブジェクトを作成するためのテンプレートです。 モジュールは他のモジュール内でインスタンス化され、各インスタンス化はそのテンプレートから単一のオブジェクトを作成します。 例外は、独自のインスタンス化である最上位モジュールです。 モジュールのポートは、テンプレートで定義されているポートと一致する必要があります。 指定されている-
- *名前*で、ドット「.templateポート名(ポートに接続されているワイヤの名前)」を使用します。 Or
- *位置*により、テンプレートとインスタンスの両方のポートリストの同じ場所にポートを配置します。
例