Verilog

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

Verilog(ヴェリログ)は、デジタル回路の設計用のハードウェア記述言語であり、Verilogの開発環境には、論理シミュレータを含む場合がある。言語とシミュレータを区別する場合、言語の方を「Verilog HDL」と呼ぶ場合もある。 言語の開発にあたっては、ソフトウェア開発者にも受け入れられるようにソフトウェアのプログラム言語C言語Pascalの要素を取り入れたものとなっている。

ソフトウェアのプログラミング言語との相違点として、文(ステートメント)の実行を必ずしも逐次に行わず、並列実行する場合がある。これは、並列動作する電子回路を記述する言語だからである。また、Verilogモデルは実際のハードウェアの構成に近いモジュールの階層を構成できる。モジュールではまず、入力/出力端子、必要に応じて双方向端子を宣言する。次に、配線を示すwire、記憶素子を示すregとサブモジュールのリストなどを定義する。さらに、続いてその動作を規定する文(ステートメント)や文(ステートメント)をグループにしたブロック群を定義する。ブロックはbeginキーワードで始まり、endキーワードで終わる範囲で定義し、その中は順番に実行する。しかし、各ブロックは並列に実行できる。

Verilog言語には、論理合成を適用して実際の回路に変換可能な記述とそうではない部分がある。設計中のモジュールが全て合成可能な文(ステートメント)だけで記述している場合、適切なソフトウェアを用いて半導体チップの回路、さらにレイアウトデータまで変換することができる。

「Verilog-HDL」という表記が用いられることがあるが、正しくは「Verilog」と「HDL」との間にハイフンが入らない「Verilog HDL」である。


目次

歴史

始まり

Verilogは、ゲートウェイ・デザイン・オートメーション社が、ハードウェア・モデリング言語とそのためのシミュレータとして1984年頃開発した。その後、同社は1990年ケイデンス・デザイン・システムズが買収した。ケイデンスは、現在も大元のゲートウェイVerilogおよびVerilog-XL論理シミュレータの版権を持っている。

標準化

同種のハードウェア記述言語であるVHDLの台頭に対し、ケイデンスはVerilogの規格を公開し標準化する道をとった。すなわちケイデンスはOVI(Open Verilog International)という組織へ版権の一部を移譲した。その後VerilogをIEEEに提出しIEEE 1364-1995として規格化し、Verilog-1995と呼ぶ。なおOVIはその後Accelleraという組織になっている。

標準化にともないVerilogシミュレータは、ケイデンス以外の各社やフリーのものも各種登場するようになった。

Verilog 2001

オリジナルのVerilog標準に対する不満を解消するために、Verilog-95に対する拡張をIEEEに提出した。この拡張はVerilog 2001といいIEEE 1364-2001になった。VHDLにあったgenerate文に対応し、大規模設計が容易になった。

Superlog/System Verilog

やがてOpenVeraやVerisityのE言語のようなハイ・レベルの検証言語が登場する。このことはその種の機能を盛り込んだVerilog、すなわちコデザイン・オートメーション社によるSuperlogの開発を促すこととなった。コデザイン・オートメーション社は、シノプシスによってその後買収された。SuperlogとVeraの基本部分はAccelleraに寄贈され、次のIEEE標準としてSystemVerilogとVerilogとに分かれた。

言語の最新のバージョンは、アナログおよびアナログ/デジタルのミックス・シグナル・モデルへの対応もなされておりVerilog-amsという。

文法(抜粋)

キーワード

module(入出力端子リスト) .. endmodule

この範囲が一つの回路モジュールとなる。

begin .. end

汎用のブロック範囲。

initial

モジュールの中で一回だけ実行されるブロック

always @(イベント式)

イベント式にあるイベントが発生するたびに実行されるブロック

if (条件式) else ..

条件判断文

for(変数定義;条件式;変移)

繰り返し処理

while(条件式)

繰り返し処理

input、output

入力端子、出力端子の定義。モジュールの最初に記述。

reg、wire

内部配線がレジスタ(値を記憶)か単なる配線かの指定。

=

ブロッキング代入(詳細は後述する)

<=

ノンブロッキング代入(詳細は後述する)

assign

継続的代入。電気回路の配線接続に相当。

function

関数定義

//、/* .. */

コメント。実行には影響しない。

task

