ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

今日FPGAで学んだこと(6)ModelSim

前回までは、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をクリックすると、再度シミュレーション☆

  →再度シミュレーションするときは☆を実行する

  以降※のところは同じ