2020/05/30

VivadoでRTLのシミュレーションを行う

FPGA   

RTL初心者です。Vivadoを使ったらシミュレーションを簡単に実行できたのでメモしておきます。

VivadoでProjectを適当な名前で作成します。
ソースコードは後で追加します。

Boardは適当なBoardを選択します。
FinishでProjectを作成します。
PROJECT MANAGER→Sources→Design Sourcesを右クリックして、Add Sourcesを選択します。
Add Sourcesで、Add or create design sourcesを選択します。
Add or Create Design Sourcesで、Create Fileを選択します。
File nameを入力します。例として、counter.vとします。
Define Moduleでは、とりあえずは、後から入力するので、OKを選択します。
では、シミュレーション対象のcounter.vを作成します。
counter.vの仕様です。
・入力は、CLKとRESET
・出力は、COUNTRと、CONTERが4の倍数の時だけENABLEにする
以下、RTLのコードになります。
———————
`timescale 1ns / 1ps
module counter(
    input clk,
    input reset,
    output reg [3:0]counter_value,
    output reg enable
    
    );
always@(posedge clk)
    if (reset)  begin
        counter_value = 4’h0; 
        enable = 1’b0;
    end
    else begin
        counter_value = counter_value + 4’h1;
        
        if ((counter_value % 4) == 0)
            enable = 1’b1;
        else
            enable = 1’b0;
    end
    
endmodule
———————
次に、シミュレーション用のテストコードを用意します。
PROJECT MANAGERのSources Simulation Sourcesで右クリックして、Add Sourcesを選択します。
Add Courcsで、Add or create simulation sourcesを選択し、Nextをおします。
Add or Craete Simulation Sourcesで、Create Fileを選択します。
Create Source Fileで、テスト用のファイルを作成します。test_counter.vという名前にします。
Fileが追加されたらFinishをおします。
Define Moduleの画面では、今回は入出力なしで実施するので、OKを押します。
PROJECT MANAGER Sources Simulation Sourcesに追加されたtest_counter.vを選択して、テストコードを追加行きます。
——————————————
`timescale 1ns / 1ps
module test_counter;
localparam STEP = 8;  /* クロックの周期*/
localparam TEST_DURATION = (800); /* テストの期間*/
/* 入力はreg、出力はwireで定義する */
reg clk;
reg reset;
wire [3:0] counter_value;
wire enable;
counter counter(
    .clk(clk),
    .reset(reset),
    .counter_value(counter_value),
    .enable(enable)
);
/* クロックの生成*/
always begin
    clk = 0; #(STEP/2);
    clk = 1; #(STEP/2);
end
initial begin
        reset = 0;
        #(STEP*3) reset = 1;
        #(STEP*3) reset = 0;
        #(TEST_DURATION);
        $stop;
end
endmodule
——————————————
timescaleの説明
‘timescale<1タイムスケールあたりの実時間/丸目の精度>
`timescale 1ns / 1ps と書かれている場合は、1タイムスケールが1nsで、1ps未満は切り捨てか切り上になる。
#の説明
#数字で、数字が経過後という意味。
#500 だと、500タイムスケール経過後という意味。
次に、シミュレーションの実行方法です。Flow NavigatorからSIMULATION Run Simulationで左クリックして、Run Behavioral Simulationを選択し、シミュレーションを実行します。
シミュレーションが実行されると、SIMULATIONに、UntitledxxというWindowが表示され、シミュレーション結果が表示されます。
Counterの表示は、アナログに変更することができます。変数を右クリックして、Waveform Style 
Analogを選択するとアナログ表示になります。
デジタル表示
アナログ表示
 
また、表示されない変数があった時は、ScopeのところでSource Codeを選択して、
その右側のObjectで、変数を選択して、Add Wave Windowを選択すると、Waveに追加されます。
githubに使用したプロジェクトファイルはおいてあります。
参考にしたサイト
« »