2021-12-02 AXI4-Stream Verification IPをSlaveとして使う

### 動作環境

- Windows 10 Pro (21H1)
- Vivado 2019.1

### 関連

- 2021-12-02 AXI Verification IPを使う (AXI4LITE)
    - https://qiita.com/7of9/items/8c846c41a6337420d5c8
- PG277 AXI4-Stream Verification IP v1.0
    - https://japan.xilinx.com/support/documentation/ip_documentation/axi4stream_vip/v1_0/j_pg277-axi4stream-vip.pdf
- 2021-12-02 AXI4-Stream Verification IPをMasterとして使う
    - https://qiita.com/7of9/items/da62e33ccd51e13c0c04

### 手順の概要

1. Vivadoでプロジェクトを新規作成
1. Block Designを「sys」という名前で作成する
1. Tools > Create and Package New IP ... > Create a new AXI4 peripheral
    - AXI4-Stream Master(カウンタ)をここで作る (後述を参照)
    - myip_211202_11_0としてIP化しておく
1. myip_211202_11_0をBlock Designに追加する
1. AXI4-Stream Verification IPを追加する
    - INTERFACE MODEをSLAVEに変更
1. aclk, aresetnのピンをMake Externalする (名前をこのようにする)
1. axi4stream_vip_0とmyip_0を接続する
1. Create HDL Wrapperをする
1. Simulation Sourcesにtb.svを作成する
1. Run Simulationをする
1. 見たいピンを波形に足す
    1. m_axi_wlast, m_axi_wvalid, m_axi_wready, m_axi_wdata[31:0]
    1. s00_axi_wdata[31:0], s00_axi_rready, s00_axi_rvalid

### AXI4-Stream Master(カウンタ)

参考: [AXI4-Streamを試す](https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E9%9B%BB%E6%B0%97%E5%9B%9E%E8%B7%AF%2FHDL%2FVivado%E3%81%A7AXI%E3%83%90%E3%82%B9%E3%82%92%E5%88%A9%E7%94%A8#maf47dc5) by 筑波大学 武内修様 

上記を参考にIPを作成する。

1. Interface Type: Stream
1. Interface Mode: Master
1. Edit IP
1. `＜IP名＞_v1_0_M00_AXIS.v`ファイルのM_AXIS_TVALID, M_AXIS_TDATA, M_AXIS_TLAST, M_AXIS_TSTRBのassignをコメントアウトする (下記)
1. 武内様の実装を`// Add user logic here`の下に追加する
1. Package IP
    1. File Groups > Merge changes from File Groups Wizard
    1. Review and Package > IP has been modified
    1. Re-Package IPを実施

```＜IP名＞_v1_0_M00_AXIS.v
	// I/O Connections assignments

	//assign M_AXIS_TVALID	= axis_tvalid_delay;
	//assign M_AXIS_TDATA	= stream_data_out;
	//assign M_AXIS_TLAST	= axis_tlast_delay;
	//assign M_AXIS_TSTRB	= {(C_M_AXIS_TDATA_WIDTH/8){1'b1}};
```

### Block Design

<img width="797" alt="image.png (29.3 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2021/12/02/21741/3eaecbff-5f43-4202-9e00-a563d5089a55.png">

axi4stream_vip_0の設定
<img width="1487" alt="image.png (59.0 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2021/12/02/21741/228570ca-abcd-418c-b9bf-a051b9a6a54f.png">


### テストベンチ (System Verilog)

https://qiita.com/tethys_seesaa/items/9d4c00212d9ea79b1497
の実装をベースとしてAXI4StreamのSlave用に書き換えした。
(PG277 AXI4-Stream Verification IP v1.0を参考に)

```tb.sv
`timescale 1ns/1ps
import axi4stream_vip_pkg::*;
import sys_axi4stream_vip_0_0_pkg::*;

module tb();

    localparam int LP_CLK_PERI = 100;
    localparam int LP_RST_PERI = 777;

    // DUT instance
    logic aresetn, aclk;
    sys_wrapper dut(.*);

    task rst_gen();
        aresetn = '0;
        #(LP_RST_PERI);
        aresetn = '1;
    endtask

    task clk_gen();
        aclk = '0;
        forever #(LP_CLK_PERI/2) aclk = ~aclk;
    endtask

    task clk_dly(int n);
        repeat(n) @(posedge aclk);
    endtask

    // VIP decreation
    sys_axi4stream_vip_0_0_slv_t agent;

    task init_agent();
        agent = new("master vip agent", dut.sys_i.axi4stream_vip_0.inst.IF);
        agent.start_slave();
    endtask

    // Ready gen method

    task rd_rdy();
        axi4stream_ready_gen      ready_gen; 
        ready_gen = agent.driver.create_ready("ready_gen 2");
        ready_gen.set_ready_policy(XIL_AXI4STREAM_READY_GEN_SINGLE);
        ready_gen.set_low_time(1);
        agent.driver.send_tready(ready_gen); // rd_driver=>driver
    endtask

    // Testscenario
    initial begin

        fork
            init_agent();
            clk_gen();
            rst_gen();
        join_none

        clk_dly(100);

        rd_rdy();

        clk_dly(100);

        $finish(2);
    end
endmodule
```

### 波形

2000nsまで実行した。
s_axi_tdata[31:0]がカウントアップしていくのを見ることができるようになった。

<img width="1418" alt="image.png (27.0 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2021/12/02/21741/1c8c835e-519a-4528-b277-20eeea2d9474.png">


### 備考 > XXXが見つからない

tb.svにおいて以下のエラーが出るが、Run Simulation可能。
visual bugとしてforumで報告されている。

- axi4stream_vip_pkg が見つからない @ `import axi4stream_vip_pkg::*;`
- sys_axi4stream_vip_0_0_pkgが見つからない @ `import sys_axi4stream_vip_0_0_pkg::*;`

AXI VIP and axi_vip_v1_0_2_pkg is not declared
https://support.xilinx.com/s/question/0D52E00006hphJ3SAI/axi-vip-and-axivipv102pkg-is-not-declared?language=ja

> You may see the lines underlined in red, this is a visual bug and is being fixed. It is safe to ignore it.

同様に以下のエラーも出たが、Run Simulationできた。

- XIL_AXI4STREAM_READY_GEN_SINGLE  が見つからない