シミュレーションと論理合成を体験する
(1)ここで学ぶ内容
書いた回路が正しく動くか確認する「シミュレーション」と、回路図に変換する「論理合成」を体験するよ🐾
特に『テストベンチ』の書き方は、設計と同じくらい実務でよく使うから要チェック!
- 動作を確認するための記述「テストベンチ」について学ぶ
- 疑似ツールを使ってシミュレーションと論理合成を体験する
目標
(1)以下の項目を理解し説明できる
- テストベンチ
- initial文
- parameter 宣言
- 代入文による入力信号の変化
- クロックの記述
(2)シミュレータと論理合成ツールを操作できる
修了判定
フルアダーを用いた加算回路をシミュレーションと論理合成する
(2)シミュレーションと論理合成
Verilog-HDL シミュレータを用いて回路に適切な入力を与え、出力を確認する仕組みが必要
論理合成の記述ファイルと合成対象の ASIC,FPGA のライブラリを用いて論理合成を行い回路を生成
(3)テストベンチ
テストベンチ adder_tp (検証対象の上の階層)
- 検証対象に対して上位階層を用意する
- 上位階層側で,テスト入力の印加,出力の観測を行う
(4)加算回路のテストベンチ
テストベンチ adder_tp
4ビット加算回路
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)加算回路のシミュレーション
・シミュレータを起動して,加算回路のシミュレーションを実行してみよう
(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ビット
バイナリカウンタ
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)カウンタのシミュレーション
・シミュレータを起動して,カウンタのシミュレーションを実行してみよう
. .. 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のコードが実際の回路(ゲートレベル)に変換される瞬間だよ🐾
シミュレーションは「ソフト上の確認」、論理合成は「ハードウェアへの翻訳」という違いを意識してみてね。
・論理合成ツールを起動して,加算回路とカウンタの論理合成を実行してみよう
(11)修了判定
・シミュレーション
・論理合成
する。
よく
できました
4ビット加算回路
| テストベンチのファイル | : adder_tp2.v |
| 4ビット加算回路のファイル | : adder_ripple.v |
| フルアダーのファイル | : fulladd.v |
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 (論理合成後ネットリスト概要)
※右に伝搬する carry (COUT -> CIN) を表現しています。
fulladd.v (論理合成後ゲートレベル)
実習で確かめる、つまずきの補足
どの工程の結果を確認しているか
仕様→RTL→機能検証→合成→配置配線→タイミング確認→実機確認、という流れの中で、問題が見つかった工程から原因のある工程へ戻るよ。仕様ではリセット値、優先順位、入力の許容範囲、処理のサイクル数を先に決めよう。
| 確認 | 入力と見るもの |
|---|---|
| RTL機能検証 | RTL、テストベンチ。入力に対する値・順序・サイクル数 |
| 論理合成 | RTL、対象デバイス/ライブラリ、制約。生成された回路と診断 |
| STA | 制約と実装の遅延情報。解析対象のパス、setup、hold、未制約パス |
| ゲートレベルシミュレーション | ネットリスト、対応するシミュレーションモデル、TB。必要に応じてSDF遅延も読み込む |
ゲートレベルの検証にも遅延なし/ありの種類がある。ネットリストを読み込んだだけで実装後の遅延が再現されるわけではなく、STAの代わりにもならないよ。どの検証を使うかは開発フローに合わせよう。
VerilogはRTL、TB、部品のシミュレーションモデルに使われるけれど、拡張子だけでは用途を判定できない。#10 はシミュレーション上の時間指定で、一般的なRTL合成ではそのまま10nsの待ち回路にならない。initial の初期値・メモリ初期化への対応は対象ツール次第だよ。合成入力にはTBを入れず、トップ名とファイル一覧を明示してね。