シミュレーションと論理合成を体験する

(1)ここで学ぶ内容

もふねこ

書いた回路が正しく動くか確認する「シミュレーション」と、回路図に変換する「論理合成」を体験するよ🐾
特に『テストベンチ』の書き方は、設計と同じくらい実務でよく使うから要チェック!

概要
  • 動作を確認するための記述「テストベンチ」について学ぶ
  • 疑似ツールを使ってシミュレーションと論理合成を体験する

目標

(1)以下の項目を理解し説明できる

  • テストベンチ
  • initial文
  • parameter 宣言
  • 代入文による入力信号の変化
  • クロックの記述

(2)シミュレータと論理合成ツールを操作できる


修了判定

フルアダーを用いた加算回路をシミュレーションと論理合成する

(2)シミュレーションと論理合成

シミュレーションによる動作確認

Verilog-HDL シミュレータを用いて回路に適切な入力を与え、出力を確認する仕組みが必要

論理合成を行い回路を生成

論理合成の記述ファイルと合成対象の ASIC,FPGA のライブラリを用いて論理合成を行い回路を生成

(3)テストベンチ

テストベンチ adder_tp (検証対象の上の階層)

4ビット加算回路
E3 図1:テストベンチ内の信号生成と観測の図。reg aとreg bがadder 4ビット加算回路に入り、その出力がwire qとして観測される。矢印のビット幅はすべて4。
E3 図1:テストベンチ内の信号生成と観測の図。横に長い図はスクロールして確認できます。
  • 検証対象に対して上位階層を用意する
  • 上位階層側で,テスト入力の印加,出力の観測を行う

(4)加算回路のテストベンチ

テストベンチ adder_tp

4ビット加算回路

E3 図2:テストベンチ内の信号生成と観測の図。reg aとreg bがadder 4ビット加算回路に入り、その出力がwire qとして観測される。矢印のビット幅はすべて4。
E3 図2:テストベンチ内の信号生成と観測の図。横に長い図はスクロールして確認できます。
module adder_tp;
reg     [3:0]   a, b;
wire    [3:0]   q;

// 検証対象接続
adder A1( a, b, q );

// テスト入力
initial begin
               a = 4'h0;   b = 4'h0;
    #1000      a = 4'h5;   b = 4'ha;
    #1000      a = 4'h7;   b = 4'ha;
    #1000      a = 4'h1;   b = 4'hf;
    #1000      a = 4'hf;   b = 4'hf;
    #1000      $finish;
end

// 表示
initial $monitor( $stime,
    " a=%h b=%h q=%h", a, b, q );

endmodule

(5)シミュレーション時のファイル指定

シミュレータの起動
% verilog adder_tp.v adder.v

テストベンチ

module adder_tp;
reg     [3:0]   a, b;
wire    [3:0]   q;
. . .

// 検証対象接続
adder A1( a, b, q );

. . .
endmodule

回路記述

module adder( a, b, q );
input   [3:0]   a, b;
output  [3:0]   q;

assign q = a + b;

endmodule

(6)加算回路のシミュレーション

・シミュレータを起動して,加算回路のシミュレーションを実行してみよう

Verilog-HDLシミュレータ _ □ ×
ファイル(F) 編集(E) ヘルプ
D:/tools/verisim/sample>

(7)クロックの記述

always 文によるクロックの記述


reg ck;              ─→ クロック信号をreg宣言

always begin         ─→ 無限ループ
        ck = 1;      ─→ ckを1に
    #500;            ─→ 500ユニットの遅延
        ck = 0;      ─→ ckを0に
    #500;            ─→ 500ユニットの遅延
end
ck ┊
 1 │┌────┐    ┌────┐    ┌────┐
   ││    │    │    │    │    │
 0 ┼┴────┴────┴────┴────┴────┴────
   0    500  1000 1500 2000 2500 3000

(8)カウンタのテストベンチ

4ビット
バイナリカウンタ

E3 図3:4ビット・バイナリカウンタのブロック図。resとckがcounterに入り、4ビットのq 4bitが出る。
E3 図3:4ビット・バイナリカウンタのブロック図。横に長い図はスクロールして確認できます。
module count_tp;
reg             ck, res;
wire    [3:0]   q;

parameter STEP = 1000;

// 検証対象接続
counter C1 ( ck, res, q );

// クロック作成
always begin
        ck = 0; #(STEP/2);
        ck = 1; #(STEP/2);
end

// テスト入力
initial begin
               res = 0;
        #STEP  res = 1;
        #STEP  res = 0;
        #(STEP*20)
               $finish;
end

// 表示
initial $monitor($stime,"ck=%b res=%b q=%h",ck,res,q );

endmodule

(9)カウンタのシミュレーション

・シミュレータを起動して,カウンタのシミュレーションを実行してみよう

Verilog-HDLシミュレータ _ □ ×
ファイル(F) 編集(E) ヘルプ
D:/tools/verisim/sample>ls
. .. adder_tp.v adder.v adder_tp.vcd
adder_tp.sim
D:/tools/verisim/sample>ls -l
   0 99/05/12 16:00 .
   0 99/05/12 16:00 ..
 478 99/05/12 16:10 adder_tp.v
 142 99/05/12 16:10 adder.v
 345 99/02/09 18:03 adder_tp.vcd
 120 99/05/12 16:13 adder_tp.sim

D:/tools/verisim/sample>cd..
D:/tools/verisim/sample>ls -l
   0 99/05/12 16:00 .
   0 99/05/12 16:00 ..
   0 99/05/12 16:00 sample

