帰らざるMOS回路(44) Digilent CMOD S7導入、Vivadoのシミュレータ

Joseph Halfmoon

前回Digilent社の小型FPGAボードCMOD S7を導入。「本流FPGA」Xilinx(AMD)登載であります。開発環境はVivadoのML版です。前回はボードを取り出して「とりあえず」LEDを点滅させる回路をFPGAに書き込み動作を確認。今回はVivadoのVerilogシミュレータを使用してみます。

※かえらざるMOS回路 投稿順 INDEX

シミュレータの使用

Xilinx(AMD)の開発環境 Vivado にはFPGAの回路を合成するためのツールだけでなく、設計検証のためのシミュレータも搭載されています。今回はそのロジックシミュレータの使い方をDigilent社のチュートリアルページを参照しながら練習してみたいと思います。参照するページは以下です。

Using the Simulator in Vivado

上記のページの「シンプルDフリップフロップ例」をやってみます。上記例ではVivado 2022.1版を使ってますが、当方での動作確認はVivado 2023.2版です。また、上記例ではSystemVerilogでテストベンチを記述してます。当方では過去回とのつながりもあり、まずはフツーのVerilogで記述です。後でSystemVerilogも勉強しないとなあ。ざっくりした手順は以下の通りです。
    1. 「ハードウエアのみプロジェクト」を作製する。その際、Project Nameを設定後、Project TypeはRTLとしておく。また、その時点で 制約ファイルは未設定、ボード選択はDigilent社CMOD S7を選択する。
    2. 前回、Digilent社のウエブサイトからダウンロード済の制約ファイル群の中からCMOD S7用の制約ファイルをCOPYオプションでプロジェクトに加える。
    3. ターゲットのRTLソースを新規作成する(Verilog, ローカル。)
    4. ターゲットのRTLソース(実際にはほとんどゲートレベル回路だけれども)を記述。上記例では3入力AND+レジスタだったが、当方では2入力AND+レジスタに手抜き。
    5. Add Sourcesでシミュレーションソース(テスト・ベンチ)を追加。この際、上記のチュートリアルでは、SystemVerilogで記述しているが、フツーのVerilogで記述。
    6. Run Simulationでシミュレーション、波形ビューワーが起動され、シミュレション波形が予定通りだったらOKとする。
Vivadoの起動から

Vivado起動後の画面の左上隅あたりの様子が以下に。Quick StartからCreate Projectいたしますぞ。startVivado

プロジェクト名とファイルなどを保存するロケーションを聞かれるのでテキトーに答えておきます。setProjectName

他にもいろいろ聞かれますが、重要なのはDefault Partというところで、Parts(個別のデバイス)ではなくBoardsを選択し、前回一覧表示されるよう設定済のDigilent社のボードの中から Cmod S7-25を見つけることです。ただしステータスは「ダウンロードしてね」印になっているので、ダウンロードボタンを押してダウンロードいたします。DefaultPart

するとパーツナンバやらピン数などが表示され、ボードのあれこれの情報がセットされます。次へ。DefaultPart2

ソース(ターゲットの回路の)設定は、Verilogでローカルとしておきます。createSourceFile

また、今回はボード上のFPGAに書き込むわけではないのですが、一応、制約ファイル(constraints)を設定しておきます。Add sourcesからね。addConstraints

前回ダウンロードした制約ファイル群のフォルダを開き、CMOD S7用のファイルを選択します。その際、勝手に変更しても元ファイルに影響でないようにCOPYオプションにチェックしておきます。addConstraintsFile

最後にシミュレーション用のソース(FPGAには書き込まれないシミュレーション時のみの部分)のファイルを作製します。addSIMsrc

今回はこちらもVerilogです。createSIMsrc

上記作業後のプロジェクトの階層構造が以下に。SourcesHierarchy

さてソースを記述

ターゲット回路の記述が以下に。Digilent社のチュートリアルでは3入力ANDの先にレジスタでしたが、当方では2入力に手抜きデス。

module and2Reg(
    input clk,
    input A,
    input B,
    output Qout
    );
    
    reg Qout;
    wire D;
    assign D = A & B;
    always @(posedge clk)
        Qout <= D;
endmodule

一方、上記をテストするためのテストベンチの記述が以下に。いいのかこんな感じで。

module tb_and2Reg(

    );
parameter CYCLE = 100;

wire qout;
reg a, b, ck;

and2Reg dut(.A(a), .B(b), .clk(ck), .Qout(qout));

always begin
    ck=0; #(CYCLE/2);
    ck=1; #(CYCLE/2);
end

initial begin
    #0      a= 1'b0; b = 1'b0;
    #CYCLE  a= 1'b1; b = 1'b0;
    #CYCLE  a= 1'b1; b = 1'b1;
    #CYCLE  a= 1'b1; b = 1'b1;
    $finish;
end
 
endmodule
シミュレーションをGo

Run Simulationからビヘイビアなシミュレーションを実施するのはこんな感じで。runSimulation

実行後、波形ビューワーのタブが現れてます。a=1、b=1のとき、qoutも1ね。simResult

まあ動いた。2入力ANDとFF1個だけれども。

帰らざるMOS回路(43) Digilent CMOD S7導入。AMD(Xilinx)だ。へ戻る

帰らざるMOS回路(45) Digilent CMOD S7、サンプルプロジェクトを開いてみる へ進む