関数定義の内、平行処理するもの。

and、or、xor(exor)、nand、nor(exnor)、xnor、not

基本ゲート

オペレータ(演算子)

+、-、*、/

加減乗除(算術演算)

%

除算の余り(剰余演算)

~、&、|、^、~^(^~)

not、and、or、xor、xnor(ビット演算)

&&、||、!

and、or、not(論理演算)

!=、==、!==、===

等号演算(前者2つが論理等号演算、後者2つがケース等号演算)

{}

連節演算

?:

条件演算


上記のようにbegin、end、functionなどはpascalからオペレータや条件、繰り返し処理はCからの文法を流用している。

モジュールの構成

Verilogの最小単位はモジュールである。以下に、カウンタ回路の例で説明する。

モジュールはキーワードmoduleで始まる。その後のDiv20xが名前を示し、続く括弧内は端子リストである。6個の端子があり、それぞれの端子の入出力方向はモジュール中のポート宣言(inputとoutput)で指定される。最後のendmoduleでモジュールの終了である。モジュール内には、パラメータ宣言、ポート宣言、レジスタ宣言、イベント宣言、ネット宣言、ステートメントなどを記述する。

// 
// 表題 イネーブル付20段カウンター
// 
module Div20x (rst,clk,cet,cep,count,tc);
    // パラメータ宣言
    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進数になる。

    // ポート宣言(外部から本モジュールへの接続を定義する)
    input rst; // リセット(正論理)
    input clk; // クロック
    input cet; // カウンターとTC出力のイネーブル
    input cep; // カウンターのみのイネーブル
    output [size-1:0] count; // 束線を示す。この場合5bit幅
    output tc; 

    // レジスタ宣言
    reg [size-1:0] count; // alwaysまたはinitialブロックでドライブする信号は
                          // reg型でなければならない
    // ネット宣言    
    wire tc;              // 他の信号はwire型。ポート宣言したwire型信号の
                          // ネット宣言は省略可能であり、省略することも多い。

    // always文。rstやclock信号の変化に同期し並列に実行される
    always @ (posedge rst or posedge clk) begin                             
        if (rst) begin // 非同期リセット
            count <= count_zero;
        end else if (cet || cep) begin // イネーブル

            if (count == length-1) begin
                count <= count_zero;
            end else begin
                count <= count + count_one;
            end

        end
    end

    // assign文。tcの値は実行中、継続的に値が与えられる
    assign tc = (cet && (count == length-1));

endmodule

ポート宣言やレジスタ宣言での[a:b]のような形式は、束線(多くはバス)を示す。例えば[3:0]であれば配線が4本あることになる。

プロセス(always とintialブロックのこと)内部からドライブされる信号はreg型である必要があり、他はwire型である。キーワードregが必ずしもハードウェアであるレジスタを意味するものではない(論理合成の結果、FFが割り当てられるとは限らない)。

次にその中のalways節を説明する。always節は、括弧内の信号が指定された条件の変化があったときに実行される。posedgeは信号が0から1に変化した場合を指定する。or は括弧内の信号のどれか1つでも変化した場合を指定する。

always節中の"<="オペレータは通常の手続き型言語と異なりハードウェア記述言語の特徴の一つであり、「ノン・ブロッキング代入」というものである。シミュレーション実行時に並列に評価される。下記の例の場合、cが変化すると、aとbへの代入が同時に行われる(aとbの値が交換される)。これは実際のフリップフロップの動作に近いものである。

    reg a, b;
    wire c; 

    always @(c)
      begin
        a <= b;
        b <= a;
      end

もう一つの代入文である"="はブロッキング代入といい、手続き型言語のように逐次実行される。下記の例の場合、bかeが変化すると、aに代入された後、bに対する代入が行われる。

    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

なお、#は時間経過を示す。この場合、単位時間5経過の後、cにbが代入される。またc^eは一時変数に記録され、単位時間6経過後にdに代入される。時間は秒など実時間の指定も出来る。

主要ソフトウェア

商用シミュレータ

  • Verilog-XL、NC-Verilog ケイデンス社
  • VCS シノプシス社
  • ModelSim メンター社
  • VeriLogger Extreme シナプチキャド社

フリー・シミュレータ

シェアウェアー・シミュレータ/ツール

商用論理合成

  • design_compiler シノプシス社

関連項目

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net