(Translated by https://www.hiragana.jp/)
Verilog - Wikipedia コンテンツにスキップ

Verilog

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
Verilog
パラダイム 構造こうぞうプログラミング
登場とうじょう時期じき 1984ねん (1984)
最新さいしんリリース IEEE/IEC 62530:2011/ 2011ねん5がつ19にち (13ねんまえ) (2011-05-19)
型付かたつ よわ静的せいてき型付かたつ
影響えいきょうけた言語げんご Pascal, C言語げんご,VHDL
影響えいきょうあたえた言語げんご SystemVerilog
ライセンス IEEE/IEC standard
拡張子かくちょうし .v
テンプレートを表示ひょうじ

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のソースをネットリストに変換へんかんする。ネットリスト英語えいごばんとは、特定とくていFPGAVLSI技術ぎじゅつ利用りよう可能かのう基本きほんゲート(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ねんには日本にっぽん発売はつばいされていた[2]。それと前後ぜんごした1993ねん6がつには、IEEE1364として標準ひょうじゅん開始かいしされた[3]。その、Verilogの規格きかくIEEE提出ていしゅつされ、IEEE 1364-1995[4]として標準ひょうじゅんされた。この標準ひょうじゅんは、Verilog-1995とばれる。なお、OVIはそのAccelleraという組織そしきになっている。

標準ひょうじゅんにともない、ケイデンスしゃ以外いがい会社かいしゃやフリーソフトのVerilogシミュレータが登場とうじょうするようになった。

Verilog 2001

[編集へんしゅう]

オリジナルのVerilog標準ひょうじゅんたいする不満ふまん解消かいしょうするために、Verilog-1995にたいする拡張かくちょうがなされた。この拡張かくちょうはVerilog 2001といいIEEE 1364-2001[5]になった。VHDLにあったgenerateぶん対応たいおうし、だい規模きぼ設計せっけい容易よういになった。

Superlog/System Verilog

[編集へんしゅう]

やがてOpenVeraやVerisityのE言語げんごのようなハイ・レベルの検証けんしょう言語げんご登場とうじょうする。このことはそのたね機能きのうんだVerilog、すなわちコデザイン・オートメーションしゃによるSuperlogの開発かいはつうながすこととなった。コデザイン・オートメーションしゃは、シノプシスによってその買収ばいしゅうされた。SuperlogとVeraの基本きほん部分ぶぶんはAccelleraに寄贈きぞうされ、つぎのIEEE標準ひょうじゅんとしてSystemVerilogとVerilogとにかれた。

言語げんご最新さいしんのバージョンは、アナログ素子そしおよび回路かいろ機能きのう記述きじゅつおこなうための言語げんごであるVerilog-A包含ほうがんし、さらにアナログ/デジタルのミックス・シグナル・モデルへの対応たいおうもなされており、Verilog-AMSという。

Verilog 2005

[編集へんしゅう]

IEEE 1364-2005[6] として規格きかく。そのさい上位じょうい互換ごかんの SystemVerilog IEEE 1800-2005 もつくった。

System Verilog 2011

[編集へんしゅう]

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単位たんい時間じかんのディレイののちcb代入だいにゅうされると同時どうじに、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;

initialとalwaysキーワード

[編集へんしゅう]

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到達とうたつしたタイミングで同時どうじ実行じっこう開始かいしされ、forkjoinあいだもっとなが時間じかん実行じっこうされるぶんまたはブロックの終了しゅうりょうのこりのコードの実行じっこう再開さいかいする。

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かい複製ふくせいする
条件じょうけん分岐ぶんき ? : 条件じょうけん分岐ぶんき

4理論りろん

[編集へんしゅう]

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_32lower_32 を、Verilogがわの64ぶくのpin信号しんごうにセットすることができ, lower_32 = tf_getlongp(higher_32, pin)は、Verilogがわの64ぶくのpin信号しんごうし、その上位じょうい下位かいをC言語げんごがわ変数へんすう higher_32lower_32 にそれぞれセットする。

主要しゅようソフトウェア

[編集へんしゅう]

シミュレータ

[編集へんしゅう]

論理ろんり合成ごうせい

[編集へんしゅう]

lint チェックツール

[編集へんしゅう]
  • SpyGlass (Synopsys)
  • Leda (Synopsys) 
  • ALINT (Aldec) 
  • Accent lint (Real Intent)

出典しゅってん

[編集へんしゅう]
  1. ^ “Genetic circuit design automation”. Science 352 (6281): aac7341. (2016). doi:10.1126/science.aac7341. PMID 27034378. http://science.sciencemag.org/content/352/6281/aac7341. 
  2. ^ インターフェース 1993ねん12がつごう, p. 14,184-188.
  3. ^ インターフェース 1993ねん12がつごう, p. 185.
  4. ^ 1364-1995 IEEE Standard Hardware Description Language Based on the Verilog(R) Hardware Description Language
  5. ^ 1364-2001 IEEE Standard Verilog Hardware Description Language
  6. ^ 1364-2005 IEEE Standard for Verilog Hardware Description Language
  7. ^ http://standards.ieee.org/findstds/standard/62530-2011.html
  8. ^ 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月。 

関連かんれん項目こうもく

[編集へんしゅう]