調歩同期方式シリアル通信の受信 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 プロジェクトを作成した。
前回、Vitis HLS 2020.2 で合成した Verilog HDL ファイル が 2 個ある。
uart_rx.v と uart_rx_regslice_forward.v を Vivado の uart_rx プロジェクトのディレクトリにコピーした。
uart_rx.v と uart_rx_regslice_forward.v を Vivado の uart_rx プロジェクトに Add Sources... を行った。
uart_rx_tb.sv を新規作成し、SystemVerilog コードを書いて、右クリックし右クリックメニューから Set as Top を行った。
Vivado IDE の左のウインドウの Flow Navigator から SIMULATION -> Run Simulation -> Run Behavioral Simulation を選択して、論理シミュレーションを行う。
Socpe ウインドウから ap_CS_fsm[8:0] を波形ウインドウにドラック&ドロップして追加した。
Restart ボタンをクリックして、シミュレーションをリスタートする。
Run All ボタンをクリックして、シミュレーションを最後まで実行した。
波形ウインドウを示す。
問題無さそうだ。
コメント