(10)論理合成の実行

もふねこ

いよいよ「論理合成」!Verilogのコードが実際の回路(ゲートレベル)に変換される瞬間だよ🐾
シミュレーションは「ソフト上の確認」、論理合成は「ハードウェアへの翻訳」という違いを意識してみてね。

・論理合成ツールを起動して,加算回路とカウンタの論理合成を実行してみよう

論理合成 _ □ ×
ファイル(F) 編集(E) ビュー(V) ツール(T) ヘルプ(H)
⬆ ➕ ➖ SRC SCR NET RPT
もふねこ

🐾 もふねこの現場メモ:
「シミュレーションでは完璧に動いたのに、実機だけ壊れる」──これ、毎年必ず誰かがハマるんだ。原因の多くは「センシティビティリストの漏れ」と「リセット忘れによるX伝搬」。特にX伝搬は、波形を見てもXが隠れていることがあるから厄介だよ。「実機で動いたから大丈夫」は、HDLでは一番危険な思い込みなんだ🐾
※再現と対策は 実験ログ1、Xが波形に出ないときの見つけ方は 検証実験4の実習 にあるよ🐾

(11)修了判定

設問
フルアダーを用いた加算回路( E1ユニット )を,
・シミュレーション
・論理合成
する。
🌸
たいへん
よく
できました

4ビット加算回路

E3 図4:4ビット加算回路のブロック図。a 4bitとb 4bitがadderに入り、4ビットのq 4bitが出る。
E3 図4:4ビット加算回路のブロック図。横に長い図はスクロールして確認できます。
テストベンチのファイル: adder_tp2.v
4ビット加算回路のファイル: adder_ripple.v
フルアダーのファイル: fulladd.v
E3 図5:fulladdを4個つないだ図。add0 fulladd〜add3 fulladdにa 0〜a 3とb 0〜b 3が入り、q 0〜q 3が出る。CIN 0がadd0に入り、桁上げはadd0からadd3へ順に渡り、最後は開放。
E3 図5:fulladdを4個つないだ図。横に長い図はスクロールして確認できます。
D:/exam/E_unit/E3_11>verilog adder_tp2.v adder_ripple.v fulladd.v

        Verilog-HDL (faked) simulator
        Copyright 1999-2002 hdLab, Inc.

Compiling source file "adder_tp2.v"
Compiling source file "adder_ripple.v"
Compiling source file "fulladd.v"

           0 a=0 b=0 q=0
        1000 a=5 b=a q=f
        2000 a=7 b=a q=1
        3000 a=1 b=f q=0
        4000 a=f b=f q=e
End of simulation 15/09/03 15:26:06
          |0         |1000      |2000      |3000      |4000
──────────┼──────────┼──────────┼──────────┼──────────┼──────────
 a[3:0]   |0         |5         |7         |1         |f
──────────┼──────────┼──────────┼──────────┼──────────┼──────────
 b[3:0]   |0         |a                    |f         |
──────────┼──────────┼─────────────────────┼──────────┼──────────
 q[3:0]   |0         |f         |1         |0         |e
──────────┼──────────┼──────────┼──────────┼──────────┼──────────

adder_ripple.v (論理合成後ネットリスト概要)

E3 図6:adder_ripple.v論理合成後ネットリストの図。入力aとbの各ビットがfulladd add0〜add3に入り、出力q0〜q3が出る。logic 0がadd0に入り、桁上げがadd3まで順に渡って最後はopenになる。
E3 図6:adder_ripple.v論理合成後ネットリストの図。横に長い図はスクロールして確認できます。

※右に伝搬する carry (COUT -> CIN) を表現しています。

fulladd.v (論理合成後ゲートレベル)

E3 図7:XOR、AND、NOR、NOTで組んだ回路図。AとBがXORに入り、その出力とCINが次のXORに入ってQになる。ANDが2つあり、その出力がNORとNOTを通ってCOUTになる。
E3 図7:XOR、AND、NOR、NOTで組んだ回路図。横に長い図はスクロールして確認できます。

実習で確かめる、つまずきの補足

どの工程の結果を確認しているか

仕様→RTL→機能検証→合成→配置配線→タイミング確認→実機確認、という流れの中で、問題が見つかった工程から原因のある工程へ戻るよ。仕様ではリセット値、優先順位、入力の許容範囲、処理のサイクル数を先に決めよう。

確認 入力と見るもの
RTL機能検証 RTL、テストベンチ。入力に対する値・順序・サイクル数
論理合成 RTL、対象デバイス/ライブラリ、制約。生成された回路と診断
STA 制約と実装の遅延情報。解析対象のパス、setup、hold、未制約パス
ゲートレベルシミュレーション ネットリスト、対応するシミュレーションモデル、TB。必要に応じてSDF遅延も読み込む

ゲートレベルの検証にも遅延なし/ありの種類がある。ネットリストを読み込んだだけで実装後の遅延が再現されるわけではなく、STAの代わりにもならないよ。どの検証を使うかは開発フローに合わせよう。

VerilogはRTL、TB、部品のシミュレーションモデルに使われるけれど、拡張子だけでは用途を判定できない。#10 はシミュレーション上の時間指定で、一般的なRTL合成ではそのまま10nsの待ち回路にならない。initial の初期値・メモリ初期化への対応は対象ツール次第だよ。合成入力にはTBを入れず、トップ名とファイル一覧を明示してね。