Verilog (ヴェリログ)は、IEEE 1364 として標準 ひょうじゅん 化 か されているハードウェア記述 きじゅつ 言語 げんご (Hardware Description Language; HDL)である。最 もっと も重要 じゅうよう な用途 ようと は、デジタル回路 かいろ をレジスタ転送 てんそう レベル で設計 せっけい ・検証 けんしょう することである。また、アナログ回路 かいろ や混合 こんごう 信号 しんごう 回路 かいろ (英語 えいご 版 ばん ) の検証 けんしょう や、遺伝子 いでんし 回路 かいろ (英語 えいご 版 ばん ) の設計 せっけい にも使用 しよう されている[ 1] 。
もともとVerilogは電子 でんし 回路 かいろ シミュレーション を行 おこな うシミュレータであり、それに使用 しよう する言語 げんご であった。文法 ぶんぽう は、プログラミング言語 げんご のC言語 げんご やPascal に似 に ている。
後継 こうけい 言語 げんご はSystemVerilog で、Verilogの機能 きのう 的 てき な上位 じょうい 互換 ごかん である。System Verilogの規格 きかく と統合 とうごう して、「IEEE/IEC 62530:2011 SystemVerilog - Unified Hardware Design, Specification, and Verification Language」と呼 よ ばれる標準 ひょうじゅん になっている。
Verilogのようなハードウェア記述 きじゅつ 言語 げんご は、ソフトウェアプログラミング言語 げんご に似 に ている。これは、信号 しんごう の伝達 でんたつ 時間 じかん や信号 しんごう 強度 きょうど を記述 きじゅつ するコードから作 つく られているからである。Verilogには、ブロッキング代入 だいにゅう とノン・ブロッキング代入 だいにゅう という2種類 しゅるい の代入 だいにゅう 演算 えんざん 子 こ (英語 えいご 版 ばん ) がある。ノン・ブロッキング代入 だいにゅう 文 ぶん のおかげで、設計 せっけい 者 しゃ はステートマシンの更新 こうしん を一時 いちじ 変数 へんすう (英語 えいご 版 ばん ) を宣言 せんげん せずに書 か くことができるようになった。これらの概念 がいねん はVerilog言語 げんご のセマンティックの一部 いちぶ となっているため、設計 せっけい 者 しゃ は大 だい 規模 きぼ な回路 かいろ の記述 きじゅつ を比較 ひかく 的 てき にコンパクトで簡潔 かんけつ な形式 けいしき ですばやく書 か くことができる。Verilogが開発 かいはつ された当初 とうしょ (1984年 ねん )、回路 かいろ 設計 せっけい 者 しゃ はグラフィカルな回路 かいろ 図 ず 入力 にゅうりょく (英語 えいご 版 ばん ) ソフトウェアや、ドキュメントと電子 でんし 回路 かいろ シミュレータ のためだけに書 か かれた特殊 とくしゅ なソフトウェアを使 つか っていたため、複雑 ふくざつ な回路 かいろ を簡潔 かんけつ に記述 きじゅつ できるVerilogは、極 きわ めて大 おお きな生産 せいさん 性 せい の向上 こうじょう をもたらした。
Verilogの設計 せっけい 者 しゃ は、言語 げんご の構文 こうぶん を、工学 こうがく 分野 ぶんや のソフトウェア開発 かいはつ で当時 とうじ すでに広 ひろ く普及 ふきゅう していたC言語 げんご と似 に たものにしたいと考 かんが えた。そのため、C言語 げんご のように、Verilogの識別子 しきべつし は ケース・センシティブ であり、基本 きほん 的 てき なプリプロセッサー を持 も っている(ただし、ANSI C/C++のものほどは洗練 せんれん されていない)。制御 せいぎょ フローのキーワード (if/else、for、while、caseなど)はC言語 げんご と同一 どういつ であり、演算 えんざん 子 こ の優先 ゆうせん 順位 じゅんい もC言語 げんご と互換 ごかん 性 せい がある。構文 こうぶん の違 ちが いとしては、変数 へんすう 宣言 せんげん にビット幅 はば が必要 ひつよう であることや、手続 てつづ きブロックの宣言 せんげん の相違 そうい (カーリー・ブレイス{}の代 か わりにbegin/endを使用 しよう する)があり、その他 た 多数 たすう の細 こま かな違 ちが いがある。Verilogは変数 へんすう に固定 こてい サイズを与 あた えなければならないが、C言語 げんご の場合 ばあい はサイズは変数 へんすう の「型 かた 」から推定 すいてい される(たとえば、整数 せいすう 型 がた は8ビットであると)。
Verilogのコードはモジュールの階層 かいそう (英語 えいご 版 ばん ) から構成 こうせい する。モジュールは設計 せっけい の階層 かいそう をカプセル化 か し、他 た のモジュールとは、宣言 せんげん された入力 にゅうりょく 、出力 しゅつりょく 、必要 ひつよう に応 おう じて双方向 そうほうこう ポートを使用 しよう して通信 つうしん する。モジュールの内部 ないぶ では、net/変数 へんすう の宣言 せんげん (wire、reg、integerなど)、並行 へいこう または逐次 ちくじ のステートメントブロック 、他 た のモジュールのインスタンス(サブ階層 かいそう )などの、あらゆる組 く み合 あ わせが記述 きじゅつ できる。逐次 ちくじ 的 てき な文 ぶん は、begin/endブロック内 ない に配置 はいち し、ブロック内 ない では逐次 ちくじ 的 てき に実行 じっこう される。しかし、ブロック自体 じたい は並列 へいれつ に実行 じっこう されるため、この特徴 とくちょう によりVerilogはデータフロー言語 げんご となっている。
次 つぎ に、配線 はいせん を示 しめ すwire、記憶 きおく 素子 そし を示 しめ すregとサブモジュールのリストなどを定義 ていぎ する。さらに、続 つづ いてその動作 どうさ を規定 きてい するステートメントやステートメントをグループにしたブロック群 ぐん を定義 ていぎ する。ブロックはbeginキーワードで始 はじ まり、endキーワードで終 お わる範囲 はんい で定義 ていぎ し、ブロック内 ない はステートメントが並列 へいれつ に実行 じっこう される。逐次 ちくじ 実行 じっこう したい場合 ばあい は、ブロッキング代入 だいにゅう を使 つか うか、クロックのタイミングを待 ま つ書 か き方 かた をする。各 かく ブロックは並列 へいれつ に実行 じっこう される。Verilogの'wire'の概念 がいねん は信号 しんごう の値 ね (4状態 じょうたい :"1、0、floating、undefined") と信号 しんごう の強度 きょうど (強 つよ い、弱 よわ いなど)からなる。このシステムのおかげで、共有 きょうゆう 信号 しんごう 線 せん の抽象 ちゅうしょう 的 てき なモデリングが可能 かのう になり、複数 ふくすう のソースで共通 きょうつう の回路 かいろ 網 もう を駆動 くどう することが可能 かのう になった。wireが複数 ふくすう のドライバーを持 も つ時 とき 、wireの(読 よ み取 と り可能 かのう な)値 ち はソースドライバーの関数 かんすう と強度 きょうど で解決 かいけつ される。
Verilog言語 げんご の文 ぶん のサブセットは、合成 ごうせい 可能 かのう である。RTL(register-transfer level; レジスタ転送 てんそう レベル)として知 し られる合成 ごうせい 可能 かのう なコーディングスタイルを使用 しよう して書 か かれたVerilogのモジュールは、合成 ごうせい ソフトウェアを使用 しよう することで物理 ぶつり 的 てき に実装 じっそう することができる。合成 ごうせい ソフトウェアは、アルゴリズムを用 もち いて、(抽象 ちゅうしょう 的 てき な)Verilogのソースをネットリストに変換 へんかん する。ネットリスト (英語 えいご 版 ばん ) とは、特定 とくてい のFPGA やVLSI 技術 ぎじゅつ で利用 りよう 可能 かのう な基本 きほん ゲート(AND、OR、NOT、フリップフロップなど)のみからなるソースコードと論理 ろんり 的 てき に等価 とうか な記述 きじゅつ である。さらにネットリストに修正 しゅうせい を加 くわ えることで、究極 きゅうきょく 的 てき には(ASIC のフォトマスク のセットやFPGAのビットストリーム などの)電子 でんし 回路 かいろ 製造 せいぞう の設計 せっけい 図 ず を生成 せいせい することが可能 かのう である。
「Verilog-HDL」という表記 ひょうき が用 もち いることがあるが、IEEEなどの文書 ぶんしょ では「Verilog」と「HDL」との間 あいだ にハイフンが入 はい らない「Verilog HDL」のように表記 ひょうき されている。
Verilogは、ゲートウェイ・デザイン・オートメーション (英語 えいご 版 ばん ) 社 しゃ のフィル・ムーアビー が、ハードウェア・モデリング言語 げんご とそのためのシミュレータとして1984年 ねん 頃 ころ 開発 かいはつ した。その後 ご 、同社 どうしゃ は1990年 ねん にケイデンス・デザイン・システムズ が買収 ばいしゅう した。ケイデンスは、現在 げんざい も大元 おおもと のゲートウェイVerilogおよびVerilog-XL論理 ろんり シミュレータの版権 はんけん を持 も っている。
同種 どうしゅ のハードウェア記述 きじゅつ 言語 げんご であるVHDL の台頭 たいとう に対 たい し、ケイデンスはVerilogの規格 きかく を公開 こうかい し標準 ひょうじゅん 化 か する道 みち をとり、OVI(Open Verilog International)と呼 よ ばれる組織 そしき へ版権 はんけん の一部 いちぶ を移譲 いじょう した。OVI LRM2.0に準拠 じゅんきょ したVerilogシミュレータとしてSimucad 社 しゃ が開発 かいはつ したSILOS IIIは、1993年 ねん には日本 にっぽん で発売 はつばい されていた。それと前後 ぜんご した1993年 ねん 6月 がつ には、IEEE1364として標準 ひょうじゅん 化 か が開始 かいし された。その後 ご 、Verilogの規格 きかく がIEEE に提出 ていしゅつ され、IEEE 1364-1995[ 4] として標準 ひょうじゅん 化 か された。この標準 ひょうじゅん は、Verilog-1995と呼 よ ばれる。なお、OVIはその後 ご Accelleraという組織 そしき になっている。
標準 ひょうじゅん 化 か にともない、ケイデンス社 しゃ 以外 いがい の会社 かいしゃ やフリーソフトのVerilogシミュレータが登場 とうじょう するようになった。
オリジナルのVerilog標準 ひょうじゅん に対 たい する不満 ふまん を解消 かいしょう するために、Verilog-1995に対 たい する拡張 かくちょう がなされた。この拡張 かくちょう はVerilog 2001といいIEEE 1364-2001[ 5] になった。VHDLにあったgenerate文 ぶん に対応 たいおう し、大 だい 規模 きぼ 設計 せっけい が容易 ようい になった。
やがてOpenVeraやVerisityのE言語 げんご のようなハイ・レベルの検証 けんしょう 言語 げんご が登場 とうじょう する。このことはその種 たね の機能 きのう を盛 も り込 こ んだVerilog、すなわちコデザイン・オートメーション社 しゃ によるSuperlogの開発 かいはつ を促 うなが すこととなった。コデザイン・オートメーション社 しゃ は、シノプシス によってその後 ご 買収 ばいしゅう された。SuperlogとVeraの基本 きほん 部分 ぶぶん はAccelleraに寄贈 きぞう され、次 つぎ のIEEE標準 ひょうじゅん としてSystemVerilog とVerilogとに分 わ かれた。
言語 げんご の最新 さいしん のバージョンは、アナログ素子 そし および回路 かいろ の機能 きのう 記述 きじゅつ を行 おこな うための言語 げんご であるVerilog-A を包含 ほうがん し、さらにアナログ/デジタルのミックス・シグナル・モデルへの対応 たいおう もなされており、Verilog-AMS という。
IEEE 1364-2005[ 6] として規格 きかく 化 か 。その際 さい 、上位 じょうい 互換 ごかん の SystemVerilog IEEE 1800-2005 も作 つく った。
IEEE/IEC 62530-2011 - SystemVerilog – Unified Hardware Design, Specification, and Verification Language
[ 7] として、Verilog HDLとSystem Verilogの文書 ぶんしょ を一本 いっぽん 化 か した。
簡単 かんたん な2フリップフロップの例 れい を以下 いか に示 しめ す。
module toplevel ( clock , reset );
input clock ;
input reset ;
reg flop1 ;
reg flop2 ;
always @ ( posedge reset or posedge clock )
if ( reset )
begin
flop1 <= 0 ;
flop2 <= 1 ;
end
else
begin
flop1 <= flop2 ;
flop2 <= flop1 ;
end
endmodule
Verilogにおける"<="演算 えんざん 子 こ は、普通 ふつう の手続 てつづ き型 がた 言語 げんご とは異 こと なる、ハードウェア記述 きじゅつ 言語 げんご としてのもう1つの側面 そくめん である。この演算 えんざん 子 こ は「ノンブロッキング」代入 だいにゅう 文 ぶん として知 し られ、alwaysブロックが実行 じっこう されるまでアクションは登録 とうろく されない。つまり、代入 だいにゅう 文 ぶん を書 か いた順序 じゅんじょ は無関係 むかんけい であり、必 かなら ず同 おな じ結果 けっか が生 しょう じる。そのため、flop1とflop2はクロックごとに値 ね がスワップされることになる。
もう1つの代入 だいにゅう 演算 えんざん 子 こ である"="は、ブロッキング代入 だいにゅう 文 ぶん と呼 よ ばれる。"="による代入 だいにゅう が行 おこな われると、代入 だいにゅう 先 さき の値 ね は即座 そくざ に更新 こうしん される。もし上 うえ の例 れい で"<="の代 か わりにブロッキング演算 えんざん 子 こ の"="を使用 しよう したとすると、flop1とflop2の値 ね はスワップされず、手続 てつづ き型 がた プログラミング言語 げんご のように、コンパイラはflop1の値 ね をflop2の値 ね にセットするのだと解釈 かいしゃく する(その結果 けっか 、flop2とflop1の値 ね にセットするという冗長 じょうちょう な論理 ろんり は無視 むし されることになる)。
モジュールはキーワードmoduleで始 はじ まる。その後 ご のDiv20xが名前 なまえ を示 しめ し、続 つづ く括弧 かっこ 内 ない は端子 たんし リストである。6個 こ の端子 たんし があり、それぞれの端子 たんし の入出力 にゅうしゅつりょく 方向 ほうこう はモジュール中 ちゅう のポート宣言 せんげん (inputとoutput)で指定 してい される。最後 さいご のendmoduleでモジュールの終了 しゅうりょう である。モジュール内 ない には、パラメータ宣言 せんげん 、ポート宣言 せんげん 、レジスタ宣言 せんげん 、イベント宣言 せんげん 、ネット宣言 せんげん 、ステートメントなどを記述 きじゅつ する。
//
// 表題 ひょうだい イネーブル付 づけ 20段 だん カウンター
//
module Div20x (
// ポート宣言 せんげん (外部 がいぶ から本 ほん モジュールへの接続 せつぞく を定義 ていぎ する)
input clock , // クロック
input reset , // リセット(正 せい 論理 ろんり , ハイアクティブ)
input cet , // カウンターとTC出力 しゅつりょく のイネーブル
input cep , // カウンターのみのイネーブル
output reg [ size - 1 : 0 ] count , // 束 たば 線 せん を示 しめ す。この場合 ばあい 5bit幅 はば
// alwaysまたはinitialブロックでドライブする信号 しんごう は
// reg型 がた でなければならない
output tc ); // regと明記 めいき していない、他 た の信号 しんごう はwire型 がた 。
// ポート宣言 せんげん したwire型 がた 信号 しんごう のネット宣言 せんげん は省略 しょうりゃく 可能 かのう であり、省略 しょうりゃく することも多 おお い。
// パラメータ宣言 せんげん
parameter length = 20 ; // カウント段数 だんすう
parameter count_zero = 5 'b00000 ; // 5bit幅 はば ,2進数 しんすう の0を表 あらわ す
parameter count_one = 5 'b00001 ; // 5bit幅 はば ,2進数 しんすう の1を表 あらわ す
parameter size = 5 ; // bit幅 はば ,基数 きすう の指定 してい を省略 しょうりゃく すると32bit,10進数 しんすう になる。
// always文 ぶん 。resetやclock信号 しんごう の変化 へんか に同期 どうき し並列 へいれつ に実行 じっこう される
always @ ( posedge clock or posedge reset ) begin
if ( reset ) begin // 非同期 ひどうき リセット
count <= count_zero ;
end else begin
if ( cet || cep ) begin // イネーブル
if ( count == length - 1 ) begin
count <= count_zero ;
end else begin
count <= count + count_one ;
end
end
end
end
// assign文 ぶん 。tcの値 ね は実行 じっこう 中 ちゅう 、継続 けいぞく 的 てき に値 ね が与 あずか る
assign tc = ( cet && ( count == length - 1 ));
endmodule
ポート宣言 せんげん やレジスタ宣言 せんげん での[a:b]のような形式 けいしき は、束 たば 線 せん (多 おお くはバス)を示 しめ す。例 たと えば[3:0]であれば配線 はいせん が4本 ほん あることになる。always節 ぶし は、括弧 かっこ 内 ない の信号 しんごう を指定 してい した条件 じょうけん に変化 へんか があったときに実行 じっこう される。posedgeは信号 しんごう が0から1に変化 へんか した場合 ばあい を指定 してい する。orは括弧 かっこ 内 ない の信号 しんごう のどれか1つでも変化 へんか した場合 ばあい を指定 してい する。上記 じょうき のように、resetに合 あ わせてreg型 がた を初期 しょき 化 か するのが基本 きほん 的 てき なデザインパターン である。
ディレイの例 れい は以下 いか の通 とお りである。
...
reg a , b , c , d ;
wire e ;
...
always @( b or e )
begin
a = b & e ;
b = a | b ;
# 5 c = b ;
d = # 6 c ^ e ;
end
上記 じょうき のalways 節 ふし は、もう1つの使 つか い方 かた を示 しめ している。たとえば、上 うえ の例 れい では、リストに含 ふく まれる要素 ようそ (b またはe )が変化 へんか したタイミングでいつでもalways節 ぶし が実行 じっこう される。いずれかの変数 へんすう が変化 へんか すると、即座 そくざ に新 あたら しい値 ね がa に代入 だいにゅう される。ブロッキング代入 だいにゅう 文 ぶん を使用 しよう しているため、b にはその代入 だいにゅう 後 ご に(a の新 あたら しい値 ね を用 もち いて)新 あたら しい値 ね が代入 だいにゅう される。5単位 たんい 時間 じかん のディレイの後 のち 、c にb の値 ね が代入 だいにゅう されると同時 どうじ に、c ^ e の値 ね が計算 けいさん され、見 み えない保管 ほかん 場所 ばしょ に一時 いちじ 的 てき に保存 ほぞん される。6単位 たんい 時間 じかん 後 ご 、保管 ほかん されていた値 ね がd に代入 だいにゅう される。
プロセス内 ない (initialまたはalwaysブロック内 ない )で操作 そうさ される信号 しんごう は、reg 型 かた を持 も つ必要 ひつよう がある。また、プロセスの外 そと で操作 そうさ される信号 しんごう はwire 型 かた を持 も たなければならない。この時 とき 使 つか われるreg という名前 なまえ は、必 かなら ずしもハードウェアのレジスタを意味 いみ するわけではない。
Verilogにおける定数 ていすう の定義 ていぎ では、追加 ついか のビット幅 はば パラメータがサポートされている。基本 きほん 的 てき な構文 こうぶん は次 つぎ のとおりである。
<ビット幅 はば >'<基数 きすう を表 あらわ す文字 もじ ><数字 すうじ >
例 れい :
12'h123 — 16進数 しんすう (hexadecimal)の123(12ビットを使用 しよう )
20'd44 — 10進数 しんすう (decimal)44 (20ビットを使用 しよう 。未 み 使用 しよう 桁 けた への0の付加 ふか は自動 じどう で行 おこな われる)
4'b1010 — 2進数 しんすう (Binary)1010(4ビットを使用 しよう )
6'o77 — 8進数 しんすう (octal)の77(6ビットを使用 しよう )
回路 かいろ として合成 ごうせい 可能 かのう な構成 こうせい [ 編集 へんしゅう ]
Verilogのいくつかの文 ぶん は、たとえば$display文 ぶん など、現実 げんじつ のハードウェアでは物理 ぶつり 的 てき に実装 じっそう できないものもある。そのため、言語 げんご の多 おお くの機能 きのう はハードウェアを記述 きじゅつ するためには使用 しよう できない。以下 いか に示 しめ す例 れい では、直接 ちょくせつ 物理 ぶつり 的 てき なゲートに対応 たいおう する、合成 ごうせい 可能 かのう な言語 げんご の典型 てんけい 的 てき なサブセットを使用 しよう している。
// Mux の例 れい — 同 おな じ動作 どうさ をする例 れい を3種類 しゅるい の方法 ほうほう で示 しめ す。
// 1番目 ばんめ の例 れい は連続 れんぞく 束縛 そくばく を使用 しよう している。
wire out ;
assign out = sel ? a : b ;
// 2番目 ばんめ の例 れい は同 おな じことを行 おこな うために手続 てつづ き的 てき な表現 ひょうげん を使用 しよう している。
reg out ;
always @( a or b or sel )
begin
case ( sel )
1 'b0 : out = b ;
1 'b1 : out = a ;
endcase
end
// 3番目 ばんめ の例 れい : 手続 てつづ き構造 こうぞう の中 なか で if/else 文 ぶん を使用 しよう することもできる。
reg out ;
always @( a or b or sel )
if ( sel )
out = a ;
else
out = b ;
次 つぎ の非常 ひじょう によく使 つか われる例 れい は、フリップフロップ である。Verilogでは、D-フリップフロップが最 もっと も簡単 かんたん に記述 きじゅつ でき、以下 いか のようにモデリングできる。
reg q ;
always @( posedge clk )
q <= d ;
例 れい の中 なか で注目 ちゅうもく すべき重要 じゅうよう な点 てん は、ノンブロッキング代入 だいにゅう を使用 しよう していることである。基本 きほん 的 てき な経験 けいけん 則 そく (rule of thumb (英語 えいご 版 ばん ) )として、always節 ぶし の中 なか でposedge またはnegedge 文 ぶん を使用 しよう する場合 ばあい には、<=
を使用 しよう するとよい。
Dフリップフロップの変種 へんしゅ として、非同期 ひどうき リセット機能 きのう を付加 ふか したものがある。慣習 かんしゅう として、以下 いか のようにリセット状態 じょうたい をチェックするコードを文 ぶん 内 ない の最初 さいしょ のif節 ぶし とすることが多 おお い。
reg q ;
always @( posedge clk or posedge reset )
if ( reset )
q <= 0 ;
else
q <= d ;
Varilogの処理 しょり を宣言 せんげん する方法 ほうほう には、always キーワードとinitial キーワードという異 こと なる2つの方法 ほうほう がある。always キーワードは、自由 じゆう に実行 じっこう される処理 しょり を表 あらわ す。initial キーワードは、ちょうど1回 かい だけ実行 じっこう される処理 しょり を表 あらわ す。2つの処理 しょり はともに、シミュレーター時刻 じこく 0に実行 じっこう が開始 かいし され、ともにブロックの終 お わりまで実行 じっこう される。always ブロックの場合 ばあい 、処理 しょり がブロックの最後 さいご に到達 とうたつ すると、実行 じっこう が再度 さいど スケジュールされる。よくある間違 まちが いは、initialブロックは常 つね にalwaysブロックの前 まえ に最初 さいしょ に実行 じっこう されるというものである。実際 じっさい には、initial ブロックは、1回 かい 目 め の実行 じっこう 時 じ に終了 しゅうりょう する特殊 とくしゅ なalways -ブロックであると考 かんが えるとよい。
// 例 れい :
initial
begin
a = 1 ; // reg a の値 ね を 0 に束縛 そくばく する
# 1 ; // 1 単位 たんい 時間 じかん 待 ま つ
b = a ; // reg a の値 ね を reg b の値 ね に束縛 そくばく する
end
always @( a or b ) // a または b が *変更 へんこう された* タイミングで処理 しょり が行 おこな われる
begin
if ( a )
c = b ;
else
d = ~ b ;
end // このブロックが終了 しゅうりょう すると、先頭 せんとう から処理 しょり が再開 さいかい される (例 れい : @ event-control)
always @( posedge a ) // reg a が low から high に変更 へんこう されるたびに実行 じっこう される
a <= b ;
上記 じょうき 2つは、これら2つのキーワードの典型 てんけい 的 てき な使用 しよう 例 れい であるが、更 さら に2つの特徴 とくちょう 的 てき な使用 しよう 例 れい がある。最 もっと もよく使 つか うのが、信号 しんごう 強度 きょうど を書 か いたリスト@(...) なしでalways キーワード使用 しよう する方法 ほうほう である。alwaysは以下 いか のように使用 しよう することもできる。
always
begin // always は時刻 じこく 0に実行 じっこう が始 はじ まり、*決 けっ して* 終了 しゅうりょう しない
clk = 0 ; // clk を 0 にセットする
# 1 ; // 1 単位 たんい 時間 じかん 待 ま つ
clk = 1 ; // clk を 1 にセットする
# 1 ; // 1 単位 たんい 時間 じかん 待 ま つ
end // 実行 じっこう を続 つづ ける — したがって、begin から実行 じっこう が再開 さいかい する
always キーワードは、C言語 げんご のwhile(1) {..} 構造 こうぞう と同 おな じように無限 むげん ループとして振 ふ る舞 ま う。
もう1つの特徴 とくちょう 的 てき な使用 しよう 例 れい は、initial キーワードにforever キーワードを追加 ついか するというものである。
次 つぎ の例 れい は、上 うえ のalways の例 れい と同等 どうとう である。
initial forever // 時刻 じこく 0 で実行 じっこう が開始 かいし され、begin/end の間 あいだ の処理 しょり を永遠 えいえん に (forever) 繰 く り替 か える
begin
clk = 0 ; // clk を 0 にセットする
# 1 ; // 1 単位 たんい 時間 じかん 待 ま つ
clk = 1 ; // clk を 1 にセットする
# 1 ; // 1 単位 たんい 時間 じかん 待 ま つ
end
fork/join のペアは、Verilog内 ない で並列 へいれつ 処理 しょり を作 つく るために使 つか われる。fork/joinのペアの間 あいだ にある文 ぶん (またはブロック)は、実行 じっこう フローでfork に到達 とうたつ したタイミングで同時 どうじ に実行 じっこう が開始 かいし され、fork とjoin の間 あいだ で最 もっと も長 なが い時間 じかん 実行 じっこう される文 ぶん またはブロックの終了 しゅうりょう 後 ご 、残 のこ りのコードの実行 じっこう が再開 さいかい する。
initial
fork
$write ( "A" ); // 文字 もじ A を出力 しゅつりょく する
$write ( "B" ); // 文字 もじ B を出力 しゅつりょく する
begin
# 1 ; // 1 単位 たんい 時間 じかん 待 ま つ
$write ( "C" ); // 文字 もじ C を出力 しゅつりょく する
end
join
上 うえ のように書 か いた場合 ばあい 、出力 しゅつりょく は"ABC"または"BAC"のいずれにもなる可能 かのう 性 せい がある。最初 さいしょ の$writeと2番目 ばんめ の$writeのシミュレーションの実行 じっこう 順序 じゅんじょ は、シミュレータの実装 じっそう に依存 いぞん するためである。シミュレータによっては、意図 いと 的 てき に順序 じゅんじょ をランダム化 か していることもある。そのため、偶然 ぐうぜん 競合 きょうごう 状態 じょうたい が起 お きたり、意図 いと 的 てき な非 ひ 決定的 けっていてき な振 ふ る舞 ま いをする場合 ばあい がある。
VHDLは、Verilogとは違 ちが い、複数 ふくすう のプロセスを動的 どうてき に生成 せいせい することはできない[ 8] 。
Verilogでは、実行 じっこう の順序 じゅんじょ は常 つね に保証 ほしょう されるわけではない。これは、典型 てんけい 的 てき な例 れい で最 もっと もよく示 しめ すことができる。次 つぎ のコードスニペットについて考 かんが えてみる。
initial
a = 0 ;
initial
b = a ;
initial
begin
# 1 ;
$display ( "Value a=%d Value of b=%d" , a , b );
end
aおよびbの値 ね として出力 しゅつりょく されるのはどんな値 ね だろうか?initialブロックの実行 じっこう 順序 じゅんじょ によって、それぞれ0と0になる場合 ばあい と、0と何 なん らかの初期 しょき 化 か されていない値 ね となる場合 ばあい の2パターンがありえる。ただし、$display文 ぶん は#1ディレイを挟 はさ んでいるため、2つの代入 だいにゅう ブロックより後 のち に実行 じっこう されることが常 つね に保証 ほしょう されている。
注意 ちゅうい :これらの演算 えんざん 子 こ は優先 ゆうせん 度 ど の順 じゅん に並 なら んでいるわけではない 。
演算 えんざん の種類 しゅるい
演算 えんざん 子 こ 記号 きごう
実行 じっこう する演算 えんざん
ビット操作 そうさ
~
ビット単位 たんい NOT(1ビットの否定 ひてい )
&
ビット単位 たんい AND
|
ビット単位 たんい OR
^
ビット単位 たんい XOR
~^ または ^~
ビット単位 たんい XNOR
論理 ろんり 演算 えんざん
!
NOT
&&
AND
||
OR
リダクション
&
Reduction AND
~&
Reduction NAND
|
Reduction OR
~|
Reduction NOR
^
Reduction XOR
~^ または ^~
Reduction XNOR
数値 すうち 演算 えんざん
+
加算 かさん
-
減算 げんざん
-
次 つぎ の値 ね の否定 ひてい
*
乗算 じょうざん
/
除算 じょざん
**
べき乗 じょう (*Verilog-2001)
関係 かんけい 演算 えんざん
>
大 だい なり
<
小 しょう なり
>=
以上 いじょう
<=
以下 いか
==
論理 ろんり 的 てき に等 ひと しい(1'bXのビット値 ち は比較 ひかく 対象 たいしょう から除外 じょがい される)
!=
論理 ろんり 的 てき に異 こと なる(1'bXのビット値 ち は比較 ひかく 対象 たいしょう から除外 じょがい される)
===
4値 ち 理論 りろん で等 ひと しい(1'bXのビット値 ち はリテラルとみなされる)
!==
4値 ち 理論 りろん で異 こと なる(1'bXのビット値 ち はリテラルとみなされる)
シフト操作 そうさ
>>
論理 ろんり 右 みぎ シフト
<<
論理 ろんり 左 ひだり シフト
>>>
算術 さんじゅつ 右 みぎ シフト(*Verilog-2001)
<<<
算術 さんじゅつ 左 ひだり シフト(*Verilog-2001)
連結 れんけつ
{ および }
連結 れんけつ
複製 ふくせい
{n{m}}
値 ね mをn回 かい 複製 ふくせい する
条件 じょうけん 分岐 ぶんき
? :
条件 じょうけん 分岐 ぶんき
IEEE 1364標準 ひょうじゅん では、0、1、Z(ハイ・インピーダンス )、X(論理 ろんり 値 ち が未知 みち )の4つの状態 じょうたい を使用 しよう する4値 ち 理論 りろん (英語 えいご 版 ばん ) が定義 ていぎ されている。一方 いっぽう 、Verilogの競合 きょうごう であるVHDLの標準 ひょうじゅん IEEE 1164 (英語 えいご 版 ばん ) では、9つのレベルを持 も つ多値 たち 理論 りろん が定義 ていぎ されている。
システムタスクは、シミュレーション中 ちゅう に単純 たんじゅん なI/Oや設計 せっけい 測定 そくてい 関数 かんすう を操作 そうさ するために利用 りよう できる。すべてのシステムタスクは、$ が接頭 せっとう 辞 じ になっており、ユーザー定義 ていぎ のタスクや関数 かんすう と区別 くべつ される。このセクションでは、最 もっと もよく使用 しよう されるタスクの一覧 いちらん を紹介 しょうかい する。完全 かんぜん なリストではないことに注意 ちゅうい 。
$display — 1行 ぎょう を画面 がめん に表示 ひょうじ する。自動 じどう で改行 かいぎょう 文字 もじ を付加 ふか する。
$write — 1行 ぎょう を画面 がめん に表示 ひょうじ する。改行 かいぎょう 文字 もじ は加 くわ えない。
$swrite — 改行 かいぎょう 文字 もじ 無 な しで変数 へんすう を1行 ぎょう で出力 しゅつりょく する。
$sscanf — 変数 へんすう から書式 しょしき 指定 してい で文字 もじ 列 れつ を読 よ み込 こ む。 (*Verilog-2001)
$fopen — ファイルハンドルを開 ひら く。読 よ み込 こ みまたは書 か き込 こ みのために使用 しよう する。
$fdisplay — ファイルに1行 ぎょう を書 か き込 こ む。自動 じどう で改行 かいぎょう 文字 もじ を付加 ふか する。
$fwrite — ファイルに1行 ぎょう を書 か き込 こ む。改行 かいぎょう 文字 もじ は加 くわ えない。
$fscanf — ファイルから書式 しょしき 指定 してい で文字 もじ 列 れつ を読 よ み込 こ む。(*Verilog-2001)
$fclose — オープンしたファイルハンドルを閉 と じて開放 かいほう する。
$readmemh — 16進数 しんすう ファイルの内容 ないよう をメモリ配列 はいれつ に読 よ み込 こ む。
$readmemb — バイナリファイルの内容 ないよう をメモリ配列 はいれつ に読 よ み込 こ む。
$monitor — 何 なん らかの変更 へんこう が発生 はっせい した時 とき に、すべての変数 へんすう リストを出力 しゅつりょく する。
$time — 現在 げんざい のシミュレーション時刻 じこく の値 ね 。
$dumpfile — VCD(Value Change Dump )フォーマットでの出力 しゅつりょく ファイル名 めい を宣言 せんげん する。
$dumpvars — 変数 へんすう を有効 ゆうこう にしてダンプする。
$dumpports — 変数 へんすう を有効 ゆうこう にしてExtended-VCDフォーマットでダンプする。
$random — ランダムな値 ね を返 かえ す。
PLI(Program Language Interface)は、プログラマーに対 たい して、VerilogからC言語 げんご で書 か かれたプログラムに制御 せいぎょ を移 うつ すことを可能 かのう にするメカニズムを提供 ていきょう する。IEEE Std 1364-2005において、PLIは新 あたら しいVerilog Procedural Interface (英語 えいご 版 ばん ) に完全 かんぜん に置 お き換 か えられて公式 こうしき に非 ひ 推奨 すいしょう となった。
PLI(現在 げんざい はVPI)を利用 りよう することで、Verilogは、たとえば、テストハーネス 、マイクロプロセッサ の命令 めいれい セットシミュレータ 、デバッガ など、C言語 げんご で書 か かれた他 ほか のプログラムと連携 れんけい することができる。たとえば、PLIはC言語 げんご の関数 かんすう tf_putlongp()
およびtf_getlongp()
を提供 ていきょう しており、この関数 かんすう を利用 りよう すると、現在 げんざい のVerilogタスクや関数 かんすう の引数 ひきすう の値 ね を読 よ み書 か きすることができる。具体 ぐたい 的 てき には、tf_putlongp(pin, lower_32, higher_32)
は、C言語 げんご 側 がわ の higher_32
と lower_32
を、Verilog側 がわ の64幅 ぶく のpin信号 しんごう にセットすることができ, lower_32 = tf_getlongp(higher_32, pin)
は、Verilog側 がわ の64幅 ぶく のpin信号 しんごう を読 よ み出 だ し、その上位 じょうい と下位 かい をC言語 げんご 側 がわ の変数 へんすう higher_32
と lower_32
にそれぞれセットする。
SpyGlass (Synopsys)
Leda (Synopsys)
ALINT (Aldec)
Accent lint (Real Intent)
^ “Genetic circuit design automation” . Science 352 (6281): aac7341. (2016). doi :10.1126/science.aac7341 . PMID 27034378 . http://science.sciencemag.org/content/352/6281/aac7341 .
^ 1364-1995 IEEE Standard Hardware Description Language Based on the Verilog(R) Hardware Description Language
^ 1364-2001 IEEE Standard Verilog Hardware Description Language
^ 1364-2005 IEEE Standard for Verilog Hardware Description Language
^ http://standards.ieee.org/findstds/standard/62530-2011.html
^ Cummings, Clifford E. (2003年 ねん ). “SystemVerilog — Is This The Merging of Verilog & VHDL? ” (PDF). SNUG Boston 2003. 2018年 ねん 7月 がつ 17日 にち 閲覧 えつらん 。
E.Sternheim/R.Singh/R.Madhavan/Y.Trivedi 著 ちょ 、井上 いのうえ 博史 ひろふみ /鈴木 すずき 隆 たかし 訳 やく 『Verilog-HDLトップダウン設計 せっけい 』CQ出版 しゅっぱん 社 しゃ 、1994,1995。ISBN 4-7898-3216-3 。
Thomas, Donald E.; Moorby, Philip R. (1996). The Verilog Hardware Description Language, THIRD EDITION . KLUWER ACADEMIC PUBLISHER. ISBN 0-7923-9723-1
『インターフェース』1993年 ねん 12月 がつ 号 ごう 、CQ出版 しゅっぱん 社 しゃ 、1993年 ねん 12月。