調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する2”の続き。

調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにしたということで、前回は、uart_rx プロジェクトで C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行って、uart_rx IP を作成した。今回は、Vivado 2020.2 の uart_rx プロジェクトを作成し、合成された uart_rx の Verilog HDL ファイルをコピーし、SystemVerilog のテストベンチファイルを作成して、Vivado 上でシミュレーションしてみよう。

まずは、”SystemVerilogで遊ぼう! - 03. テストベンチトップ”と”SystemVerilog 入門”を参照して SystemVerilog のテストベンチを書いてみよう。とても SystemVerilog テストベンチ書くの初めてなので、Verilog HDL っぽくなるのは許して欲しい。
uart_rx_tb.sv を貼っておく。

`timescale 100ps / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: marsee
// 
// Create Date: 02/16/2021
// Design Name: 
// Module Name: uart_rx_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module uart_rx_tb;
    parameter DELAY = 10; // delay = 1 ns
    
    logic ap_clk;
    logic ap_rst;
    logic ap_start;
    logic ap_done;
    logic ap_idle;
    logic ap_ready;
    logic rxst_V_dout;
    logic rxst_V_empty_n;
    logic rxst_V_read;
    logic [7:0] rx_data;
    logic rx_data_ap_vld;
    logic rx_data_ap_ack;
    logic [31:0] ap_return;
    
    uart_rx uart_rx_i(.*);
    
    task gen_ap_clk;
        forever begin
            #52 ap_clk <= ~ap_clk; // 10.4 ns = 96.15 MHz
        end
    endtask
    
    task start_bit_gen;
        begin
            @(posedge ap_clk);
            #DELAY
            rxst_V_dout <= 1'b0;
            rxst_V_empty_n <= 1'b1;
            repeat(12*16)@(posedge ap_clk);
        end
    endtask
    
    task rx_data_gen(input logic [7:0] rxd);
        begin
            for(int i=0; i<8; i++) begin
                #DELAY
                rxst_V_dout <= rxd[i];
                rxst_V_empty_n <= 1'b1;
                repeat(12*16)@(posedge ap_clk);
             end
         end
     endtask
     
    task stop_bit_gen;
        begin
            #DELAY
            rxst_V_dout <= 1'b1;
            rxst_V_empty_n <= 1'b1;
            repeat(12*16)@(posedge ap_clk);
        end
    endtask
    
    initial begin
        ap_clk <= 1'b0;
        ap_rst <= 1'b1;
        ap_start <= 1'b0;
        rxst_V_dout <= 1'b1;
        rx_data_ap_ack <= 1'b0;
        
        #300 fork
            gen_ap_clk;
        join_none
        
        #300 ap_rst <= 1'b0;
        #300 ap_start <= 1'b1;
        rxst_V_empty_n <= 1'b1;
        rx_data_ap_ack <= 1'b1;
        repeat(12*16)@(posedge ap_clk);
        
        #300 // First charactor
        start_bit_gen;
        rx_data_gen(0'h55);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);
        
        #300 // Second charactor
         start_bit_gen;
        rx_data_gen(0'haa);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);
        $stop;
    end
endmodule



さて、Vivado 2020.2 で uart_rx プロジェクトを作成した。
ceb649a9.png


前回、Vitis HLS 2020.2 で合成した Verilog HDL ファイル が 2 個ある。
04fbb8cc.png


uart_rx.v と uart_rx_regslice_forward.v を Vivado の uart_rx プロジェクトのディレクトリにコピーした。
40529717.png


uart_rx.v と uart_rx_regslice_forward.v を Vivado の uart_rx プロジェクトに Add Sources... を行った。
1769dde5.png


uart_rx_tb.sv を新規作成し、SystemVerilog コードを書いて、右クリックし右クリックメニューから Set as Top を行った。
4bfa7f13.png


Vivado IDE の左のウインドウの Flow Navigator から SIMULATION -> Run Simulation -> Run Behavioral Simulation を選択して、論理シミュレーションを行う。

Socpe ウインドウから ap_CS_fsm[8:0] を波形ウインドウにドラック&ドロップして追加した。
4272512b.png


Restart ボタンをクリックして、シミュレーションをリスタートする。
Run All ボタンをクリックして、シミュレーションを最後まで実行した。
8043abeb.png


波形ウインドウを示す。
e8bdd721.png


問題無さそうだ。