前回までは、verilogでFPGAをいろいろ操作していましたが、
今日は、検証のおはなしです。
検証ツールModelSimの使い方です
■ModelSimに行く前に・・・
◎(今日の話と関係ないけど)
ピンのインポート
・Assignment→ImportAssignment
エクスポートしたCSVファイルを指定
読み込んだら、確認のため
Assignment→PinPlanner
・バスになっているものは、
PinPlannerの左上のGroupでいっぺんに
電圧とか、指定できる
◎階層設計(テストベンチは、これを使う)
下位モジュール=部品
部品をつなげていくかんじ
インスタンシエーション
【書式】
IC uIC1(
.IN1(A),.OUT1(C)
);
【説明】
IC 下位モジュール(部品)
uIC1 インスタンス名
.IN1 .信号→下位モジュール
(A) 上位モジュール
※1対1に対応するなら
IC uIC1(
A,C
);
と、下位モジュールが省略できる
・トップモジュールはプロジェクト名になる
■Model Simでシミュレーション
◎テストベンチモジュールを作る
論理合成+テストベンチ独特
入力信号と出力信号をテストベンチと接続
【書式】
`timescale 1ps/1ps
module ABC_tb;
// Inputs
reg A;
reg B;
reg CLK50;
// Outputs
wire C;
// Instantiate the Unit Under Test (UUT)
ABC uut (
.A(A),
.B(B),
.C(C)
);
initial begin
$monitor("#%t:A=%b,B=%b,C=%b",$time,A,B,C);
$timeformat(-12,0 ,"ps",3);
CLK50 = 0;
end
always #10 begin //generated basic clock
CLK50 <= !CLK50;
end
initial begin
#step;
#step A = 0;
#step B =1;
#(STEP *5) $finish;
end
endmodule
(切り貼りして作ったから、プログラムはあってないかも)
【説明】
・`timescaleタイムスケール(時間設定記述:配置配線で重要)
→`は後述(コンパイラ指示子)
・入力はreg定義、出力はwire定義
信号は1対1に対応するため、省略する形
でかまわない(並び順はあわせること)
・テストベンチ=モジュールの初期化必要
initialize Inputs
・#:遅延時間
#100 SW=1;
・リセット信号を必ず入れる
初期状態をはっきりさせるため
・$finish;をいれないと、おわらない
→$は後述(システムタスク)
・クロックの作り方
always #10 begin
CLK50 <= !CLK50;
end;
のように、always文でつくる
#10→10ナノ秒ごとに・・
・コンパイラ指示子
`ではじまる。
`define テキスト置換
`include ファイル取り込み(パラメータなど、まとめて宣言)
`timescale 単位と精度(シミュレーション用)
・システムタスク
$ではじまる。主にテストベンチで使う
$monitor printoutする
$finish おわり
$display$writeなどなど・・
◎Model Sim実行(プロジェクトを作る、由緒正しきやり方)
・立ち上げる
・プロジェクトを作り、ファイルを登録
File→new→project
プロジェクト名を入れて場所を指定する
OKボタンを押すとダイアログ出てくる
すでにファイルがある場合、
でできたダイアログで、指定する
テスト対象モジュール
テストベンチ
(ちなみに、プロジェクトでファイルが出ている窓からでも
右ボタンクリックで、add to project→existing fileで足せる)
・コンパイル
compile→compileAll
・波形ウィンドウ表示(出ていないとき)
view→wave
・シミュレーション開始
Simulation→Start Simulation
ダイアログが出てくるので
Designタブ、workをクリック、
テストベンチを選択
Resolutionのところで、nsとか時間を指定する
そうすると、ポート信号が表示される。
上のほうに、シミュレーション時間の設定ができるところがあるので
適当になおしたければ直す(10usとか)
ポート信号を全部ドラッグし(シフトキーを使って)wave画面の変数のところ
にドロップする→wave画面に変数入る
RunALLボタンをクリック
※finishが入っていると、終了しますかときいてくるのでいいえ(NO)
→はいにすると、ここで終わる
ZoomFullボタン(虫眼鏡のめがねが青い)で波形が見れる
waveウィンドウの変数を選択し、右ボタンクリックで
radix→unsignedで10進符号なし表記
黄色い線を動かすと、見てる時間の位置が変わる。
ここで、虫眼鏡の下に青い四角のボタンをクリックすると、
カーソルのところが拡大される※
◎Model Sim実行(簡易版、プロジェクトを作らない)
・ModelSimを立ち上げる
・ファイル選択
File→ChangeDirectoryで、ファイルのおいてあるフォルダ選択
・コンパイル
Compile→Compile
出てきたダイアログで、コンパイルするファイルすべてを選択肢、Compile
おわったらDoneでダイアログを消す
この際workを作りますかと聞いてくることがある。Yes
・ModelSim実行
左側のLibraryウィンドウのworkをクリックすると、今コンパイルした
テストベンチが出てるはず。
それを選択して、右ボタンメニューから、Simulation選択
しばしまつ。画面いろいろやっている
画面上に、左側のウィンドウに、いま選んだテストベンチが出ている★
右ボタンクリックで、Add→ToWave→All items in region
を選択。wave画面に、変数が入ってくる
RunAllボタンをクリックすると実行する
以降※のところは同じ
・内部信号を見たい場合は、
★のところにあるインスタンス名をクリックすると
変数が出てくる。
それをwave画面に、ドラッグアンドドロップ
☆restartボタンをクリックするとダイアログが出るからOK
RunALLをクリックすると、再度シミュレーション☆
→再度シミュレーションするときは☆を実行する
以降※のところは同じ