FC2カウンター FPGAの部屋 2023年06月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

cocotbext-pcie を使ってみる3

cocotbext-pcie を使ってみる2”の続き。

cocotb の PCI-Express シミュレーション環境の cocotbext-pcie を使ってみようということで、前回は、pcie_s10 と pcie_us をやってみた。今回は、pcie_usp をやってみよう。

cocotbext-pcie/tests/pcie_usp をやってみよう。
cocotbext-pcie/tests/pcie_usp ディレクトリに行った。
test_pcie_usp.v に VCD ファイルを出力する行を挿入した。
cocotb_axi_113_230630.png

make を行ったところ PASS した。
make
cocotb_axi_114_230630.png

gtkwave で PCI-Expsess の波形を見てみよう。
gtkwave test_pcie_usp.vcd
cocotb_axi_115_230630.png

s_axis_cc_tdata が動いている辺りを拡大した。
cocotb_axi_116_230630.png

s_axis_rq_tdata が動いている辺りを拡大した。
cocotb_axi_117_230630.png
  1. 2023年06月30日 04:53 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

”ZUBoard - Building the foundational designs”をやってみる1

ZUBoard 1CG が来ました”で ZUBoard 1CG が今年の 4 月 2 日に届いたが、触っていなかった。そこで、そろそろ使ってみようということで、hackstar.io の”ZUBoard - Building the foundational designs”をやってみよう。

Avnet の Guthub リポジトリをクローンする
Avnet_2022_2 ディレクトリを作成し、Avnet の Guthub リポジトリをクローンする。
mkdir Avnet_2022_2
cd Avnet_2022_2
git clone https://github.com/Avnet/bdf
git clone -b 2022.2 https://github.com/Avnet/hdl
git clone -b 2022.2 https://github.com/Avnet/petalinux

ZUBoard1CG_1_230627.png

zub1cg_sbc_base を構築する
Vivado と Petalinux の環境を設定する。つまり、settings64.sh や settings.sh を source で実行した。

petalinux ディレクトリに行って、scripts/make_zub1cg_sbc_base.sh を実行した。
cd Avnet_2022_2/petalinux
scripts/make_zub1cg_sbc_base.sh

ZUBoard1CG_2_230627.png
ZUBoard1CG_3_230627.png

長い時間が掛かってビルドが終了した。

作成された Vivado プロジェクトを見てみよう。
Vivado プロジェクトは Avnet_2022_2/hdl/projects/zub1cg_sbc_base_2022_2 にできていた。
ZUBoard1CG_4_230628.png

Vivado 2022.2 を起動して、Project Summary を見た。
ZUBoard1CG_5_230628.png

ブロック・デザインを見た。
クロックが 7 個も実装されている。
axi_iic や axi_uartlite, axi_gpio も実装されている。
ZUBoard1CG_6_230628.png
ZUBoard1CG_7_230628.png

clocking wizard を確認した。
150 MHz, 300 MHz, 75 MHz, 100 MHz, 200 MHz, 400 MHz, 600 MHz のようだ。
ZUBoard1CG_8_230628.png

Platform Setup ウインドウの Clock を見ると、150 MHz の clk_out1 がデフォルト・クロックに設定されていた。
ZUBoard1CG_9_230628.png

Address Editor 画面を貼っておく。
ZUBoard1CG_10_230628.png

Petalinux 2022.2 プロジェクトの zub1cg_sbc_base_2022_2 ディレクトリを示す。
ZUBoard1CG_11_230628.png

Avnet_2022_2/petalinux/projects/zub1cg_sbc_base_2022_2/images/linux ディレクトリを示す。
SD カード・イメージの rootfs.wic が生成された。
ZUBoard1CG_12_230628.png
  1. 2023年06月29日 05:18 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

cocotbext-pcie を使ってみる2

cocotbext-pcie を使ってみる1”の続き。

cocotb の PCI-Express シミュレーション環境の cocotbext-pcie を使ってみようということで、前回は、Windows 11 の WSL2 上の Ubuntu 22.04 で試してみたが、make がエラーになってしまう。そこで、ネイティブ Ubuntu 18.04 でやってみたところ make が PASS した。今回は、pcie_s10 と pcie_us をやってみよう。

前回の pcie_ptile は Intel P-Tile PCIe ハード コアのモデルで、PCIe 第 4 世代 x16 までの P タイルを含むインテル Stratix 10 DX または Agilex F シリーズ FPGA をターゲットとする HDL デザインをテストできるそうだ。

これからやる、pcie_s10 はインテル Stratix 10 H タイル/L タイル PCIe ハードコアのモデルだそうだ。
cocotbext-pcie/tests/pcie_s10 をやってみよう。
cocotbext-pcie/tests/pcie_s10 ディレクトリに行った。
test_pcie_s10.v に VCD ファイルを出力する行を挿入した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_pcie_s10.vcd");
  $dumpvars (0, test_pcie_s10);
  #1;
end
`endif


cocotb_axi_102_230628.png

ネイティブ Ubuntu 18.04 でやってみたところ make が PASS した。
make
cocotb_axi_103_230628.png

gtkwave で PCI-Expsess の波形を見てみよう。
gtkwave test_pcie_s10.vcd
cocotb_axi_104_230628.png

一部分の波形を拡大した。
cocotb_axi_105_230628.png

次に pcie_us をやってみよう。
pcie_us はザイリンクス UltraScale および UltraScale+ PCIe ハード コアのモデルで、これらのモジュールを PCIe BFM と組み合わせて使用​​すると、Xilinx UltraScale、UltraScale+、または Virtex 7 シリーズ FPGA (PCIe gen 3 x16 または PCIe gen 4 x8 まで) をターゲットとする HDL デザインをテストできるそうだ。

UltraScale+ Device Integrated Block for PCI Express v1.1 LogiCORE IP 製品ガイ ド”の”図 1-1: コアのインターフェイス”の一部を引用する。
cocotb_axi_108_230628.png

これと test_pcie_us.v のポートの定義を比較すると、信号名が合っているのが分かる。
cocotb_axi_107_230628.png

cocotbext-pcie/tests/pcie_us をやってみよう。
cocotbext-pcie/tests/pcie_us ディレクトリに行った。
test_pcie_us.v に VCD ファイルを出力する行を挿入した。
cocotb_axi_106_230628.png

make を行ったところ PASS した。
make
cocotb_axi_109_230628.png

gtkwave で PCI-Expsess の波形を見てみよう。
gtkwave test_pcie_us.vcd
cocotb_axi_110_230628.png

m_axis_cq_tdata が動いている辺りを拡大した。
cocotb_axi_111_230628.png

m_axis_rc_tdata が動いている辺りを拡大した。
cocotb_axi_112_230628.png
  1. 2023年06月28日 04:55 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-pcie を使ってみる1

cocotb の PCI-Express シミュレーション環境の cocotbext-pcie を使ってみよう。最初に Windows 11 の WSL2 上の Ubuntu 22.04 で試してみたが、make がエラーになってしまう。そこで、ネイティブ Ubuntu 18.04 でやってみたところ make が PASS した。

最初に git clone と pip でのインストールを行った。(Windows 11 の WSL2 上の Ubuntu 22.04 と ネイティブ Ubuntu 18.04)
git clone https://github.com/alexforencich/cocotbext-pcie.git
pip install cocotbext-pcie

cocotb_axi_97_230627.png

cocotbext-pcie/tests/pcie_ptile をやってみよう。
cocotbext-pcie/tests/pcie_ptile ディレクトリに行った。
test_pcie_plite.v に VCD ファイルを出力する行を挿入した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_pcie_ptile.vcd");
  $dumpvars (0, test_pcie_ptile);
  #1;
end
`endif


cocotb_axi_98_230627.png

make したところ、Windows 11 の WSL2 上の Ubuntu 22.04 ではエラーになった。
cocotbext-axi_96_230627.png

ネイティブ Ubuntu 18.04 でやってみたところ make が PASS した。
make
cocotb_axi_99_230627.png

gtkwave で PCI-Expsess の波形を見てみよう。
gtkwave test_pcie_plite.vcd
cocotb_axi_100_230627.png

一部分の波形を拡大した。
cocotb_axi_101_230627.png
  1. 2023年06月27日 04:40 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-eth を使ってみる2

cocotbext-eth を使ってみる1”の続き。

cocotb の ethernet シミュレーション環境の cocotbext-eth を使ってみようということで、前回は、cocotbext-eth の tests ディレクトリの下の eth_mac と gmii をやってみた。今回は、同じく tests ディレクトリの下の rgmmi_phy と xgmii をやってみよう。

cocotbext-eth/tests/rgmmi_phy ディレクトリに行った。
test_rgmii_phy.v に VCD ファイルを出力する行を挿入した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_rgmii_phy.vcd");
  $dumpvars (0, test_rgmii_phy);
  #1;
end
`endif


cocotbext-axi_87_230626.png

make したところ、PASS した。
make
cocotbext-axi_88_230626.png

make した結果、test_rgmii_phy.vcd が生成されたので、gtkwave で波形を表示した。
gtkwave test_rgmii_phy.vcd
cocotbext-axi_89_230626.png

tx 部分の拡大波形を示す
cocotbext-axi_90_230626.png

rx 部分の拡大波形を示す。
cocotbext-axi_91_230626.png


次に cocotbext-eth/tests/xgmii をやってみよう。

test_xgmii.v に VCD ファイルを出力する行を挿入した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_xgmii.vcd");
  $dumpvars (0, test_xgmii);
  #1;
end
`endif


cocotbext-axi_92_230626.png

make を行ったところ PASS した。
make
cocotbext-axi_93_230626.png

make した結果、test_xgmii.vcd が生成されたので、gtkwave で波形を表示した。
gtkwave test_xgmii.vcd
cocotbext-axi_94_230626.png

一部分を拡大した。
cocotbext-axi_95_230626.png
  1. 2023年06月26日 04:39 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-eth を使ってみる1

cocotb の ethernet シミュレーション環境の cocotbext-eth を使ってみようということで、cocotbext-eth の tests ディレクトリの下の eth_mac と gmii をやってみた。

まずは、cocotbext-eth を git clone した。
git clone https://github.com/alexforencich/cocotbext-eth.git
cocotbext-axi_72_230624.png

cocotbext-eth を pip でインストールした。
pip install cocotbext-eth
cocotbext-axi_73_230624.png

cocotbext-eth/tests/eth-mac ディレクトリに行って make したところ PASS した。
make
cocotbext-axi_74_230624.png

改めて、test_eth_mac.v に VCD ファイルを出力する行を挿入した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_eth_mac.vcd");
  $dumpvars (0, test_eth_mac);
  #1;
end
`endif


cocotbext-axi_75_230624.png

test_eth_mac.py の一部を引用する。
やはり、TB クラスを定義している。
cocotbext-axi_79_230624.png

make した結果、test_eth_mac.vcd が生成されたので、gtkwave で波形を表示した。
gtkwave test_eth_mac.vcd
cocotbext-axi_76_230624.png

tx 部分の拡大波形を示す。
cocotbext-axi_77_230624.png

rx 部分の拡大波形を示す。
cocotbext-axi_78_230624.png

次に cocotbext-eth/tests/gmii_phy をやってみよう。

test_gmii_phy.v に VCD ファイルを出力する行を挿入した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_gmii_phy.vcd");
  $dumpvars (0, test_gmii_phy);
  #1;
end
`endif


cocotbext-axi_82_230625.png

make を行った。
make
PASS している。
cocotbext-axi_83_230625.png

make した結果、test_gmii_phy.vcd が生成されたので、gtkwave で波形を表示した。
gtkwave test_gmii_phy.vcd
cocotbext-axi_84_230625.png

tx 部分の拡大波形を示す。
cocotbext-axi_85_230625.png

rx 部分の拡大波形を示す。
cocotbext-axi_86_230625.png
  1. 2023年06月25日 09:33 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4 Lite インターフェースの IP をシミュレーション3

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4 Lite インターフェースの IP をシミュレーション2”の続き。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した IP をシミュレーションしてきたが、最後に AXI4-Stream の Source 側が残っているので、それを cocotbext-axi でシミュレーションしようということで、前回は、ネイティブ Ubuntu 18.04 のパソコンで、cocotbext-axi を試しているのだが、make を実行するとアサーションがエラーになってしまった。アサーションをコメントアウトしてもアサーション・エラーだった。今回は、Windows 11 の WSL2 上の Ubuntu 22.04 で test_square_axis2 を試してみたが、アサーションが通った。Ubuntu のバージョンによって動作が異なるようだ。

Windows 11 の WSL2 上の Ubuntu 22.04 を起動して、cocotb と cocotbext-axi の環境を整備し、前回同様にディレクトリを作成し、ファイルをコピーした。

cocotbext-axi/tests/test_square_axis2 ディレクトリに行って、make を実行した。
make
cocotbext-axi_70_230623.png

make のログを示す。

masaaki@marsee101-notebook:~/Cocotb/cocotbext-axi/tests/test_square_axis2$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: Entering directory '/home/masaaki/Cocotb/cocotbext-axi/tests/test_square_axis2'
mkdir -p sim_build
/usr/bin/iverilog -o sim_build/sim.vvp -D COCOTB_SIM=1 -s test_square_axis2 -f sim_build/cmds.f -g2012   test_square_axis2.v test_square_axis2_control_s_axi.v test_square_axis2_flow_control_loop_pipe.v test_square_axis2_mul_32s_32s_32_2_1.v test_square_axis2_regslice_both.v
rm -f results.xml
MODULE=test_square_axis2 TESTCASE= TOPLEVEL=test_square_axis2 TOPLEVEL_LANG=verilog \
         /usr/bin/vvp -M /usr/local/lib/python3.10/dist-packages/cocotb/libs -m libcocotbvpi_icarus   sim_build/sim.vvp
     -.--ns INFO     gpi                                ..mbed/gpi_embed.cpp:76   in set_program_name_in_venv        Did not detect Python virtual environment. Using system-wide Python interpreter
     -.--ns INFO     gpi                                ../gpi/GpiCommon.cpp:101  in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb                             Running on Icarus Verilog version 11.0 (stable)
     0.00ns INFO     cocotb                             Running tests with cocotb v1.8.0 from /usr/local/lib/python3.10/dist-packages/cocotb
     0.00ns INFO     cocotb                             Seeding Python random module with 1687378922
     0.00ns INFO     cocotb.regression                  Found test test_square_axis2.test_square_axil
     0.00ns INFO     cocotb.regression                  running test_square_axil (1/1)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master (write)
     0.00ns INFO     ...test_square_axis2.s_axi_control cocotbext-axi version 0.1.24
     0.00ns INFO     ...test_square_axis2.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ...test_square_axis2.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master configuration:
     0.00ns INFO     ...test_square_axis2.s_axi_control   Address width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master signals:
     0.00ns INFO     ...test_square_axis2.s_axi_control   awaddr width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   awprot: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   awready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   bready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   bresp: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master (read)
     0.00ns INFO     ...test_square_axis2.s_axi_control cocotbext-axi version 0.1.24
     0.00ns INFO     ...test_square_axis2.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ...test_square_axis2.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master configuration:
     0.00ns INFO     ...test_square_axis2.s_axi_control   Address width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master signals:
     0.00ns INFO     ...test_square_axis2.s_axi_control   araddr width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   arprot: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   arready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rresp: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source
     0.00ns INFO     cocotb.test_square_axis2.in_r      cocotbext-axi version 0.1.24
     0.00ns INFO     cocotb.test_square_axis2.in_r      Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis2.in_r      https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source configuration:
     0.00ns INFO     cocotb.test_square_axis2.in_r        Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source signals:
     0.00ns INFO     cocotb.test_square_axis2.in_r        tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        tdest: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tid: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tkeep: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tlast: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        tuser: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r      Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink
     0.00ns INFO     cocotb.test_square_axis2.out_r     cocotbext-axi version 0.1.24
     0.00ns INFO     cocotb.test_square_axis2.out_r     Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis2.out_r     https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink configuration:
     0.00ns INFO     cocotb.test_square_axis2.out_r       Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink signals:
     0.00ns INFO     cocotb.test_square_axis2.out_r       tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       tdest: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tid: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tkeep: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tlast: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       tuser: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r     Reset de-asserted
VCD info: dumpfile test_square_axis2.vcd opened for output.
    40.00ns INFO     ...test_square_axis2.s_axi_control Write start addr: 0x00000000 prot: AxiProt.NONSECURE data: 01 00 00 00
    70.00ns INFO     ...test_square_axis2.s_axi_control Write complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
    70.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
    80.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x00\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=1, sim_time_start=80000, sim_time_end=None)
    90.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x01\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=90000, sim_time_end=None)
   100.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x02\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=100000, sim_time_end=None)
   100.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   100.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   110.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x03\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=110000, sim_time_end=None)
   120.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x04\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=120000, sim_time_end=None)
   130.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x05\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=130000, sim_time_end=None)
   130.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'\x00\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=130000, sim_time_end=130000)
   130.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   130.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   140.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x06\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=140000, sim_time_end=None)
   140.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'\x01\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=140000, sim_time_end=140000)
   150.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x07\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=150000, sim_time_end=None)
   150.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'\x04\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=150000, sim_time_end=150000)
   160.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x08\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=160000, sim_time_end=None)
   160.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'\t\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=160000, sim_time_end=160000)
   160.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   160.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   170.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\t\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=170000, sim_time_end=None)
   170.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'\x10\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=170000, sim_time_end=170000)
   180.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'\x19\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=180000, sim_time_end=180000)
   190.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'$\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=190000, sim_time_end=190000)
   190.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   190.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   200.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'1\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=200000, sim_time_end=200000)
   210.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'@\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=210000, sim_time_end=210000)
   220.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=bytearray(b'Q\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=220000, sim_time_end=220000)
   220.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 08
   220.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   250.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 06
i =  0  tdata =  0
i =  1  tdata =  1
i =  2  tdata =  4
i =  3  tdata =  9
i =  4  tdata =  16
i =  5  tdata =  25
i =  6  tdata =  36
i =  7  tdata =  49
i =  8  tdata =  64
i =  9  tdata =  81
   250.00ns INFO     cocotb.regression                  test_square_axil passed
   250.00ns INFO     cocotb.regression                  ********************************************************************************************
                                                        ** TEST                                STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        ********************************************************************************************
                                                        ** test_square_axis2.test_square_axil   PASS         250.00           0.04       6918.54  **
                                                        ********************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0                      250.00           0.21       1215.25  **
                                                        ********************************************************************************************

make[1]: Leaving directory '/home/masaaki/Cocotb/cocotbext-axi/tests/test_square_axis2'


gtkwave で test_square_axis.vcd を開く。
gtkwave test_square_axis2.vcd
AXI4 Lite インターフェース、AXI4-Stream インターフェースの信号を観察した。
今回は、正常に AXI4-Stream インターフェースの信号が表示されている。
cocotbext-axi_71_230623.png

Ubuntu 18.04 では cocotbext-axi の AXI4-Stream インターフェースはシミュレーションしない方が良さそうだ。Ubuntu 22.04 を使用することにする。

他のネイティブ Ubuntu 18.04 のパソコンでやってみたが、PASS したので、家のネイティブ Ubuntu 18.04 のパソコンが何かおかしいようだ。。。
  1. 2023年06月23日 03:40 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4 Lite インターフェースの IP をシミュレーション2

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4 Lite インターフェースの IP をシミュレーション1”の続き。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した IP をシミュレーションしてきたが、最後に AXI4-Stream の Source 側が残っているので、それを cocotbext-axi でシミュレーションしようということで、前回は、AXI4-Stream 入出力の 2 乗 IP の test_square_axis2 を Vitis HLS 2013.1 で作成した。今回は、ネイティブ Ubuntu 18.04 のパソコンで、cocotbext-axi を試しているのだが、make を実行するとアサーションがエラーになってしまった。アサーションをコメントアウトしてもアサーション・エラーだった。

現在、cocotbext-axi は Ubuntu 18.04 のパソコンで試している。

cocotbext-axi/tests ディレクトリの下に、test_square_axis2 ディレクトリを作成し、前回、高位合成した Verilog HDL ファイルの test_square_axis2.v, test_square_axis2_control_s_axi.v, test_square_axis2_flow_control_loop_pipe.v, test_square_axis2_mul_32s_32s_32_2_1.v, test_square_axis2_regslice_both.v をコピーした。

cocotbext-axi の tests ディレクトリのファイルを参考にして、Makefile と test_square_axis2.py を作成した。
cocotb_axi_65_230621.png

Makefile を示す。

# Makefile (for test_square_axis)
# 2023/06/14 by marsee

SIM ?= icarus

VERILOG_SOURCES += test_square_axis2.v
VERILOG_SOURCES += test_square_axis2_control_s_axi.v
VERILOG_SOURCES += test_square_axis2_flow_control_loop_pipe.v
VERILOG_SOURCES += test_square_axis2_mul_32s_32s_32_2_1.v
VERILOG_SOURCES += test_square_axis2_regslice_both.v

TOPLEVEL = test_square_axis2
MODULE = test_square_axis2

include $(shell cocotb-config --makefiles)/Makefile.sim



test_square_axis2.py を示す。

# test_aquare_axi.py
# 2023/06/13 by marsee
# I created the software with reference to cocotbext-axi/tests/axil/test_axil.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axil/test_axil.py
# I created the software with reference to cocotbext-axi/tests/axis/test_axis.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axis/test_axis.py

import random
import cocotb
from cocotb.clock import Clock
from cocotb.triggers import Timer, RisingEdge

from cocotbext.axi import AxiLiteBus, AxiLiteMaster, AxiLiteRam
from cocotbext.axi import AxiBus, AxiMaster, AxiRam
from cocotbext.axi import AxiStreamFrame, AxiStreamBus, AxiStreamSource, AxiStreamSink, AxiStreamMonitor

AP_DONE = 0x2

class TEST:
    def __init__(self, dut):
        self.dut = dut
        cocotb.start_soon(Clock(dut.ap_clk, 10, units="ns").start())
        self.axil_master = AxiLiteMaster(AxiLiteBus.from_prefix(dut, "s_axi_control"), dut.ap_clk)
        self.axis_source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "in_r"), dut.ap_clk)
        self.axis_sink = AxiStreamSink(AxiStreamBus.from_prefix(dut, "out_r"), dut.ap_clk)

@cocotb.test()
async def test_square_axis2(dut):  
    test = TEST(dut)

    dut.ap_rst_n.value = 0; # Reset
    await Timer(30, units='ns')
    dut.ap_rst_n.value = 1; # Normal Operation
    await Timer(10, units='ns')
    
    ap_start = 1
    await test.axil_master.write(0x00, ap_start.to_bytes(4,'little')) # ap_start
    #await test.axil_master.read(0x00, 1)
    
    for i in range(10):
        data = i.to_bytes(4, 'little')
        source_frame = AxiStreamFrame(data)
        if i == 0:
            source_frame.tuser = 1
        else:
            source_frame.tuser = 0
        if i == 9:
            source_frame.tlast = 1
        else:
            source_frame.tlast = 0
        await test.axis_source.send(source_frame)

    data = await test.axil_master.read(0x00, 1) # wait end
    data_int = int.from_bytes(data, 'little')
    while (data_int & AP_DONE) != AP_DONE:
        data = await test.axil_master.read(0x00, 1)
        data_int = int.from_bytes(data, 'little')

    for i in range(10):
        sink_frame = await test.axis_sink.recv()
        #print(sink_frame)
        tdata_ba = sink_frame.tdata
        tuser = sink_frame.tuser
        tdata = int.from_bytes(tdata_ba, 'little')
        print('i = ', i, ' tdata = ', tdata)
        assert tdata == i * i

    assert test.axis_source.empty()
    assert test.axis_sink.empty()


なお、test_square_axi.py は、タブを 4 個のスペースに変換してあるので、使用する場合は、スペースをタブに変換する。

トップの Verilog HDL ファイル(test_square_axis2.v)の WSTRB を、大文字だとテスベンチに接続されないので、小文字に置換した。AXI4-Stream インターフェースの tvalid と tready を小文字に置換した。更に VCD ファイルを出力する文を追加した。
test_square_axis2.v を示す。

// ==============================================================
// Generated by Vitis HLS v2023.1
// Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
// Copyright 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved.
// ==============================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="test_square_axis2_test_square_axis2,hls_ip_2023_1,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z020-clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=6.912000,HLS_SYN_LAT=14,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=674,HLS_SYN_LUT=436,HLS_VERSION=2023_1}" *)

module test_square_axis2 (
        ap_clk,
        ap_rst_n,
        in_r_tvalid,
        out_r_tready,
        in_r_TDATA,
        in_r_tready,
        in_r_TKEEP,
        in_r_TSTRB,
        in_r_TUSER,
        in_r_TLAST,
        in_r_TID,
        in_r_TDEST,
        out_r_TDATA,
        out_r_tvalid,
        out_r_TKEEP,
        out_r_TSTRB,
        out_r_TUSER,
        out_r_TLAST,
        out_r_TID,
        out_r_TDEST,
        s_axi_control_AWVALID,
        s_axi_control_AWREADY,
        s_axi_control_AWADDR,
        s_axi_control_WVALID,
        s_axi_control_WREADY,
        s_axi_control_WDATA,
        s_axi_control_wstrb,
        s_axi_control_ARVALID,
        s_axi_control_ARREADY,
        s_axi_control_ARADDR,
        s_axi_control_RVALID,
        s_axi_control_RREADY,
        s_axi_control_RDATA,
        s_axi_control_RRESP,
        s_axi_control_BVALID,
        s_axi_control_BREADY,
        s_axi_control_BRESP,
        interrupt
);

parameter    ap_ST_fsm_pp0_stage0 = 1'd1;
parameter    C_S_AXI_CONTROL_DATA_WIDTH = 32;
parameter    C_S_AXI_CONTROL_ADDR_WIDTH = 5;
parameter    C_S_AXI_DATA_WIDTH = 32;

parameter C_S_AXI_CONTROL_WSTRB_WIDTH = (32 / 8);
parameter C_S_AXI_WSTRB_WIDTH = (32 / 8);

input   ap_clk;
input   ap_rst_n;
input   in_r_tvalid;
input   out_r_tready;
input  [31:0] in_r_TDATA;
output   in_r_tready;
input  [3:0] in_r_TKEEP;
input  [3:0] in_r_TSTRB;
input  [0:0] in_r_TUSER;
input  [0:0] in_r_TLAST;
input  [0:0] in_r_TID;
input  [0:0] in_r_TDEST;
output  [31:0] out_r_TDATA;
output   out_r_tvalid;
output  [3:0] out_r_TKEEP;
output  [3:0] out_r_TSTRB;
output  [0:0] out_r_TUSER;
output  [0:0] out_r_TLAST;
output  [0:0] out_r_TID;
output  [0:0] out_r_TDEST;
input   s_axi_control_AWVALID;
output   s_axi_control_AWREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_AWADDR;
input   s_axi_control_WVALID;
output   s_axi_control_WREADY;
input  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_WDATA;
input  [C_S_AXI_CONTROL_WSTRB_WIDTH - 1:0] s_axi_control_wstrb;
input   s_axi_control_ARVALID;
output   s_axi_control_ARREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_ARADDR;
output   s_axi_control_RVALID;
input   s_axi_control_RREADY;
output  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_RDATA;
output  [1:0] s_axi_control_RRESP;
output   s_axi_control_BVALID;
input   s_axi_control_BREADY;
output  [1:0] s_axi_control_BRESP;
output   interrupt;

 reg    ap_rst_n_inv;
wire    ap_start;
wire    ap_done;
reg    ap_idle;
(* fsm_encoding = "none" *) reg   [0:0] ap_CS_fsm;
wire    ap_CS_fsm_pp0_stage0;
wire    ap_enable_reg_pp0_iter0;
reg    ap_enable_reg_pp0_iter1;
reg    ap_enable_reg_pp0_iter2;
reg    ap_enable_reg_pp0_iter3;
reg    ap_idle_pp0;
wire    ap_ready;
wire   [0:0] icmp_ln14_fu_142_p2;
reg    ap_block_state1_pp0_stage0_iter0;
wire    ap_block_state2_pp0_stage0_iter1;
wire    regslice_both_out_r_V_data_V_U_apdone_blk;
reg    ap_block_state3_pp0_stage0_iter2;
reg    ap_block_state4_pp0_stage0_iter3;
wire    ap_loop_exit_ready;
reg    ap_loop_exit_ready_pp0_iter2_reg;
reg    ap_block_pp0_stage0_subdone;
reg    ap_condition_exit_pp0_iter0_stage0;
reg    ap_ready_int;
reg    in_r_TDATA_blk_n;
wire    ap_block_pp0_stage0;
reg    out_r_TDATA_blk_n;
reg   [0:0] icmp_ln14_reg_194;
reg    ap_block_pp0_stage0_11001;
reg   [0:0] icmp_ln14_reg_194_pp0_iter1_reg;
reg  signed [31:0] val_data_reg_198;
reg   [3:0] val_keep_reg_204;
reg   [3:0] val_keep_reg_204_pp0_iter1_reg;
reg   [3:0] val_strb_reg_209;
reg   [3:0] val_strb_reg_209_pp0_iter1_reg;
reg   [0:0] val_user_reg_214;
reg   [0:0] val_user_reg_214_pp0_iter1_reg;
reg   [0:0] val_last_reg_219;
reg   [0:0] val_last_reg_219_pp0_iter1_reg;
reg   [0:0] val_id_reg_224;
reg   [0:0] val_id_reg_224_pp0_iter1_reg;
reg   [0:0] val_dest_reg_229;
reg   [0:0] val_dest_reg_229_pp0_iter1_reg;
wire   [31:0] grp_fu_129_p2;
reg   [3:0] i_fu_82;
wire   [3:0] i_2_fu_148_p2;
wire    ap_loop_init;
reg   [3:0] ap_sig_allocacmp_i_1;
reg    ap_block_pp0_stage0_01001;
reg    grp_fu_129_ce;
reg    ap_done_reg;
wire    ap_continue_int;
reg    ap_done_int;
reg    ap_loop_exit_ready_pp0_iter1_reg;
reg   [0:0] ap_NS_fsm;
wire    ap_enable_pp0;
wire    ap_start_int;
wire    regslice_both_in_r_V_data_V_U_apdone_blk;
wire   [31:0] in_r_TDATA_int_regslice;
wire    in_r_TVALID_int_regslice;
reg    in_r_TREADY_int_regslice;
wire    regslice_both_in_r_V_data_V_U_ack_in;
wire    regslice_both_in_r_V_keep_V_U_apdone_blk;
wire   [3:0] in_r_TKEEP_int_regslice;
wire    regslice_both_in_r_V_keep_V_U_vld_out;
wire    regslice_both_in_r_V_keep_V_U_ack_in;
wire    regslice_both_in_r_V_strb_V_U_apdone_blk;
wire   [3:0] in_r_TSTRB_int_regslice;
wire    regslice_both_in_r_V_strb_V_U_vld_out;
wire    regslice_both_in_r_V_strb_V_U_ack_in;
wire    regslice_both_in_r_V_user_V_U_apdone_blk;
wire   [0:0] in_r_TUSER_int_regslice;
wire    regslice_both_in_r_V_user_V_U_vld_out;
wire    regslice_both_in_r_V_user_V_U_ack_in;
wire    regslice_both_in_r_V_last_V_U_apdone_blk;
wire   [0:0] in_r_TLAST_int_regslice;
wire    regslice_both_in_r_V_last_V_U_vld_out;
wire    regslice_both_in_r_V_last_V_U_ack_in;
wire    regslice_both_in_r_V_id_V_U_apdone_blk;
wire   [0:0] in_r_TID_int_regslice;
wire    regslice_both_in_r_V_id_V_U_vld_out;
wire    regslice_both_in_r_V_id_V_U_ack_in;
wire    regslice_both_in_r_V_dest_V_U_apdone_blk;
wire   [0:0] in_r_TDEST_int_regslice;
wire    regslice_both_in_r_V_dest_V_U_vld_out;
wire    regslice_both_in_r_V_dest_V_U_ack_in;
reg    out_r_TVALID_int_regslice;
wire    out_r_TREADY_int_regslice;
wire    regslice_both_out_r_V_data_V_U_vld_out;
wire    regslice_both_out_r_V_keep_V_U_apdone_blk;
wire    regslice_both_out_r_V_keep_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_keep_V_U_vld_out;
wire    regslice_both_out_r_V_strb_V_U_apdone_blk;
wire    regslice_both_out_r_V_strb_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_strb_V_U_vld_out;
wire    regslice_both_out_r_V_user_V_U_apdone_blk;
wire    regslice_both_out_r_V_user_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_user_V_U_vld_out;
wire    regslice_both_out_r_V_last_V_U_apdone_blk;
wire    regslice_both_out_r_V_last_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_last_V_U_vld_out;
wire    regslice_both_out_r_V_id_V_U_apdone_blk;
wire    regslice_both_out_r_V_id_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_id_V_U_vld_out;
wire    regslice_both_out_r_V_dest_V_U_apdone_blk;
wire    regslice_both_out_r_V_dest_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_dest_V_U_vld_out;
reg    ap_condition_192;
wire    ap_ce_reg;
wire   [31:0] ap_return;

// power-on initialization
initial begin
#0 ap_CS_fsm = 1'd1;
#0 ap_enable_reg_pp0_iter1 = 1'b0;
#0 ap_enable_reg_pp0_iter2 = 1'b0;
#0 ap_enable_reg_pp0_iter3 = 1'b0;
#0 ap_done_reg = 1'b0;
end

test_square_axis2_control_s_axi #(
    .C_S_AXI_ADDR_WIDTH( C_S_AXI_CONTROL_ADDR_WIDTH ),
    .C_S_AXI_DATA_WIDTH( C_S_AXI_CONTROL_DATA_WIDTH ))
control_s_axi_U(
    .AWVALID(s_axi_control_AWVALID),
    .AWREADY(s_axi_control_AWREADY),
    .AWADDR(s_axi_control_AWADDR),
    .WVALID(s_axi_control_WVALID),
    .WREADY(s_axi_control_WREADY),
    .WDATA(s_axi_control_WDATA),
    .WSTRB(s_axi_control_wstrb),
    .ARVALID(s_axi_control_ARVALID),
    .ARREADY(s_axi_control_ARREADY),
    .ARADDR(s_axi_control_ARADDR),
    .RVALID(s_axi_control_RVALID),
    .RREADY(s_axi_control_RREADY),
    .RDATA(s_axi_control_RDATA),
    .RRESP(s_axi_control_RRESP),
    .BVALID(s_axi_control_BVALID),
    .BREADY(s_axi_control_BREADY),
    .BRESP(s_axi_control_BRESP),
    .ACLK(ap_clk),
    .ARESET(ap_rst_n_inv),
    .ACLK_EN(1'b1),
    .ap_start(ap_start),
    .interrupt(interrupt),
    .ap_ready(ap_ready),
    .ap_done(ap_done),
    .ap_idle(ap_idle),
    .ap_return(32'd0)
);

test_square_axis2_mul_32s_32s_32_2_1 #(
    .ID( 1 ),
    .NUM_STAGE( 2 ),
    .din0_WIDTH( 32 ),
    .din1_WIDTH( 32 ),
    .dout_WIDTH( 32 ))
mul_32s_32s_32_2_1_U1(
    .clk(ap_clk),
    .reset(ap_rst_n_inv),
    .din0(val_data_reg_198),
    .din1(val_data_reg_198),
    .ce(grp_fu_129_ce),
    .dout(grp_fu_129_p2)
);

test_square_axis2_flow_control_loop_pipe flow_control_loop_pipe_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .ap_start(ap_start),
    .ap_ready(ap_ready),
    .ap_done(ap_done),
    .ap_start_int(ap_start_int),
    .ap_loop_init(ap_loop_init),
    .ap_ready_int(ap_ready_int),
    .ap_loop_exit_ready(ap_condition_exit_pp0_iter0_stage0),
    .ap_loop_exit_done(ap_done_int),
    .ap_continue_int(ap_continue_int),
    .ap_done_int(ap_done_int),
    .ap_continue(1'b1)
);

test_square_axis2_regslice_both #(
    .DataWidth( 32 ))
regslice_both_in_r_V_data_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(in_r_TDATA),
    .vld_in(in_r_tvalid),
    .ack_in(regslice_both_in_r_V_data_V_U_ack_in),
    .data_out(in_r_TDATA_int_regslice),
    .vld_out(in_r_TVALID_int_regslice),
    .ack_out(in_r_TREADY_int_regslice),
    .apdone_blk(regslice_both_in_r_V_data_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 4 ))
regslice_both_in_r_V_keep_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(in_r_TKEEP),
    .vld_in(in_r_tvalid),
    .ack_in(regslice_both_in_r_V_keep_V_U_ack_in),
    .data_out(in_r_TKEEP_int_regslice),
    .vld_out(regslice_both_in_r_V_keep_V_U_vld_out),
    .ack_out(in_r_TREADY_int_regslice),
    .apdone_blk(regslice_both_in_r_V_keep_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 4 ))
regslice_both_in_r_V_strb_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(in_r_TSTRB),
    .vld_in(in_r_tvalid),
    .ack_in(regslice_both_in_r_V_strb_V_U_ack_in),
    .data_out(in_r_TSTRB_int_regslice),
    .vld_out(regslice_both_in_r_V_strb_V_U_vld_out),
    .ack_out(in_r_TREADY_int_regslice),
    .apdone_blk(regslice_both_in_r_V_strb_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_in_r_V_user_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(in_r_TUSER),
    .vld_in(in_r_tvalid),
    .ack_in(regslice_both_in_r_V_user_V_U_ack_in),
    .data_out(in_r_TUSER_int_regslice),
    .vld_out(regslice_both_in_r_V_user_V_U_vld_out),
    .ack_out(in_r_TREADY_int_regslice),
    .apdone_blk(regslice_both_in_r_V_user_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_in_r_V_last_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(in_r_TLAST),
    .vld_in(in_r_tvalid),
    .ack_in(regslice_both_in_r_V_last_V_U_ack_in),
    .data_out(in_r_TLAST_int_regslice),
    .vld_out(regslice_both_in_r_V_last_V_U_vld_out),
    .ack_out(in_r_TREADY_int_regslice),
    .apdone_blk(regslice_both_in_r_V_last_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_in_r_V_id_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(in_r_TID),
    .vld_in(in_r_tvalid),
    .ack_in(regslice_both_in_r_V_id_V_U_ack_in),
    .data_out(in_r_TID_int_regslice),
    .vld_out(regslice_both_in_r_V_id_V_U_vld_out),
    .ack_out(in_r_TREADY_int_regslice),
    .apdone_blk(regslice_both_in_r_V_id_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_in_r_V_dest_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(in_r_TDEST),
    .vld_in(in_r_tvalid),
    .ack_in(regslice_both_in_r_V_dest_V_U_ack_in),
    .data_out(in_r_TDEST_int_regslice),
    .vld_out(regslice_both_in_r_V_dest_V_U_vld_out),
    .ack_out(in_r_TREADY_int_regslice),
    .apdone_blk(regslice_both_in_r_V_dest_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 32 ))
regslice_both_out_r_V_data_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(grp_fu_129_p2),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(out_r_TREADY_int_regslice),
    .data_out(out_r_TDATA),
    .vld_out(regslice_both_out_r_V_data_V_U_vld_out),
    .ack_out(out_r_TREADY),
    .apdone_blk(regslice_both_out_r_V_data_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 4 ))
regslice_both_out_r_V_keep_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_keep_reg_204_pp0_iter1_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_keep_V_U_ack_in_dummy),
    .data_out(out_r_TKEEP),
    .vld_out(regslice_both_out_r_V_keep_V_U_vld_out),
    .ack_out(out_r_TREADY),
    .apdone_blk(regslice_both_out_r_V_keep_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 4 ))
regslice_both_out_r_V_strb_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_strb_reg_209_pp0_iter1_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_strb_V_U_ack_in_dummy),
    .data_out(out_r_TSTRB),
    .vld_out(regslice_both_out_r_V_strb_V_U_vld_out),
    .ack_out(out_r_TREADY),
    .apdone_blk(regslice_both_out_r_V_strb_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_user_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_user_reg_214_pp0_iter1_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_user_V_U_ack_in_dummy),
    .data_out(out_r_TUSER),
    .vld_out(regslice_both_out_r_V_user_V_U_vld_out),
    .ack_out(out_r_TREADY),
    .apdone_blk(regslice_both_out_r_V_user_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_last_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_last_reg_219_pp0_iter1_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_last_V_U_ack_in_dummy),
    .data_out(out_r_TLAST),
    .vld_out(regslice_both_out_r_V_last_V_U_vld_out),
    .ack_out(out_r_TREADY),
    .apdone_blk(regslice_both_out_r_V_last_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_id_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_id_reg_224_pp0_iter1_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_id_V_U_ack_in_dummy),
    .data_out(out_r_TID),
    .vld_out(regslice_both_out_r_V_id_V_U_vld_out),
    .ack_out(out_r_TREADY),
    .apdone_blk(regslice_both_out_r_V_id_V_U_apdone_blk)
);

test_square_axis2_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_dest_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_dest_reg_229_pp0_iter1_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_dest_V_U_ack_in_dummy),
    .data_out(out_r_TDEST),
    .vld_out(regslice_both_out_r_V_dest_V_U_vld_out),
    .ack_out(out_r_TREADY),
    .apdone_blk(regslice_both_out_r_V_dest_V_U_apdone_blk)
);

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_CS_fsm <= ap_ST_fsm_pp0_stage0;
    end else begin
        ap_CS_fsm <= ap_NS_fsm;
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_done_reg <= 1'b0;
    end else begin
        if ((ap_continue_int == 1'b1)) begin
            ap_done_reg <= 1'b0;
        end else if (((1'b0 == ap_block_pp0_stage0_subdone) & (ap_loop_exit_ready_pp0_iter2_reg == 1'b1))) begin
            ap_done_reg <= 1'b1;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter1 <= 1'b0;
    end else begin
        if ((1'b1 == ap_condition_exit_pp0_iter0_stage0)) begin
            ap_enable_reg_pp0_iter1 <= 1'b0;
        end else if (((1'b0 == ap_block_pp0_stage0_subdone) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
            ap_enable_reg_pp0_iter1 <= ap_start_int;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter2 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter2 <= ap_enable_reg_pp0_iter1;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter3 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter3 <= ap_enable_reg_pp0_iter2;
        end
    end
end

always @ (posedge ap_clk) begin
    if ((1'b1 == ap_condition_192)) begin
        if ((icmp_ln14_fu_142_p2 == 1'd0)) begin
            i_fu_82 <= i_2_fu_148_p2;
        end else if ((ap_loop_init == 1'b1)) begin
            i_fu_82 <= 4'd0;
        end
    end
end

always @ (posedge ap_clk) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        ap_loop_exit_ready_pp0_iter1_reg <= ap_loop_exit_ready;
        ap_loop_exit_ready_pp0_iter2_reg <= ap_loop_exit_ready_pp0_iter1_reg;
        icmp_ln14_reg_194 <= icmp_ln14_fu_142_p2;
        icmp_ln14_reg_194_pp0_iter1_reg <= icmp_ln14_reg_194;
        val_dest_reg_229_pp0_iter1_reg <= val_dest_reg_229;
        val_id_reg_224_pp0_iter1_reg <= val_id_reg_224;
        val_keep_reg_204_pp0_iter1_reg <= val_keep_reg_204;
        val_last_reg_219_pp0_iter1_reg <= val_last_reg_219;
        val_strb_reg_209_pp0_iter1_reg <= val_strb_reg_209;
        val_user_reg_214_pp0_iter1_reg <= val_user_reg_214;
    end
end

always @ (posedge ap_clk) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln14_fu_142_p2 == 1'd0) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        val_data_reg_198 <= in_r_TDATA_int_regslice;
        val_dest_reg_229 <= in_r_TDEST_int_regslice;
        val_id_reg_224 <= in_r_TID_int_regslice;
        val_keep_reg_204 <= in_r_TKEEP_int_regslice;
        val_last_reg_219 <= in_r_TLAST_int_regslice;
        val_strb_reg_209 <= in_r_TSTRB_int_regslice;
        val_user_reg_214 <= in_r_TUSER_int_regslice;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_subdone) & (icmp_ln14_fu_142_p2 == 1'd1) & (ap_start_int == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        ap_condition_exit_pp0_iter0_stage0 = 1'b1;
    end else begin
        ap_condition_exit_pp0_iter0_stage0 = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_subdone) & (ap_loop_exit_ready_pp0_iter2_reg == 1'b1))) begin
        ap_done_int = 1'b1;
    end else begin
        ap_done_int = ap_done_reg;
    end
end

always @ (*) begin
    if (((ap_idle_pp0 == 1'b1) & (ap_start_int == 1'b0) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        ap_idle = 1'b1;
    end else begin
        ap_idle = 1'b0;
    end
end

always @ (*) begin
    if (((ap_enable_reg_pp0_iter3 == 1'b0) & (ap_enable_reg_pp0_iter2 == 1'b0) & (ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b0))) begin
        ap_idle_pp0 = 1'b1;
    end else begin
        ap_idle_pp0 = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_subdone) & (ap_start_int == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        ap_ready_int = 1'b1;
    end else begin
        ap_ready_int = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0) & (ap_start_int == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0) & (ap_loop_init == 1'b1))) begin
        ap_sig_allocacmp_i_1 = 4'd0;
    end else begin
        ap_sig_allocacmp_i_1 = i_fu_82;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        grp_fu_129_ce = 1'b1;
    end else begin
        grp_fu_129_ce = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0) & (icmp_ln14_fu_142_p2 == 1'd0) & (ap_start_int == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        in_r_TDATA_blk_n = in_r_TVALID_int_regslice;
    end else begin
        in_r_TDATA_blk_n = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln14_fu_142_p2 == 1'd0) & (ap_start_int == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        in_r_TREADY_int_regslice = 1'b1;
    end else begin
        in_r_TREADY_int_regslice = 1'b0;
    end
end

always @ (*) begin
    if ((((1'b0 == ap_block_pp0_stage0) & (ap_enable_reg_pp0_iter3 == 1'b1)) | ((1'b0 == ap_block_pp0_stage0) & (ap_enable_reg_pp0_iter2 == 1'b1)))) begin
        out_r_TDATA_blk_n = out_r_TREADY_int_regslice;
    end else begin
        out_r_TDATA_blk_n = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter2 == 1'b1))) begin
        out_r_TVALID_int_regslice = 1'b1;
    end else begin
        out_r_TVALID_int_regslice = 1'b0;
    end
end

always @ (*) begin
    case (ap_CS_fsm)
        ap_ST_fsm_pp0_stage0 : begin
            ap_NS_fsm = ap_ST_fsm_pp0_stage0;
        end
        default : begin
            ap_NS_fsm = 'bx;
        end
    endcase
end

assign ap_CS_fsm_pp0_stage0 = ap_CS_fsm[32'd0];

assign ap_block_pp0_stage0 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_pp0_stage0_01001 = (((ap_loop_exit_ready_pp0_iter2_reg == 1'b1) & (regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1)) | ((ap_enable_reg_pp0_iter2 == 1'b1) & ((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1) | (out_r_TREADY_int_regslice == 1'b0))) | ((icmp_ln14_fu_142_p2 == 1'd0) & (in_r_TVALID_int_regslice == 1'b0) & (ap_start_int == 1'b1)) | ((out_r_TREADY_int_regslice == 1'b0) & (ap_enable_reg_pp0_iter3 == 1'b1)));
end

always @ (*) begin
    ap_block_pp0_stage0_11001 = (((ap_loop_exit_ready_pp0_iter2_reg == 1'b1) & (regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1)) | ((ap_enable_reg_pp0_iter2 == 1'b1) & ((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1) | (out_r_TREADY_int_regslice == 1'b0))) | ((icmp_ln14_fu_142_p2 == 1'd0) & (in_r_TVALID_int_regslice == 1'b0) & (ap_start_int == 1'b1)) | ((out_r_TREADY_int_regslice == 1'b0) & (ap_enable_reg_pp0_iter3 == 1'b1)));
end

always @ (*) begin
    ap_block_pp0_stage0_subdone = (((ap_loop_exit_ready_pp0_iter2_reg == 1'b1) & (regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1)) | ((ap_enable_reg_pp0_iter2 == 1'b1) & ((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1) | (out_r_TREADY_int_regslice == 1'b0))) | ((icmp_ln14_fu_142_p2 == 1'd0) & (in_r_TVALID_int_regslice == 1'b0) & (ap_start_int == 1'b1)) | ((out_r_TREADY_int_regslice == 1'b0) & (ap_enable_reg_pp0_iter3 == 1'b1)));
end

always @ (*) begin
    ap_block_state1_pp0_stage0_iter0 = ((icmp_ln14_fu_142_p2 == 1'd0) & (in_r_TVALID_int_regslice == 1'b0));
end

assign ap_block_state2_pp0_stage0_iter1 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_state3_pp0_stage0_iter2 = ((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1) | (out_r_TREADY_int_regslice == 1'b0));
end

always @ (*) begin
    ap_block_state4_pp0_stage0_iter3 = (out_r_TREADY_int_regslice == 1'b0);
end

always @ (*) begin
    ap_condition_192 = ((1'b0 == ap_block_pp0_stage0_11001) & (ap_start_int == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0));
end

assign ap_enable_pp0 = (ap_idle_pp0 ^ 1'b1);

assign ap_enable_reg_pp0_iter0 = ap_start_int;

assign ap_loop_exit_ready = ap_condition_exit_pp0_iter0_stage0;

always @ (*) begin
    ap_rst_n_inv = ~ap_rst_n;
end

assign i_2_fu_148_p2 = (ap_sig_allocacmp_i_1 + 4'd1);

assign icmp_ln14_fu_142_p2 = ((ap_sig_allocacmp_i_1 == 4'd10) ? 1'b1 : 1'b0);

assign in_r_TREADY = regslice_both_in_r_V_data_V_U_ack_in;

assign out_r_TVALID = regslice_both_out_r_V_data_V_U_vld_out;

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_square_axis2.vcd");
  $dumpvars (0, test_square_axis2);
  #1;
end
`endif

endmodule //test_square_axis2


cocotbext-axi/tests/test_square_axis2 ディレクトリに行って、make を実行した。Fail した。
Verilog HDL シミュレータは Icarus Verilog を使用した。
make
cocotb_axi_66_230621.png

”AssertionError: assert 0 == (1 * 1)”だった。

make 時のログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2' に入ります
rm -f results.xml
MODULE=test_square_axis2 TESTCASE= TOPLEVEL=test_square_axis2 TOPLEVEL_LANG=verilog \
         /usr/bin/vvp -M /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb/libs -m libcocotbvpi_icarus   sim_build/sim.vvp 
     -.--ns INFO     gpi                                ..mbed/gpi_embed.cpp:76   in set_program_name_in_venv        Did not detect Python virtual environment. Using system-wide Python interpreter
     -.--ns INFO     gpi                                ../gpi/GpiCommon.cpp:101  in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb                             Running on Icarus Verilog version 10.1 (stable)
     0.00ns INFO     cocotb                             Running tests with cocotb v1.7.0 from /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb
     0.00ns INFO     cocotb                             Seeding Python random module with 1687373978
     0.00ns INFO     cocotb.regression                  Found test test_square_axis2.test_square_axis2
     0.00ns INFO     cocotb.regression                  running test_square_axis2 (1/1)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master (write)
     0.00ns INFO     ...test_square_axis2.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ...test_square_axis2.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ...test_square_axis2.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master configuration:
     0.00ns INFO     ...test_square_axis2.s_axi_control   Address width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master signals:
     0.00ns INFO     ...test_square_axis2.s_axi_control   awaddr width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   awprot: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   awready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   bready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   bresp: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master (read)
     0.00ns INFO     ...test_square_axis2.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ...test_square_axis2.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ...test_square_axis2.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master configuration:
     0.00ns INFO     ...test_square_axis2.s_axi_control   Address width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master signals:
     0.00ns INFO     ...test_square_axis2.s_axi_control   araddr width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   arprot: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   arready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rresp: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source
     0.00ns INFO     cocotb.test_square_axis2.in_r      cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axis2.in_r      Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis2.in_r      https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source configuration:
     0.00ns INFO     cocotb.test_square_axis2.in_r        Byte size: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        Data width: 32 bits (1 bytes)
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source signals:
     0.00ns INFO     cocotb.test_square_axis2.in_r        tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        tdest: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tid: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tkeep: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tlast: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        tuser: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r      Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink
     0.00ns INFO     cocotb.test_square_axis2.out_r     cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axis2.out_r     Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis2.out_r     https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink configuration:
     0.00ns INFO     cocotb.test_square_axis2.out_r       Byte size: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       Data width: 32 bits (1 bytes)
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink signals:
     0.00ns INFO     cocotb.test_square_axis2.out_r       tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       tdest: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tid: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tkeep: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tlast: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       tuser: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r     Reset de-asserted
VCD info: dumpfile test_square_axis2.vcd opened for output.
    40.00ns INFO     ...test_square_axis2.s_axi_control Write start addr: 0x00000000 prot: AxiProt.NONSECURE data: 01 00 00 00
    70.00ns INFO     ...test_square_axis2.s_axi_control Write complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
    70.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
    80.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x00\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=1, sim_time_start=80000, sim_time_end=None)
   100.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   100.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   120.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x01\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=120000, sim_time_end=None)
   130.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=130000, sim_time_end=130000)
   130.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   130.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   140.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=140000, sim_time_end=140000)
   150.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=150000, sim_time_end=150000)
   160.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x02\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=160000, sim_time_end=None)
   160.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=160000, sim_time_end=160000)
   160.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   160.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   170.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[1], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=170000, sim_time_end=170000)
   180.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=180000, sim_time_end=180000)
   190.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=190000, sim_time_end=190000)
   190.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   190.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   200.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x03\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=200000, sim_time_end=None)
   200.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=200000, sim_time_end=200000)
   210.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[4], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=210000, sim_time_end=210000)
   220.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=220000, sim_time_end=220000)
   220.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 08
   220.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   250.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 06
i =  0  tdata =  0
i =  1  tdata =  0
   250.00ns INFO     cocotb.regression                  test_square_axis2 failed
                                                        Traceback (most recent call last):
                                                          File "/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2/test_square_axis2.py", line 66, in test_square_axis2
                                                            assert tdata == i * i
                                                        AssertionError: assert 0 == (1 * 1)
   250.00ns INFO     cocotb.regression                  *********************************************************************************************
                                                        ** TEST                                 STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        *********************************************************************************************
                                                        ** test_square_axis2.test_square_axis2   FAIL         250.00           0.03       8539.34  **
                                                        *********************************************************************************************
                                                        ** TESTS=1 PASS=0 FAIL=1 SKIP=0                       250.00           0.26        977.73  **
                                                        *********************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2' から出ます


test_square_axis2.py の 66 行目の”assert tdata == i * i”をコメントアウトして、make を再実行した。
make
cocotb_axi_67_230621.png

今度は、”assert test.axis_source.empty()”で”AssertionError: assert False”だった。
make 時のログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2' に入ります
rm -f results.xml
MODULE=test_square_axis2 TESTCASE= TOPLEVEL=test_square_axis2 TOPLEVEL_LANG=verilog \
         /usr/bin/vvp -M /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb/libs -m libcocotbvpi_icarus   sim_build/sim.vvp 
     -.--ns INFO     gpi                                ..mbed/gpi_embed.cpp:76   in set_program_name_in_venv        Did not detect Python virtual environment. Using system-wide Python interpreter
     -.--ns INFO     gpi                                ../gpi/GpiCommon.cpp:101  in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb                             Running on Icarus Verilog version 10.1 (stable)
     0.00ns INFO     cocotb                             Running tests with cocotb v1.7.0 from /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb
     0.00ns INFO     cocotb                             Seeding Python random module with 1687374185
     0.00ns INFO     cocotb.regression                  Found test test_square_axis2.test_square_axis2
     0.00ns INFO     cocotb.regression                  running test_square_axis2 (1/1)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master (write)
     0.00ns INFO     ...test_square_axis2.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ...test_square_axis2.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ...test_square_axis2.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master configuration:
     0.00ns INFO     ...test_square_axis2.s_axi_control   Address width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master signals:
     0.00ns INFO     ...test_square_axis2.s_axi_control   awaddr width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   awprot: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   awready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   bready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   bresp: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master (read)
     0.00ns INFO     ...test_square_axis2.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ...test_square_axis2.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ...test_square_axis2.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master configuration:
     0.00ns INFO     ...test_square_axis2.s_axi_control   Address width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ...test_square_axis2.s_axi_control AXI lite master signals:
     0.00ns INFO     ...test_square_axis2.s_axi_control   araddr width: 5 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   arprot: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   arready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rready width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control   rresp: not present
     0.00ns INFO     ...test_square_axis2.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ...test_square_axis2.s_axi_control Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source
     0.00ns INFO     cocotb.test_square_axis2.in_r      cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axis2.in_r      Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis2.in_r      https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source configuration:
     0.00ns INFO     cocotb.test_square_axis2.in_r        Byte size: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        Data width: 32 bits (1 bytes)
     0.00ns INFO     cocotb.test_square_axis2.in_r      AXI stream source signals:
     0.00ns INFO     cocotb.test_square_axis2.in_r        tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        tdest: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tid: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tkeep: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tlast: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r        tuser: not present
     0.00ns INFO     cocotb.test_square_axis2.in_r        tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.in_r      Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink
     0.00ns INFO     cocotb.test_square_axis2.out_r     cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axis2.out_r     Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis2.out_r     https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink configuration:
     0.00ns INFO     cocotb.test_square_axis2.out_r       Byte size: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       Data width: 32 bits (1 bytes)
     0.00ns INFO     cocotb.test_square_axis2.out_r     AXI stream sink signals:
     0.00ns INFO     cocotb.test_square_axis2.out_r       tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       tdest: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tid: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tkeep: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tlast: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r       tuser: not present
     0.00ns INFO     cocotb.test_square_axis2.out_r       tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis2.out_r     Reset de-asserted
VCD info: dumpfile test_square_axis2.vcd opened for output.
    40.00ns INFO     ...test_square_axis2.s_axi_control Write start addr: 0x00000000 prot: AxiProt.NONSECURE data: 01 00 00 00
    70.00ns INFO     ...test_square_axis2.s_axi_control Write complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
    70.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
    80.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x00\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=1, sim_time_start=80000, sim_time_end=None)
   100.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   100.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   120.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x01\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=120000, sim_time_end=None)
   130.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=130000, sim_time_end=130000)
   130.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   130.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   140.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=140000, sim_time_end=140000)
   150.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=150000, sim_time_end=150000)
   160.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x02\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=160000, sim_time_end=None)
   160.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=160000, sim_time_end=160000)
   160.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   160.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   170.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[1], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=170000, sim_time_end=170000)
   180.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=180000, sim_time_end=180000)
   190.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=190000, sim_time_end=190000)
   190.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   190.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   200.00ns INFO     cocotb.test_square_axis2.in_r      TX frame: AxiStreamFrame(tdata=bytearray(b'\x03\x00\x00\x00'), tkeep=None, tid=None, tdest=None, tuser=0, sim_time_start=200000, sim_time_end=None)
   200.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=200000, sim_time_end=200000)
   210.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[4], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=210000, sim_time_end=210000)
   220.00ns INFO     cocotb.test_square_axis2.out_r     RX frame: AxiStreamFrame(tdata=[0], tkeep=[], tid=[], tdest=[], tuser=[], sim_time_start=220000, sim_time_end=220000)
   220.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 08
   220.00ns INFO     ...test_square_axis2.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   250.00ns INFO     ...test_square_axis2.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 06
i =  0  tdata =  0
i =  1  tdata =  0
i =  2  tdata =  0
i =  3  tdata =  0
i =  4  tdata =  1
i =  5  tdata =  0
i =  6  tdata =  0
i =  7  tdata =  0
i =  8  tdata =  4
i =  9  tdata =  0
   250.00ns INFO     cocotb.regression                  test_square_axis2 failed
                                                        Traceback (most recent call last):
                                                          File "/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2/test_square_axis2.py", line 68, in test_square_axis2
                                                            assert test.axis_source.empty()
                                                        AssertionError: assert False
                                                         +  where False = <bound method AxiStreamBase.empty of <cocotbext.axi.axis.AxiStreamSource object at 0x7fa7491f6430>>()
                                                         +    where <bound method AxiStreamBase.empty of <cocotbext.axi.axis.AxiStreamSource object at 0x7fa7491f6430>> = <cocotbext.axi.axis.AxiStreamSource object at 0x7fa7491f6430>.empty
                                                         +      where <cocotbext.axi.axis.AxiStreamSource object at 0x7fa7491f6430> = <test_square_axis2.TEST object at 0x7fa7492ce940>.axis_source
   250.00ns INFO     cocotb.regression                  *********************************************************************************************
                                                        ** TEST                                 STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        *********************************************************************************************
                                                        ** test_square_axis2.test_square_axis2   FAIL         250.00           0.03       8429.17  **
                                                        *********************************************************************************************
                                                        ** TESTS=1 PASS=0 FAIL=1 SKIP=0                       250.00           0.26        962.41  **
                                                        *********************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis2' から出ます


やはり、tdata の値が滅茶苦茶だ。

i = 0 tdata = 0
i = 1 tdata = 0
i = 2 tdata = 0
i = 3 tdata = 0
i = 4 tdata = 1
i = 5 tdata = 0
i = 6 tdata = 0
i = 7 tdata = 0
i = 8 tdata = 4
i = 9 tdata = 0


gtkwave で test_square_axis.vcd を開く。
test_square_axis の信号を追加して、AXI4 Lite インターフェースの信号を並べ替えた。
gtkwave test_square_axis.vcd
cocotb_axi_68_230621.png

AXI4-Stream の信号を示す。
in_r_TDATA の値がすでに異常だ。
cocotb_axi_69_230621.png
  1. 2023年06月22日 04:08 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4 Lite インターフェースの IP をシミュレーション1

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した IP をシミュレーションしてきたが、最後に AXI4-Stream の Source 側が残っているので、それを cocotbext-axi でシミュレーションしようということで、AXI4-Stream 入出力の 2 乗 IP の test_square_axis2 を Vitis HLS 2013.1 で作成する。

Vitis HLS 2023.1 を使用して、ZYBO Z7-20 用の test_square_axis2 プロジェクトを作成した。
cocotb_axi_58_230621.png

ソースコードの test_square_axis2.cpp を示す。

// test_square_axi2.cpp
// 2023/06/15 by marsee

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int test_square_axis2(hls::stream<ap_axis<32,1,1,1> >& in, hls::stream<ap_axis<32,1,1,1> >& out){
#pragma HLS INTERFACE mode=axis register_mode=both port=out register
#pragma HLS INTERFACE mode=axis register_mode=both port=in register
#pragma HLS INTERFACE mode=s_axilite port=return
    ap_axis<32,1,1,1> val;

    for(int i=0; i<10; i++){
        in >> val;
        val.data = val.data * val.data;
        out << val;
    }
    return(0);
}


テスベンチの test_square_axis2_tb.cpp を示す。

// test_square_axis_tb.cpp
// 2023/06/13 by marsee

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int test_square_axis(ap_int<32> *in, hls::stream<ap_axis<32,1,1,1> >& out);

int main(){
    ap_int<32> data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    hls::stream<ap_axis<32,1,1,1> > outs;
    ap_axis<32,1,1,1> val;

    test_square_axis(data, outs);

    for(int i=0; i<10; i++){
        outs >> val;
        printf("val.data = %d, val.user = %d, val.last = %d\n",
                val.data, val.user, val.last);
    }
    return(0);
}


C シミュレーションを行った。
cocotb_axi_59_230621.png

C コードの合成を行った。
ループ中のインターバルは 1 クロックでバーストしている。
cocotb_axi_60_230621.png

solution1/syn/verilog ディレクトリには、test_square_axis2.v, test_square_axis2_control_s_axi.v, test_square_axis2_flow_control_loop_pipe.v, test_square_axis2_mul_32s_32s_32_2_1.v, test_square_axis2_regslice_both.v の 5 個の Verilog HDL ファイルが生成された。
cocotb_axi_62_230621.png

C/RTL 協調シミュレーションを行った。
cocotb_axi_64_230621.png

C/RTL 協調シミュレーションの波形を拡大した。
cocotb_axi_63_230621.png
  1. 2023年06月21日 04:52 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーション3

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーション2”の続き。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーションしようということで、前回は、ネイティブ Ubuntu 18.04 のパソコンで、cocotbext-axi を試しているのだが、make を実行するとアサーションがエラーになってしまった。アサーションをコメントアウトすると PASS した。シミュレーション波形は問題ないので、アサーションの問題のようだった。今回は、Windows 11 の WSL2 上の Ubuntu 22.04 で test_square_axis を試してみたが、アサーションが通った。Ubuntu のバージョンによって動作が異なるのだろうか?

Windows 11 の WSL2 上の Ubuntu 22.04 を起動して、cocotb と cocotbext-axi の環境を整備し、前回同様にディレクトリを作成し、ファイルをコピーした。

cocotbext-axi/tests/test_square_axis ディレクトリに行って、make を実行した。
make
cocotbext-axi_54_230619.png

アサーションの”assert tdata == i * i”が通った。
tdata もきちんと値が正常なのだが、今度は tuser の値がおかしい。。。
tlast は値が取れない。

gtkwave で test_square_axis.vcd を開く。
test_square_axis の信号を追加して、AXI4 Lite インターフェースの信号を並べ替えた。
cocotbext-axi_55_230619.png

AXI4 Master の Read の信号を示す。
10 バーストでデータを読み込んでいる。
cocotbext-axi_56_230619.png

AXI4-Stream の信号を示す。
TDATA に 2 乗されたデータが 10 バーストで出力されている。
cocotbext-axi_57_230619.png

シミュレーション波形は前回と同様な波形のようだ。

make 時のログを示す。

masaaki@marsee101-notebook:~/cocotbext-axi/tests/test_square_axis$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: Entering directory '/home/masaaki/cocotbext-axi/tests/test_square_axis'
mkdir -p sim_build
/usr/bin/iverilog -o sim_build/sim.vvp -D COCOTB_SIM=1 -s test_square_axis -f sim_build/cmds.f -g2012   test_square_axis.v test_square_axis_control_s_axi.v test_square_axis_gmem_m_axi.v test_square_axis_mul_32s_32s_32_2_1.v test_square_axis_regslice_both.v
rm -f results.xml
MODULE=test_square_axis TESTCASE= TOPLEVEL=test_square_axis TOPLEVEL_LANG=verilog \
         /usr/bin/vvp -M /usr/local/lib/python3.10/dist-packages/cocotb/libs -m libcocotbvpi_icarus   sim_build/sim.vvp
     -.--ns INFO     gpi                                ..mbed/gpi_embed.cpp:76   in set_program_name_in_venv        Did not detect Python virtual environment. Using system-wide Python interpreter
     -.--ns INFO     gpi                                ../gpi/GpiCommon.cpp:101  in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb                             Running on Icarus Verilog version 11.0 (stable)
     0.00ns INFO     cocotb                             Running tests with cocotb v1.8.0 from /usr/local/lib/python3.10/dist-packages/cocotb
     0.00ns INFO     cocotb                             Seeding Python random module with 1687063383
     0.00ns INFO     cocotb.regression                  Found test test_square_axis.test_square_axil
     0.00ns INFO     cocotb.regression                  running test_square_axil (1/1)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model (write)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem cocotbext-axi version 0.1.24
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Copyright (c) 2021 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model configuration:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Address width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   ID width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model signals:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awaddr width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awburst width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awcache: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awlen width: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awlock: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awprot: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awqos: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awregion: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awsize width: 3 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awuser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wstrb width: 4 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wuser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bresp width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   buser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model (read)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem cocotbext-axi version 0.1.24
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Copyright (c) 2021 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model configuration:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Address width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   ID width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model signals:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   araddr width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arburst width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arcache: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arlen width: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arlock: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arprot: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arqos: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arregion: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arsize width: 3 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   aruser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rresp width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   ruser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master (write)
     0.00ns INFO     ..b.test_square_axis.s_axi_control cocotbext-axi version 0.1.24
     0.00ns INFO     ..b.test_square_axis.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..b.test_square_axis.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Address width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master signals:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awaddr width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awprot: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   bready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   bresp: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master (read)
     0.00ns INFO     ..b.test_square_axis.s_axi_control cocotbext-axi version 0.1.24
     0.00ns INFO     ..b.test_square_axis.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..b.test_square_axis.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Address width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master signals:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   araddr width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   arprot: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   arready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rresp: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.out_r      AXI stream sink
     0.00ns INFO     cocotb.test_square_axis.out_r      cocotbext-axi version 0.1.24
     0.00ns INFO     cocotb.test_square_axis.out_r      Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis.out_r      https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis.out_r      AXI stream sink configuration:
     0.00ns INFO     cocotb.test_square_axis.out_r        Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axis.out_r      AXI stream sink signals:
     0.00ns INFO     cocotb.test_square_axis.out_r        tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tdest: not present
     0.00ns INFO     cocotb.test_square_axis.out_r        tid: not present
     0.00ns INFO     cocotb.test_square_axis.out_r        tkeep: not present
     0.00ns INFO     cocotb.test_square_axis.out_r        tlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tuser width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r      Reset de-asserted
VCD info: dumpfile test_square_axis.vcd opened for output.
    40.00ns INFO     ..b.test_square_axis.s_axi_control Write start addr: 0x00000018 prot: AxiProt.NONSECURE data: 00 00 00 00
    70.00ns INFO     ..b.test_square_axis.s_axi_control Write complete addr: 0x00000018 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
    70.00ns INFO     ..b.test_square_axis.s_axi_control Write start addr: 0x00000000 prot: AxiProt.NONSECURE data: 01 00 00 00
   110.00ns INFO     ..b.test_square_axis.s_axi_control Write complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
   110.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   140.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   140.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   170.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   170.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   200.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   200.00ns INFO     cocotb.test_square_axis.m_axi_gmem Read burst arid: 0x0 araddr: 0x00000000 arlen: 9 arsize: 2 arprot: AxiProt.0
   200.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   230.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   230.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   260.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   260.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   290.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   290.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   320.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   320.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   350.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   350.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   370.00ns INFO     cocotb.test_square_axis.out_r      RX frame: AxiStreamFrame(tdata=bytearray(b'\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\t\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00$\x00\x00\x001\x00\x00\x00@\x00\x00\x00Q\x00\x00\x00'), tkeep=[], tid=[], tdest=[], tuser=[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], sim_time_start=280000, sim_time_end=370000)
   380.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   380.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   410.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 0e
i =  0  tdata =  0  tuser =  1
i =  1  tdata =  1  tuser =  1
i =  2  tdata =  4  tuser =  1
i =  3  tdata =  9  tuser =  1
i =  4  tdata =  16  tuser =  0
i =  5  tdata =  25  tuser =  0
i =  6  tdata =  36  tuser =  0
i =  7  tdata =  49  tuser =  0
i =  8  tdata =  64  tuser =  0
i =  9  tdata =  81  tuser =  0
   410.00ns INFO     cocotb.regression                  test_square_axil passed
   410.00ns INFO     cocotb.regression                  *******************************************************************************************
                                                        ** TEST                               STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        *******************************************************************************************
                                                        ** test_square_axis.test_square_axil   PASS         410.00           0.08       5407.80  **
                                                        *******************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0                     410.00           0.28       1480.89  **
                                                        *******************************************************************************************

make[1]: Leaving directory '/home/masaaki/cocotbext-axi/tests/test_square_axis'

  1. 2023年06月20日 04:19 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーション2

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーション1”の続き。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーションしようということで、前回は、Vitis HLS 2023.1 で DMA Read して値を 2 乗し、 AXI4-Stream 出力を行う test_square_axis IP を作成した。今回は、ネイティブ Ubuntu 18.04 のパソコンで、cocotbext-axi を試しているのだが、make を実行するとアサーションがエラーになってしまった。アサーションをコメントアウトすると PASS した。シミュレーション波形は問題ないので、アサーションの問題のようだ。

現在、cocotbext-axi は Ubuntu 18.04 のパソコンで試している。

cocotbext-axi/tests ディレクトリの下に、test_square_axis ディレクトリを作成し、前回、高位合成した Verilog HDL ファイルの test_square_axis.v, test_square_axis_control_s_axi.v, test_square_axis_gmem_m_axi.v, test_square_axis_mul_32s_32s_32_2_1.v, test_square_axis_regslice_both.v をコピーした。

cocotbext-axi の tests ディレクトリのファイルを参考にして、Makefile と test_square_axis.py を作成した。
cocotb_axi_49_230618.png

Makefile を示す。

# Makefile (for test_square_axis)
# 2023/06/14 by marsee

SIM ?= icarus

VERILOG_SOURCES += test_square_axis.v
VERILOG_SOURCES += test_square_axis_control_s_axi.v
VERILOG_SOURCES += test_square_axis_gmem_m_axi.v
VERILOG_SOURCES += test_square_axis_mul_32s_32s_32_2_1.v
VERILOG_SOURCES += test_square_axis_regslice_both.v

TOPLEVEL = test_square_axis
MODULE = test_square_axis

include $(shell cocotb-config --makefiles)/Makefile.sim


test_square_axis.py を示す。

# test_aquare_axi.py
# 2023/06/13 by marsee
# I created the software with reference to cocotbext-axi/tests/axil/test_axil.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axil/test_axil.py
# I created the software with reference to cocotbext-axi/tests/axi/test_axi.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axi/test_axi.py
# I created the software with reference to cocotbext-axi/tests/axis/test_axis.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axis/test_axis.py

import random
import cocotb
from cocotb.clock import Clock
from cocotb.triggers import Timer, RisingEdge

from cocotbext.axi import AxiLiteBus, AxiLiteMaster, AxiLiteRam
from cocotbext.axi import AxiBus, AxiMaster, AxiRam
from cocotbext.axi import AxiStreamFrame, AxiStreamBus, AxiStreamSource, AxiStreamSink, AxiStreamMonitor

AP_DONE = 0x2

class TEST:
    def __init__(self, dut):
        self.dut = dut
        cocotb.start_soon(Clock(dut.ap_clk, 10, units="ns").start())
        self.axi_ram = AxiRam(AxiBus.from_prefix(dut, "m_axi_gmem"), dut.ap_clk, size=2**16)
        self.axil_master = AxiLiteMaster(AxiLiteBus.from_prefix(dut, "s_axi_control"), dut.ap_clk)
        self.axis_sink = AxiStreamSink(AxiStreamBus.from_prefix(dut, "out_r"), dut.ap_clk)

@cocotb.test()
async def test_square_axis(dut):  
    test = TEST(dut)
    
    dut.ap_rst_n.value = 0; # Reset
    await Timer(30, units='ns')
    dut.ap_rst_n.value = 1; # Normal Operation
    await Timer(10, units='ns')
    
    for i in range(10):
        test.axi_ram.write(i*4, i.to_bytes(4,'little'))
    
    inv = 0
    await test.axil_master.write(0x18, inv.to_bytes(4,'little')) # in_r[31:0]
    
    ap_start = 1
    await test.axil_master.write(0x00, ap_start.to_bytes(4,'little')) # ap_start
    await test.axil_master.read(0x00, 1)
    #await Timer(100, units='ns')
    
    data = await test.axil_master.read(0x00, 1) # wait end
    data_int = int.from_bytes(data, 'little')
    while (data_int & AP_DONE) != AP_DONE:
        data = await test.axil_master.read(0x00, 1)
        data_int = int.from_bytes(data, 'little')

    axis_frame = await test.axis_sink.recv()
    tdata_ba = axis_frame.tdata
    tuser = axis_frame.tuser
    for i in range(10):
        tdata = int.from_bytes(tdata_ba[i*4:i*4+4], 'little')
        print('i = ', i, ' tdata = ', tdata,  ' tuser = ', tuser[i])
        assert tdata == i * i
    
    assert test.axis_sink.empty()


なお、test_square_axis.py は、タブを 4 個のスペースに変換してあるので、使用する場合は、スペースをタブに変換する。

トップの Verilog HDL ファイル(test_square_axi.v)の WSTRB と AXI4 インターフェースの場合の BRESP, RRESP のみ、大文字だとテスベンチに接続されないので、小文字に置換した。AXI4-Stream インターフェースの TDATA 以外の使用するサイドバンド信号を小文字に置換した。更に VCD ファイルを出力する文を追加した。
test_square_axis.v を示す。

// ==============================================================
// Generated by Vitis HLS v2023.1
// Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
// Copyright 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved.
// ==============================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="test_square_axis_test_square_axis,hls_ip_2023_1,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z020-clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=7.300000,HLS_SYN_LAT=23,HLS_SYN_TPT=none,HLS_SYN_MEM=4,HLS_SYN_DSP=0,HLS_SYN_FF=1381,HLS_SYN_LUT=1190,HLS_VERSION=2023_1}" *)

module test_square_axis (
        ap_clk,
        ap_rst_n,
        m_axi_gmem_AWVALID,
        m_axi_gmem_AWREADY,
        m_axi_gmem_AWADDR,
        m_axi_gmem_AWID,
        m_axi_gmem_AWLEN,
        m_axi_gmem_AWSIZE,
        m_axi_gmem_AWBURST,
        m_axi_gmem_AWLOCK,
        m_axi_gmem_AWCACHE,
        m_axi_gmem_AWPROT,
        m_axi_gmem_AWQOS,
        m_axi_gmem_AWREGION,
        m_axi_gmem_AWUSER,
        m_axi_gmem_WVALID,
        m_axi_gmem_WREADY,
        m_axi_gmem_WDATA,
        m_axi_gmem_wstrb,
        m_axi_gmem_WLAST,
        m_axi_gmem_WID,
        m_axi_gmem_WUSER,
        m_axi_gmem_ARVALID,
        m_axi_gmem_ARREADY,
        m_axi_gmem_ARADDR,
        m_axi_gmem_ARID,
        m_axi_gmem_ARLEN,
        m_axi_gmem_ARSIZE,
        m_axi_gmem_ARBURST,
        m_axi_gmem_ARLOCK,
        m_axi_gmem_ARCACHE,
        m_axi_gmem_ARPROT,
        m_axi_gmem_ARQOS,
        m_axi_gmem_ARREGION,
        m_axi_gmem_ARUSER,
        m_axi_gmem_RVALID,
        m_axi_gmem_RREADY,
        m_axi_gmem_RDATA,
        m_axi_gmem_RLAST,
        m_axi_gmem_RID,
        m_axi_gmem_RUSER,
        m_axi_gmem_rresp,
        m_axi_gmem_BVALID,
        m_axi_gmem_BREADY,
        m_axi_gmem_bresp,
        m_axi_gmem_BID,
        m_axi_gmem_BUSER,
        out_r_TDATA,
        out_r_tvalid,
        out_r_tready,
        out_r_TKEEP,
        out_r_TSTRB,
        out_r_tuser,
        out_r_tlast,
        out_r_TID,
        out_r_TDEST,
        s_axi_control_AWVALID,
        s_axi_control_AWREADY,
        s_axi_control_AWADDR,
        s_axi_control_WVALID,
        s_axi_control_WREADY,
        s_axi_control_WDATA,
        s_axi_control_wstrb,
        s_axi_control_ARVALID,
        s_axi_control_ARREADY,
        s_axi_control_ARADDR,
        s_axi_control_RVALID,
        s_axi_control_RREADY,
        s_axi_control_RDATA,
        s_axi_control_RRESP,
        s_axi_control_BVALID,
        s_axi_control_BREADY,
        s_axi_control_BRESP,
        interrupt
);

parameter    ap_ST_fsm_state1 = 3'd1;
parameter    ap_ST_fsm_pp0_stage0 = 3'd2;
parameter    ap_ST_fsm_state15 = 3'd4;
parameter    C_S_AXI_CONTROL_DATA_WIDTH = 32;
parameter    C_S_AXI_CONTROL_ADDR_WIDTH = 5;
parameter    C_S_AXI_DATA_WIDTH = 32;
parameter    C_M_AXI_GMEM_ID_WIDTH = 1;
parameter    C_M_AXI_GMEM_ADDR_WIDTH = 32;
parameter    C_M_AXI_GMEM_DATA_WIDTH = 32;
parameter    C_M_AXI_GMEM_AWUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_ARUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_WUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_RUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_BUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_USER_VALUE = 0;
parameter    C_M_AXI_GMEM_PROT_VALUE = 0;
parameter    C_M_AXI_GMEM_CACHE_VALUE = 3;
parameter    C_M_AXI_DATA_WIDTH = 32;

parameter C_S_AXI_CONTROL_WSTRB_WIDTH = (32 / 8);
parameter C_S_AXI_WSTRB_WIDTH = (32 / 8);
parameter C_M_AXI_GMEM_WSTRB_WIDTH = (32 / 8);
parameter C_M_AXI_WSTRB_WIDTH = (32 / 8);

input   ap_clk;
input   ap_rst_n;
output   m_axi_gmem_AWVALID;
input   m_axi_gmem_AWREADY;
output  [C_M_AXI_GMEM_ADDR_WIDTH - 1:0] m_axi_gmem_AWADDR;
output  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_AWID;
output  [7:0] m_axi_gmem_AWLEN;
output  [2:0] m_axi_gmem_AWSIZE;
output  [1:0] m_axi_gmem_AWBURST;
output  [1:0] m_axi_gmem_AWLOCK;
output  [3:0] m_axi_gmem_AWCACHE;
output  [2:0] m_axi_gmem_AWPROT;
output  [3:0] m_axi_gmem_AWQOS;
output  [3:0] m_axi_gmem_AWREGION;
output  [C_M_AXI_GMEM_AWUSER_WIDTH - 1:0] m_axi_gmem_AWUSER;
output   m_axi_gmem_WVALID;
input   m_axi_gmem_WREADY;
output  [C_M_AXI_GMEM_DATA_WIDTH - 1:0] m_axi_gmem_WDATA;
output  [C_M_AXI_GMEM_WSTRB_WIDTH - 1:0] m_axi_gmem_wstrb;
output   m_axi_gmem_WLAST;
output  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_WID;
output  [C_M_AXI_GMEM_WUSER_WIDTH - 1:0] m_axi_gmem_WUSER;
output   m_axi_gmem_ARVALID;
input   m_axi_gmem_ARREADY;
output  [C_M_AXI_GMEM_ADDR_WIDTH - 1:0] m_axi_gmem_ARADDR;
output  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_ARID;
output  [7:0] m_axi_gmem_ARLEN;
output  [2:0] m_axi_gmem_ARSIZE;
output  [1:0] m_axi_gmem_ARBURST;
output  [1:0] m_axi_gmem_ARLOCK;
output  [3:0] m_axi_gmem_ARCACHE;
output  [2:0] m_axi_gmem_ARPROT;
output  [3:0] m_axi_gmem_ARQOS;
output  [3:0] m_axi_gmem_ARREGION;
output  [C_M_AXI_GMEM_ARUSER_WIDTH - 1:0] m_axi_gmem_ARUSER;
input   m_axi_gmem_RVALID;
output   m_axi_gmem_RREADY;
input  [C_M_AXI_GMEM_DATA_WIDTH - 1:0] m_axi_gmem_RDATA;
input   m_axi_gmem_RLAST;
input  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_RID;
input  [C_M_AXI_GMEM_RUSER_WIDTH - 1:0] m_axi_gmem_RUSER;
input  [1:0] m_axi_gmem_rresp;
input   m_axi_gmem_BVALID;
output   m_axi_gmem_BREADY;
input  [1:0] m_axi_gmem_bresp;
input  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_BID;
input  [C_M_AXI_GMEM_BUSER_WIDTH - 1:0] m_axi_gmem_BUSER;
output  [31:0] out_r_TDATA;
output   out_r_tvalid;
input   out_r_tready;
output  [3:0] out_r_TKEEP;
output  [3:0] out_r_TSTRB;
output  [0:0] out_r_tuser;
output  [0:0] out_r_tlast;
output  [0:0] out_r_TID;
output  [0:0] out_r_TDEST;
input   s_axi_control_AWVALID;
output   s_axi_control_AWREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_AWADDR;
input   s_axi_control_WVALID;
output   s_axi_control_WREADY;
input  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_WDATA;
input  [C_S_AXI_CONTROL_WSTRB_WIDTH - 1:0] s_axi_control_wstrb;
input   s_axi_control_ARVALID;
output   s_axi_control_ARREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_ARADDR;
output   s_axi_control_RVALID;
input   s_axi_control_RREADY;
output  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_RDATA;
output  [1:0] s_axi_control_RRESP;
output   s_axi_control_BVALID;
input   s_axi_control_BREADY;
output  [1:0] s_axi_control_BRESP;
output   interrupt;

 reg    ap_rst_n_inv;
wire    ap_start;
reg    ap_done;
reg    ap_idle;
(* fsm_encoding = "none" *) reg   [2:0] ap_CS_fsm;
wire    ap_CS_fsm_state1;
reg    ap_ready;
wire   [31:0] in_r;
reg    gmem_blk_n_AR;
wire    ap_CS_fsm_pp0_stage0;
reg    ap_enable_reg_pp0_iter1;
wire    ap_block_pp0_stage0;
reg   [0:0] first_iter_0_reg_157;
reg    gmem_blk_n_R;
reg    ap_enable_reg_pp0_iter9;
reg   [0:0] icmp_ln15_reg_244;
reg   [0:0] icmp_ln15_reg_244_pp0_iter8_reg;
reg    out_r_TDATA_blk_n;
reg    ap_enable_reg_pp0_iter11;
reg   [0:0] icmp_ln15_reg_244_pp0_iter10_reg;
reg    ap_enable_reg_pp0_iter12;
reg   [0:0] icmp_ln15_reg_244_pp0_iter11_reg;
wire    ap_block_state2_pp0_stage0_iter0;
wire    gmem_AWREADY;
wire    gmem_WREADY;
reg    gmem_ARVALID;
wire    gmem_ARREADY;
wire    gmem_RVALID;
reg    gmem_RREADY;
wire   [31:0] gmem_RDATA;
wire   [8:0] gmem_RFIFONUM;
wire    gmem_BVALID;
wire    ap_block_state3_pp0_stage0_iter1;
reg    ap_block_state3_io;
wire    ap_block_state4_pp0_stage0_iter2;
wire    ap_block_state5_pp0_stage0_iter3;
wire    ap_block_state6_pp0_stage0_iter4;
wire    ap_block_state7_pp0_stage0_iter5;
wire    ap_block_state8_pp0_stage0_iter6;
wire    ap_block_state9_pp0_stage0_iter7;
wire    ap_block_state10_pp0_stage0_iter8;
reg    ap_block_state11_pp0_stage0_iter9;
wire    ap_block_state12_pp0_stage0_iter10;
reg    ap_block_state13_pp0_stage0_iter11;
reg    ap_block_state13_io;
reg    ap_block_state14_pp0_stage0_iter12;
reg    ap_block_state14_io;
reg    ap_block_pp0_stage0_11001;
reg   [31:0] in_r_read_reg_239;
wire   [0:0] icmp_ln15_fu_183_p2;
reg   [0:0] icmp_ln15_reg_244_pp0_iter1_reg;
reg   [0:0] icmp_ln15_reg_244_pp0_iter2_reg;
reg   [0:0] icmp_ln15_reg_244_pp0_iter3_reg;
reg   [0:0] icmp_ln15_reg_244_pp0_iter4_reg;
reg   [0:0] icmp_ln15_reg_244_pp0_iter5_reg;
reg   [0:0] icmp_ln15_reg_244_pp0_iter6_reg;
reg   [0:0] icmp_ln15_reg_244_pp0_iter7_reg;
reg   [0:0] icmp_ln15_reg_244_pp0_iter9_reg;
wire   [0:0] val_user_fu_195_p2;
reg   [0:0] val_user_reg_248;
reg   [0:0] val_user_reg_248_pp0_iter1_reg;
reg   [0:0] val_user_reg_248_pp0_iter2_reg;
reg   [0:0] val_user_reg_248_pp0_iter3_reg;
reg   [0:0] val_user_reg_248_pp0_iter4_reg;
reg   [0:0] val_user_reg_248_pp0_iter5_reg;
reg   [0:0] val_user_reg_248_pp0_iter6_reg;
reg   [0:0] val_user_reg_248_pp0_iter7_reg;
reg   [0:0] val_user_reg_248_pp0_iter8_reg;
reg   [0:0] val_user_reg_248_pp0_iter9_reg;
reg   [0:0] val_user_reg_248_pp0_iter10_reg;
wire   [0:0] val_last_fu_201_p2;
reg   [0:0] val_last_reg_253;
reg   [0:0] val_last_reg_253_pp0_iter1_reg;
reg   [0:0] val_last_reg_253_pp0_iter2_reg;
reg   [0:0] val_last_reg_253_pp0_iter3_reg;
reg   [0:0] val_last_reg_253_pp0_iter4_reg;
reg   [0:0] val_last_reg_253_pp0_iter5_reg;
reg   [0:0] val_last_reg_253_pp0_iter6_reg;
reg   [0:0] val_last_reg_253_pp0_iter7_reg;
reg   [0:0] val_last_reg_253_pp0_iter8_reg;
reg   [0:0] val_last_reg_253_pp0_iter9_reg;
reg   [0:0] val_last_reg_253_pp0_iter10_reg;
reg  signed [31:0] gmem_addr_read_reg_264;
wire   [31:0] grp_fu_170_p2;
reg    ap_enable_reg_pp0_iter0;
reg    ap_block_pp0_stage0_subdone;
reg    ap_condition_pp0_exit_iter0_state2;
reg    ap_enable_reg_pp0_iter2;
reg    ap_enable_reg_pp0_iter3;
reg    ap_enable_reg_pp0_iter4;
reg    ap_enable_reg_pp0_iter5;
reg    ap_enable_reg_pp0_iter6;
reg    ap_enable_reg_pp0_iter7;
reg    ap_enable_reg_pp0_iter8;
reg    ap_enable_reg_pp0_iter10;
wire   [31:0] sext_ln15_fu_221_p1;
reg   [3:0] i_fu_106;
wire   [3:0] add_ln15_fu_189_p2;
reg    ap_block_pp0_stage0_01001;
wire   [29:0] trunc_ln_fu_212_p4;
reg    grp_fu_170_ce;
wire    ap_CS_fsm_state15;
wire    regslice_both_out_r_V_data_V_U_apdone_blk;
reg   [2:0] ap_NS_fsm;
reg    ap_ST_fsm_state1_blk;
reg    ap_ST_fsm_state15_blk;
reg    ap_idle_pp0;
wire    ap_enable_pp0;
reg    out_r_TVALID_int_regslice;
wire    out_r_TREADY_int_regslice;
wire    regslice_both_out_r_V_data_V_U_vld_out;
wire    regslice_both_out_r_V_keep_V_U_apdone_blk;
wire    regslice_both_out_r_V_keep_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_keep_V_U_vld_out;
wire    regslice_both_out_r_V_strb_V_U_apdone_blk;
wire    regslice_both_out_r_V_strb_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_strb_V_U_vld_out;
wire    regslice_both_out_r_V_user_V_U_apdone_blk;
wire    regslice_both_out_r_V_user_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_user_V_U_vld_out;
wire    regslice_both_out_r_V_last_V_U_apdone_blk;
wire    regslice_both_out_r_V_last_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_last_V_U_vld_out;
wire    regslice_both_out_r_V_id_V_U_apdone_blk;
wire    regslice_both_out_r_V_id_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_id_V_U_vld_out;
wire    regslice_both_out_r_V_dest_V_U_apdone_blk;
wire    regslice_both_out_r_V_dest_V_U_ack_in_dummy;
wire    regslice_both_out_r_V_dest_V_U_vld_out;
wire    ap_ce_reg;
wire   [31:0] ap_return;

// power-on initialization
initial begin
#0 ap_CS_fsm = 3'd1;
#0 ap_enable_reg_pp0_iter1 = 1'b0;
#0 ap_enable_reg_pp0_iter9 = 1'b0;
#0 ap_enable_reg_pp0_iter11 = 1'b0;
#0 ap_enable_reg_pp0_iter12 = 1'b0;
#0 ap_enable_reg_pp0_iter0 = 1'b0;
#0 ap_enable_reg_pp0_iter2 = 1'b0;
#0 ap_enable_reg_pp0_iter3 = 1'b0;
#0 ap_enable_reg_pp0_iter4 = 1'b0;
#0 ap_enable_reg_pp0_iter5 = 1'b0;
#0 ap_enable_reg_pp0_iter6 = 1'b0;
#0 ap_enable_reg_pp0_iter7 = 1'b0;
#0 ap_enable_reg_pp0_iter8 = 1'b0;
#0 ap_enable_reg_pp0_iter10 = 1'b0;
end

test_square_axis_control_s_axi #(
    .C_S_AXI_ADDR_WIDTH( C_S_AXI_CONTROL_ADDR_WIDTH ),
    .C_S_AXI_DATA_WIDTH( C_S_AXI_CONTROL_DATA_WIDTH ))
control_s_axi_U(
    .AWVALID(s_axi_control_AWVALID),
    .AWREADY(s_axi_control_AWREADY),
    .AWADDR(s_axi_control_AWADDR),
    .WVALID(s_axi_control_WVALID),
    .WREADY(s_axi_control_WREADY),
    .WDATA(s_axi_control_WDATA),
    .WSTRB(s_axi_control_wstrb),
    .ARVALID(s_axi_control_ARVALID),
    .ARREADY(s_axi_control_ARREADY),
    .ARADDR(s_axi_control_ARADDR),
    .RVALID(s_axi_control_RVALID),
    .RREADY(s_axi_control_RREADY),
    .RDATA(s_axi_control_RDATA),
    .RRESP(s_axi_control_RRESP),
    .BVALID(s_axi_control_BVALID),
    .BREADY(s_axi_control_BREADY),
    .BRESP(s_axi_control_BRESP),
    .ACLK(ap_clk),
    .ARESET(ap_rst_n_inv),
    .ACLK_EN(1'b1),
    .ap_start(ap_start),
    .interrupt(interrupt),
    .ap_ready(ap_ready),
    .ap_done(ap_done),
    .ap_idle(ap_idle),
    .ap_return(32'd0),
    .in_r(in_r)
);

test_square_axis_gmem_m_axi #(
    .CONSERVATIVE( 1 ),
    .USER_MAXREQS( 5 ),
    .MAX_READ_BURST_LENGTH( 16 ),
    .MAX_WRITE_BURST_LENGTH( 16 ),
    .C_M_AXI_ID_WIDTH( C_M_AXI_GMEM_ID_WIDTH ),
    .C_M_AXI_ADDR_WIDTH( C_M_AXI_GMEM_ADDR_WIDTH ),
    .C_M_AXI_DATA_WIDTH( C_M_AXI_GMEM_DATA_WIDTH ),
    .C_M_AXI_AWUSER_WIDTH( C_M_AXI_GMEM_AWUSER_WIDTH ),
    .C_M_AXI_ARUSER_WIDTH( C_M_AXI_GMEM_ARUSER_WIDTH ),
    .C_M_AXI_WUSER_WIDTH( C_M_AXI_GMEM_WUSER_WIDTH ),
    .C_M_AXI_RUSER_WIDTH( C_M_AXI_GMEM_RUSER_WIDTH ),
    .C_M_AXI_BUSER_WIDTH( C_M_AXI_GMEM_BUSER_WIDTH ),
    .C_USER_VALUE( C_M_AXI_GMEM_USER_VALUE ),
    .C_PROT_VALUE( C_M_AXI_GMEM_PROT_VALUE ),
    .C_CACHE_VALUE( C_M_AXI_GMEM_CACHE_VALUE ),
    .USER_RFIFONUM_WIDTH( 9 ),
    .USER_DW( 32 ),
    .USER_AW( 32 ),
    .NUM_READ_OUTSTANDING( 16 ),
    .NUM_WRITE_OUTSTANDING( 16 ))
gmem_m_axi_U(
    .AWVALID(m_axi_gmem_AWVALID),
    .AWREADY(m_axi_gmem_AWREADY),
    .AWADDR(m_axi_gmem_AWADDR),
    .AWID(m_axi_gmem_AWID),
    .AWLEN(m_axi_gmem_AWLEN),
    .AWSIZE(m_axi_gmem_AWSIZE),
    .AWBURST(m_axi_gmem_AWBURST),
    .AWLOCK(m_axi_gmem_AWLOCK),
    .AWCACHE(m_axi_gmem_AWCACHE),
    .AWPROT(m_axi_gmem_AWPROT),
    .AWQOS(m_axi_gmem_AWQOS),
    .AWREGION(m_axi_gmem_AWREGION),
    .AWUSER(m_axi_gmem_AWUSER),
    .WVALID(m_axi_gmem_WVALID),
    .WREADY(m_axi_gmem_WREADY),
    .WDATA(m_axi_gmem_WDATA),
    .WSTRB(m_axi_gmem_wstrb),
    .WLAST(m_axi_gmem_WLAST),
    .WID(m_axi_gmem_WID),
    .WUSER(m_axi_gmem_WUSER),
    .ARVALID(m_axi_gmem_ARVALID),
    .ARREADY(m_axi_gmem_ARREADY),
    .ARADDR(m_axi_gmem_ARADDR),
    .ARID(m_axi_gmem_ARID),
    .ARLEN(m_axi_gmem_ARLEN),
    .ARSIZE(m_axi_gmem_ARSIZE),
    .ARBURST(m_axi_gmem_ARBURST),
    .ARLOCK(m_axi_gmem_ARLOCK),
    .ARCACHE(m_axi_gmem_ARCACHE),
    .ARPROT(m_axi_gmem_ARPROT),
    .ARQOS(m_axi_gmem_ARQOS),
    .ARREGION(m_axi_gmem_ARREGION),
    .ARUSER(m_axi_gmem_ARUSER),
    .RVALID(m_axi_gmem_RVALID),
    .RREADY(m_axi_gmem_RREADY),
    .RDATA(m_axi_gmem_RDATA),
    .RLAST(m_axi_gmem_RLAST),
    .RID(m_axi_gmem_RID),
    .RUSER(m_axi_gmem_RUSER),
    .RRESP(m_axi_gmem_rresp),
    .BVALID(m_axi_gmem_BVALID),
    .BREADY(m_axi_gmem_BREADY),
    .BRESP(m_axi_gmem_bresp),
    .BID(m_axi_gmem_BID),
    .BUSER(m_axi_gmem_BUSER),
    .ACLK(ap_clk),
    .ARESET(ap_rst_n_inv),
    .ACLK_EN(1'b1),
    .I_ARVALID(gmem_ARVALID),
    .I_ARREADY(gmem_ARREADY),
    .I_ARADDR(sext_ln15_fu_221_p1),
    .I_ARLEN(32'd10),
    .I_RVALID(gmem_RVALID),
    .I_RREADY(gmem_RREADY),
    .I_RDATA(gmem_RDATA),
    .I_RFIFONUM(gmem_RFIFONUM),
    .I_AWVALID(1'b0),
    .I_AWREADY(gmem_AWREADY),
    .I_AWADDR(32'd0),
    .I_AWLEN(32'd0),
    .I_WVALID(1'b0),
    .I_WREADY(gmem_WREADY),
    .I_WDATA(32'd0),
    .I_WSTRB(4'd0),
    .I_BVALID(gmem_BVALID),
    .I_BREADY(1'b0)
);

test_square_axis_mul_32s_32s_32_2_1 #(
    .ID( 1 ),
    .NUM_STAGE( 2 ),
    .din0_WIDTH( 32 ),
    .din1_WIDTH( 32 ),
    .dout_WIDTH( 32 ))
mul_32s_32s_32_2_1_U1(
    .clk(ap_clk),
    .reset(ap_rst_n_inv),
    .din0(gmem_addr_read_reg_264),
    .din1(gmem_addr_read_reg_264),
    .ce(grp_fu_170_ce),
    .dout(grp_fu_170_p2)
);

test_square_axis_regslice_both #(
    .DataWidth( 32 ))
regslice_both_out_r_V_data_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(grp_fu_170_p2),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(out_r_TREADY_int_regslice),
    .data_out(out_r_TDATA),
    .vld_out(regslice_both_out_r_V_data_V_U_vld_out),
    .ack_out(out_r_tready),
    .apdone_blk(regslice_both_out_r_V_data_V_U_apdone_blk)
);

test_square_axis_regslice_both #(
    .DataWidth( 4 ))
regslice_both_out_r_V_keep_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(4'd0),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_keep_V_U_ack_in_dummy),
    .data_out(out_r_TKEEP),
    .vld_out(regslice_both_out_r_V_keep_V_U_vld_out),
    .ack_out(out_r_tready),
    .apdone_blk(regslice_both_out_r_V_keep_V_U_apdone_blk)
);

test_square_axis_regslice_both #(
    .DataWidth( 4 ))
regslice_both_out_r_V_strb_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(4'd0),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_strb_V_U_ack_in_dummy),
    .data_out(out_r_TSTRB),
    .vld_out(regslice_both_out_r_V_strb_V_U_vld_out),
    .ack_out(out_r_tready),
    .apdone_blk(regslice_both_out_r_V_strb_V_U_apdone_blk)
);

test_square_axis_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_user_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_user_reg_248_pp0_iter10_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_user_V_U_ack_in_dummy),
    .data_out(out_r_tuser),
    .vld_out(regslice_both_out_r_V_user_V_U_vld_out),
    .ack_out(out_r_tready),
    .apdone_blk(regslice_both_out_r_V_user_V_U_apdone_blk)
);

test_square_axis_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_last_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(val_last_reg_253_pp0_iter10_reg),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_last_V_U_ack_in_dummy),
    .data_out(out_r_tlast),
    .vld_out(regslice_both_out_r_V_last_V_U_vld_out),
    .ack_out(out_r_tready),
    .apdone_blk(regslice_both_out_r_V_last_V_U_apdone_blk)
);

test_square_axis_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_id_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(1'd0),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_id_V_U_ack_in_dummy),
    .data_out(out_r_TID),
    .vld_out(regslice_both_out_r_V_id_V_U_vld_out),
    .ack_out(out_r_tready),
    .apdone_blk(regslice_both_out_r_V_id_V_U_apdone_blk)
);

test_square_axis_regslice_both #(
    .DataWidth( 1 ))
regslice_both_out_r_V_dest_V_U(
    .ap_clk(ap_clk),
    .ap_rst(ap_rst_n_inv),
    .data_in(1'd0),
    .vld_in(out_r_TVALID_int_regslice),
    .ack_in(regslice_both_out_r_V_dest_V_U_ack_in_dummy),
    .data_out(out_r_TDEST),
    .vld_out(regslice_both_out_r_V_dest_V_U_vld_out),
    .ack_out(out_r_tready),
    .apdone_blk(regslice_both_out_r_V_dest_V_U_apdone_blk)
);

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_CS_fsm <= ap_ST_fsm_state1;
    end else begin
        ap_CS_fsm <= ap_NS_fsm;
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter0 <= 1'b0;
    end else begin
        if (((1'b0 == ap_block_pp0_stage0_subdone) & (1'b1 == ap_CS_fsm_pp0_stage0) & (1'b1 == ap_condition_pp0_exit_iter0_state2))) begin
            ap_enable_reg_pp0_iter0 <= 1'b0;
        end else if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
            ap_enable_reg_pp0_iter0 <= 1'b1;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter1 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            if ((1'b1 == ap_condition_pp0_exit_iter0_state2)) begin
                ap_enable_reg_pp0_iter1 <= (1'b1 ^ ap_condition_pp0_exit_iter0_state2);
            end else if ((1'b1 == 1'b1)) begin
                ap_enable_reg_pp0_iter1 <= ap_enable_reg_pp0_iter0;
            end
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter10 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter10 <= ap_enable_reg_pp0_iter9;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter11 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter11 <= ap_enable_reg_pp0_iter10;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter12 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter12 <= ap_enable_reg_pp0_iter11;
        end else if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
            ap_enable_reg_pp0_iter12 <= 1'b0;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter2 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter2 <= ap_enable_reg_pp0_iter1;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter3 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter3 <= ap_enable_reg_pp0_iter2;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter4 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter4 <= ap_enable_reg_pp0_iter3;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter5 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter5 <= ap_enable_reg_pp0_iter4;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter6 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter6 <= ap_enable_reg_pp0_iter5;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter7 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter7 <= ap_enable_reg_pp0_iter6;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter8 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter8 <= ap_enable_reg_pp0_iter7;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter9 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter9 <= ap_enable_reg_pp0_iter8;
        end
    end
end

always @ (posedge ap_clk) begin
    if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
        first_iter_0_reg_157 <= 1'd1;
    end else if (((1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0) & (icmp_ln15_reg_244 == 1'd0))) begin
        first_iter_0_reg_157 <= 1'd0;
    end
end

always @ (posedge ap_clk) begin
    if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
        i_fu_106 <= 4'd0;
    end else if (((1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter0 == 1'b1) & (icmp_ln15_fu_183_p2 == 1'd0) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        i_fu_106 <= add_ln15_fu_189_p2;
    end
end

always @ (posedge ap_clk) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln15_reg_244_pp0_iter8_reg == 1'd0))) begin
        gmem_addr_read_reg_264 <= gmem_RDATA;
    end
end

always @ (posedge ap_clk) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        icmp_ln15_reg_244 <= icmp_ln15_fu_183_p2;
        icmp_ln15_reg_244_pp0_iter1_reg <= icmp_ln15_reg_244;
        val_last_reg_253_pp0_iter1_reg <= val_last_reg_253;
        val_user_reg_248_pp0_iter1_reg <= val_user_reg_248;
    end
end

always @ (posedge ap_clk) begin
    if ((1'b0 == ap_block_pp0_stage0_11001)) begin
        icmp_ln15_reg_244_pp0_iter10_reg <= icmp_ln15_reg_244_pp0_iter9_reg;
        icmp_ln15_reg_244_pp0_iter11_reg <= icmp_ln15_reg_244_pp0_iter10_reg;
        icmp_ln15_reg_244_pp0_iter2_reg <= icmp_ln15_reg_244_pp0_iter1_reg;
        icmp_ln15_reg_244_pp0_iter3_reg <= icmp_ln15_reg_244_pp0_iter2_reg;
        icmp_ln15_reg_244_pp0_iter4_reg <= icmp_ln15_reg_244_pp0_iter3_reg;
        icmp_ln15_reg_244_pp0_iter5_reg <= icmp_ln15_reg_244_pp0_iter4_reg;
        icmp_ln15_reg_244_pp0_iter6_reg <= icmp_ln15_reg_244_pp0_iter5_reg;
        icmp_ln15_reg_244_pp0_iter7_reg <= icmp_ln15_reg_244_pp0_iter6_reg;
        icmp_ln15_reg_244_pp0_iter8_reg <= icmp_ln15_reg_244_pp0_iter7_reg;
        icmp_ln15_reg_244_pp0_iter9_reg <= icmp_ln15_reg_244_pp0_iter8_reg;
        val_last_reg_253_pp0_iter10_reg <= val_last_reg_253_pp0_iter9_reg;
        val_last_reg_253_pp0_iter2_reg <= val_last_reg_253_pp0_iter1_reg;
        val_last_reg_253_pp0_iter3_reg <= val_last_reg_253_pp0_iter2_reg;
        val_last_reg_253_pp0_iter4_reg <= val_last_reg_253_pp0_iter3_reg;
        val_last_reg_253_pp0_iter5_reg <= val_last_reg_253_pp0_iter4_reg;
        val_last_reg_253_pp0_iter6_reg <= val_last_reg_253_pp0_iter5_reg;
        val_last_reg_253_pp0_iter7_reg <= val_last_reg_253_pp0_iter6_reg;
        val_last_reg_253_pp0_iter8_reg <= val_last_reg_253_pp0_iter7_reg;
        val_last_reg_253_pp0_iter9_reg <= val_last_reg_253_pp0_iter8_reg;
        val_user_reg_248_pp0_iter10_reg <= val_user_reg_248_pp0_iter9_reg;
        val_user_reg_248_pp0_iter2_reg <= val_user_reg_248_pp0_iter1_reg;
        val_user_reg_248_pp0_iter3_reg <= val_user_reg_248_pp0_iter2_reg;
        val_user_reg_248_pp0_iter4_reg <= val_user_reg_248_pp0_iter3_reg;
        val_user_reg_248_pp0_iter5_reg <= val_user_reg_248_pp0_iter4_reg;
        val_user_reg_248_pp0_iter6_reg <= val_user_reg_248_pp0_iter5_reg;
        val_user_reg_248_pp0_iter7_reg <= val_user_reg_248_pp0_iter6_reg;
        val_user_reg_248_pp0_iter8_reg <= val_user_reg_248_pp0_iter7_reg;
        val_user_reg_248_pp0_iter9_reg <= val_user_reg_248_pp0_iter8_reg;
    end
end

always @ (posedge ap_clk) begin
    if ((1'b1 == ap_CS_fsm_state1)) begin
        in_r_read_reg_239 <= in_r;
    end
end

always @ (posedge ap_clk) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln15_fu_183_p2 == 1'd0) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        val_last_reg_253 <= val_last_fu_201_p2;
        val_user_reg_248 <= val_user_fu_195_p2;
    end
end

always @ (*) begin
    if ((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b1)) begin
        ap_ST_fsm_state15_blk = 1'b1;
    end else begin
        ap_ST_fsm_state15_blk = 1'b0;
    end
end

always @ (*) begin
    if ((ap_start == 1'b0)) begin
        ap_ST_fsm_state1_blk = 1'b1;
    end else begin
        ap_ST_fsm_state1_blk = 1'b0;
    end
end

always @ (*) begin
    if ((icmp_ln15_fu_183_p2 == 1'd1)) begin
        ap_condition_pp0_exit_iter0_state2 = 1'b1;
    end else begin
        ap_condition_pp0_exit_iter0_state2 = 1'b0;
    end
end

always @ (*) begin
    if (((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b0) & (1'b1 == ap_CS_fsm_state15))) begin
        ap_done = 1'b1;
    end else begin
        ap_done = 1'b0;
    end
end

always @ (*) begin
    if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b0))) begin
        ap_idle = 1'b1;
    end else begin
        ap_idle = 1'b0;
    end
end

always @ (*) begin
    if (((ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter10 == 1'b0) & (ap_enable_reg_pp0_iter8 == 1'b0) & (ap_enable_reg_pp0_iter7 == 1'b0) & (ap_enable_reg_pp0_iter6 == 1'b0) & (ap_enable_reg_pp0_iter5 == 1'b0) & (ap_enable_reg_pp0_iter4 == 1'b0) & (ap_enable_reg_pp0_iter3 == 1'b0) & (ap_enable_reg_pp0_iter2 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b0) & (ap_enable_reg_pp0_iter12 == 1'b0) & (ap_enable_reg_pp0_iter11 == 1'b0) & (ap_enable_reg_pp0_iter9 == 1'b0))) begin
        ap_idle_pp0 = 1'b1;
    end else begin
        ap_idle_pp0 = 1'b0;
    end
end

always @ (*) begin
    if (((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b0) & (1'b1 == ap_CS_fsm_state15))) begin
        ap_ready = 1'b1;
    end else begin
        ap_ready = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0) & (first_iter_0_reg_157 == 1'd1))) begin
        gmem_ARVALID = 1'b1;
    end else begin
        gmem_ARVALID = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln15_reg_244_pp0_iter8_reg == 1'd0) & (ap_enable_reg_pp0_iter9 == 1'b1))) begin
        gmem_RREADY = 1'b1;
    end else begin
        gmem_RREADY = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0) & (ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0) & (first_iter_0_reg_157 == 1'd1))) begin
        gmem_blk_n_AR = m_axi_gmem_ARREADY;
    end else begin
        gmem_blk_n_AR = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0) & (icmp_ln15_reg_244_pp0_iter8_reg == 1'd0) & (ap_enable_reg_pp0_iter9 == 1'b1))) begin
        gmem_blk_n_R = m_axi_gmem_RVALID;
    end else begin
        gmem_blk_n_R = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        grp_fu_170_ce = 1'b1;
    end else begin
        grp_fu_170_ce = 1'b0;
    end
end

always @ (*) begin
    if ((((1'b0 == ap_block_pp0_stage0) & (icmp_ln15_reg_244_pp0_iter11_reg == 1'd0) & (ap_enable_reg_pp0_iter12 == 1'b1)) | ((1'b0 == ap_block_pp0_stage0) & (icmp_ln15_reg_244_pp0_iter10_reg == 1'd0) & (ap_enable_reg_pp0_iter11 == 1'b1)))) begin
        out_r_TDATA_blk_n = out_r_TREADY_int_regslice;
    end else begin
        out_r_TDATA_blk_n = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln15_reg_244_pp0_iter10_reg == 1'd0) & (ap_enable_reg_pp0_iter11 == 1'b1))) begin
        out_r_TVALID_int_regslice = 1'b1;
    end else begin
        out_r_TVALID_int_regslice = 1'b0;
    end
end

always @ (*) begin
    case (ap_CS_fsm)
        ap_ST_fsm_state1 : begin
            if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
                ap_NS_fsm = ap_ST_fsm_pp0_stage0;
            end else begin
                ap_NS_fsm = ap_ST_fsm_state1;
            end
        end
        ap_ST_fsm_pp0_stage0 : begin
            if ((~((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b1) & (icmp_ln15_fu_183_p2 == 1'd1)) & ~((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter12 == 1'b1) & (ap_enable_reg_pp0_iter11 == 1'b0)))) begin
                ap_NS_fsm = ap_ST_fsm_pp0_stage0;
            end else if ((((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b1) & (icmp_ln15_fu_183_p2 == 1'd1)) | ((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter12 == 1'b1) & (ap_enable_reg_pp0_iter11 == 1'b0)))) begin
                ap_NS_fsm = ap_ST_fsm_state15;
            end else begin
                ap_NS_fsm = ap_ST_fsm_pp0_stage0;
            end
        end
        ap_ST_fsm_state15 : begin
            if (((regslice_both_out_r_V_data_V_U_apdone_blk == 1'b0) & (1'b1 == ap_CS_fsm_state15))) begin
                ap_NS_fsm = ap_ST_fsm_state1;
            end else begin
                ap_NS_fsm = ap_ST_fsm_state15;
            end
        end
        default : begin
            ap_NS_fsm = 'bx;
        end
    endcase
end

assign add_ln15_fu_189_p2 = (i_fu_106 + 4'd1);

assign ap_CS_fsm_pp0_stage0 = ap_CS_fsm[32'd1];

assign ap_CS_fsm_state1 = ap_CS_fsm[32'd0];

assign ap_CS_fsm_state15 = ap_CS_fsm[32'd2];

assign ap_block_pp0_stage0 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_pp0_stage0_01001 = (((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter11_reg == 1'd0) & (ap_enable_reg_pp0_iter12 == 1'b1)) | ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter10_reg == 1'd0) & (ap_enable_reg_pp0_iter11 == 1'b1)) | ((gmem_RVALID == 1'b0) & (icmp_ln15_reg_244_pp0_iter8_reg == 1'd0) & (ap_enable_reg_pp0_iter9 == 1'b1)));
end

always @ (*) begin
    ap_block_pp0_stage0_11001 = (((ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_block_state3_io)) | ((gmem_RVALID == 1'b0) & (icmp_ln15_reg_244_pp0_iter8_reg == 1'd0) & (ap_enable_reg_pp0_iter9 == 1'b1)) | ((ap_enable_reg_pp0_iter12 == 1'b1) & ((1'b1 == ap_block_state14_io) | ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter11_reg == 1'd0)))) | ((ap_enable_reg_pp0_iter11 == 1'b1) & ((1'b1 == ap_block_state13_io) | ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter10_reg == 1'd0)))));
end

always @ (*) begin
    ap_block_pp0_stage0_subdone = (((ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_block_state3_io)) | ((gmem_RVALID == 1'b0) & (icmp_ln15_reg_244_pp0_iter8_reg == 1'd0) & (ap_enable_reg_pp0_iter9 == 1'b1)) | ((ap_enable_reg_pp0_iter12 == 1'b1) & ((1'b1 == ap_block_state14_io) | ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter11_reg == 1'd0)))) | ((ap_enable_reg_pp0_iter11 == 1'b1) & ((1'b1 == ap_block_state13_io) | ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter10_reg == 1'd0)))));
end

assign ap_block_state10_pp0_stage0_iter8 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_state11_pp0_stage0_iter9 = ((gmem_RVALID == 1'b0) & (icmp_ln15_reg_244_pp0_iter8_reg == 1'd0));
end

assign ap_block_state12_pp0_stage0_iter10 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_state13_io = ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter10_reg == 1'd0));
end

always @ (*) begin
    ap_block_state13_pp0_stage0_iter11 = ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter10_reg == 1'd0));
end

always @ (*) begin
    ap_block_state14_io = ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter11_reg == 1'd0));
end

always @ (*) begin
    ap_block_state14_pp0_stage0_iter12 = ((out_r_TREADY_int_regslice == 1'b0) & (icmp_ln15_reg_244_pp0_iter11_reg == 1'd0));
end

assign ap_block_state2_pp0_stage0_iter0 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_state3_io = ((gmem_ARREADY == 1'b0) & (first_iter_0_reg_157 == 1'd1));
end

assign ap_block_state3_pp0_stage0_iter1 = ~(1'b1 == 1'b1);

assign ap_block_state4_pp0_stage0_iter2 = ~(1'b1 == 1'b1);

assign ap_block_state5_pp0_stage0_iter3 = ~(1'b1 == 1'b1);

assign ap_block_state6_pp0_stage0_iter4 = ~(1'b1 == 1'b1);

assign ap_block_state7_pp0_stage0_iter5 = ~(1'b1 == 1'b1);

assign ap_block_state8_pp0_stage0_iter6 = ~(1'b1 == 1'b1);

assign ap_block_state9_pp0_stage0_iter7 = ~(1'b1 == 1'b1);

assign ap_enable_pp0 = (ap_idle_pp0 ^ 1'b1);

always @ (*) begin
    ap_rst_n_inv = ~ap_rst_n;
end

assign icmp_ln15_fu_183_p2 = ((i_fu_106 == 4'd10) ? 1'b1 : 1'b0);

assign out_r_tvalid = regslice_both_out_r_V_data_V_U_vld_out;

assign sext_ln15_fu_221_p1 = $signed(trunc_ln_fu_212_p4);

assign trunc_ln_fu_212_p4 = {{in_r_read_reg_239[31:2]}};

assign val_last_fu_201_p2 = ((i_fu_106 == 4'd9) ? 1'b1 : 1'b0);

assign val_user_fu_195_p2 = ((i_fu_106 == 4'd0) ? 1'b1 : 1'b0);

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_square_axis.vcd");
  $dumpvars (0, test_square_axis);
  #1;
end
`endif

endmodule //test_square_axis


cocotbext-axi/tests/test_square_axis ディレクトリに行って、make を実行した。Fail した。
Verilog HDL シミュレータは Icarus Verilog を使用した。
make
cocotb_axi_54_230618.png

”AssertionError: assert 151257344 == (0 * 0)”だった。

test_square_axis.py の 61 行目の”assert tdata == i * i”をコメントアウトして、make を再実行した。
make
cocotb_axi_50_230618.png

tdata の値が滅茶苦茶だ。

i =  0  tdata =  151257344  tuser =  1
i =  1  tdata =  824449296  tuser =  0
i =  2  tdata =  20800  tuser =  0
i =  3  tdata =  0  tuser =  0
i =  4  tdata =  0  tuser =  0
i =  5  tdata =  0  tuser =  0
i =  6  tdata =  0  tuser =  0
i =  7  tdata =  0  tuser =  0
i =  8  tdata =  0  tuser =  0
i =  9  tdata =  0  tuser =  0


gtkwave で test_square_axis.vcd を開く。
test_square_axis の信号を追加して、AXI4 Lite インターフェースの信号を並べ替えた。
gtkwave test_square_axis.vcd
cocotb_axi_51_230618.png

AXI4 Master の信号を示す。
10 バーストでデータを読み込んでいる。
cocotb_axi_52_230618.png

AXI4-Stream の信号を示す。
TDATA に 2 乗されたデータが 10 バーストで出力されている。
cocotb_axi_53_230618.png

test_square_axis.py の 61 行目をコメントアウトした時の make の時のログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis' に入ります
rm -f results.xml
MODULE=test_square_axis TESTCASE= TOPLEVEL=test_square_axis TOPLEVEL_LANG=verilog \
         /usr/bin/vvp -M /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb/libs -m libcocotbvpi_icarus   sim_build/sim.vvp 
     -.--ns INFO     gpi                                ..mbed/gpi_embed.cpp:76   in set_program_name_in_venv        Did not detect Python virtual environment. Using system-wide Python interpreter
     -.--ns INFO     gpi                                ../gpi/GpiCommon.cpp:101  in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb                             Running on Icarus Verilog version 10.1 (stable)
     0.00ns INFO     cocotb                             Running tests with cocotb v1.7.0 from /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb
     0.00ns INFO     cocotb                             Seeding Python random module with 1687115958
     0.00ns INFO     cocotb.regression                  Found test test_square_axis.test_square_axil
     0.00ns INFO     cocotb.regression                  running test_square_axil (1/1)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model (write)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Copyright (c) 2021 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model configuration:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Address width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   ID width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model signals:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awaddr width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awburst width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awcache: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awlen width: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awlock: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awprot: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awqos: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awregion: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awsize width: 3 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awuser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   awvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wstrb width: 4 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wuser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   wvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bresp width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   buser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   bvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model (read)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Copyright (c) 2021 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model configuration:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Address width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   ID width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem AXI slave model signals:
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   araddr width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arburst width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arcache: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arlen width: 8 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arlock: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arprot: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arqos: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arregion: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arsize width: 3 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   aruser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   arvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rresp width: 2 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   ruser: not present
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem   rvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.m_axi_gmem Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master (write)
     0.00ns INFO     ..b.test_square_axis.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..b.test_square_axis.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..b.test_square_axis.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Address width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master signals:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awaddr width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awprot: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   bready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   bresp: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master (read)
     0.00ns INFO     ..b.test_square_axis.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..b.test_square_axis.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..b.test_square_axis.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Address width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..b.test_square_axis.s_axi_control AXI lite master signals:
     0.00ns INFO     ..b.test_square_axis.s_axi_control   araddr width: 5 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   arprot: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   arready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rready width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rresp: not present
     0.00ns INFO     ..b.test_square_axis.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axis.s_axi_control Reset de-asserted
     0.00ns INFO     cocotb.test_square_axis.out_r      AXI stream sink
     0.00ns INFO     cocotb.test_square_axis.out_r      cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axis.out_r      Copyright (c) 2020 Alex Forencich
     0.00ns INFO     cocotb.test_square_axis.out_r      https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axis.out_r      AXI stream sink configuration:
     0.00ns INFO     cocotb.test_square_axis.out_r        Byte size: 32 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        Data width: 32 bits (1 bytes)
     0.00ns INFO     cocotb.test_square_axis.out_r      AXI stream sink signals:
     0.00ns INFO     cocotb.test_square_axis.out_r        tdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tdest: not present
     0.00ns INFO     cocotb.test_square_axis.out_r        tid: not present
     0.00ns INFO     cocotb.test_square_axis.out_r        tkeep: not present
     0.00ns INFO     cocotb.test_square_axis.out_r        tlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tready width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tuser width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r        tvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axis.out_r      Reset de-asserted
VCD info: dumpfile test_square_axis.vcd opened for output.
    40.00ns INFO     ..b.test_square_axis.s_axi_control Write start addr: 0x00000018 prot: AxiProt.NONSECURE data: 00 00 00 00
    70.00ns INFO     ..b.test_square_axis.s_axi_control Write complete addr: 0x00000018 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
    70.00ns INFO     ..b.test_square_axis.s_axi_control Write start addr: 0x00000000 prot: AxiProt.NONSECURE data: 01 00 00 00
   110.00ns INFO     ..b.test_square_axis.s_axi_control Write complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
   110.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   140.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   140.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   170.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   170.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   200.00ns INFO     cocotb.test_square_axis.m_axi_gmem Read burst arid: 0x0 araddr: 0x00000000 arlen: 9 arsize: 2 arprot: AxiProt.0
   200.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   200.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   230.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   230.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   260.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   260.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   290.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   290.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   320.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   320.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   350.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   350.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   370.00ns INFO     cocotb.test_square_axis.out_r      RX frame: AxiStreamFrame(tdata=[0, 1, 4, 9, 16, 25, 36, 49, 64, 81], tkeep=[], tid=[], tdest=[], tuser=[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], sim_time_start=280000, sim_time_end=370000)
   380.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   380.00ns INFO     ..b.test_square_axis.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   410.00ns INFO     ..b.test_square_axis.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 0e
i =  0  tdata =  151257344  tuser =  1
i =  1  tdata =  824449296  tuser =  0
i =  2  tdata =  20800  tuser =  0
i =  3  tdata =  0  tuser =  0
i =  4  tdata =  0  tuser =  0
i =  5  tdata =  0  tuser =  0
i =  6  tdata =  0  tuser =  0
i =  7  tdata =  0  tuser =  0
i =  8  tdata =  0  tuser =  0
i =  9  tdata =  0  tuser =  0
   410.00ns INFO     cocotb.regression                  test_square_axil passed
   410.00ns INFO     cocotb.regression                  *******************************************************************************************
                                                        ** TEST                               STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        *******************************************************************************************
                                                        ** test_square_axis.test_square_axil   PASS         410.00           0.05       7978.31  **
                                                        *******************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0                     410.00           0.28       1460.47  **
                                                        *******************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axis' から出ます

  1. 2023年06月19日 04:29 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーション1

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4-Stream, AXI4, AXI4 Lite インターフェースの IP をシミュレーションしようということで、DMA Read して値を 2 乗し、 AXI4-Stream 出力を行う test_square_axis IP を作成した。

Vitis HLS 2023.1 を使用して、ZYBO Z7-20 用の test_square_axis プロジェクトを作成した。
cocotb_axi_42_230617.png

AXI4 Master のアドレスを 32 ビット幅とするため、Solution メニューから Solution Settings... を選択した。
Solution Settings (solution1) ダイアログが開いた。
config_interface を開いて、m_axi_addr64 のチェックを外した。
cocotb_axi_43_230617.png

ソースコードの test_square_axis.cpp を示す。

// test_square_axis.cpp
// 2023/06/13 by marsee
// Read data with DMA Read and output to AXI4-Stream.

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int test_square_axis(ap_int<32> *in, hls::stream<ap_axis<32,1,1,1> >& out){
#pragma HLS INTERFACE mode=axis register_mode=both port=out register
#pragma HLS INTERFACE mode=m_axi depth=10 port=in offset=slave
#pragma HLS INTERFACE mode=s_axilite port=return
    ap_axis<32,1,1,1> val;

    for(int i=0; i<10; i++){
        val.data = in[i] * in[i];
        if(i == 0)
            val.user = 1;
        else
            val.user = 0;

        if(i == 9)
            val.last = 1;
        else
            val.last = 0;

        out << val;
    }
    return(0);
}


テスベンチの test_square_axis_tb.cpp を示す。

// test_square_axis_tb.cpp
// 2023/06/13 by marsee

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int test_square_axis(ap_int<32> *in, hls::stream<ap_axis<32,1,1,1> >& out);

int main(){
    ap_int<32> data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    hls::stream<ap_axis<32,1,1,1> > outs;
    ap_axis<32,1,1,1> val;

    test_square_axis(data, outs);

    for(int i=0; i<10; i++){
        outs >> val;
        printf("val.data = %d, val.user = %d, val.last = %d\n",
                val.data, val.user, val.last);
    }
    return(0);
}


C シミュレーションを行った。
cocotb_axi_44_230617.png

C コードの合成を行った。
ループ中のインターバルは 1 クロックでバーストしている。いい感じだ。
cocotb_axi_45_230617.png

solution1/syn/verilog ディレクトリには、test_square_axis.v, test_square_axis_control_s_axi.v, test_square_axis_gmem_m_axi.v, test_square_axis_mul_32s_32s_32_2_1.v, test_square_axis_regslice_both.v の 5 個の Verilog HDL ファイルが生成された。
cocotb_axi_46_230617.png

C/RTL 協調シミュレーションを行った。
cocotb_axi_47_230617.png

C/RTL 協調シミュレーションの波形のうち、DMA Read 転送と AXI4-Strem への 2 乗データの出力部分を拡大する。
cocotb_axi_48_230617.png
  1. 2023年06月17日 04:43 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4, AXI4 Lite インターフェースの IP をシミュレーション2

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4, AXI4 Lite インターフェースの IP をシミュレーション1”の続き。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーションしたいということで、前回は、2 乗する AXI4 インターフェースの test_square_axi IP を Vitis HLS 2023.1 で作成した。今回は、test_square_axi IP の Verilog HDL ファイルを cocotbext-axi でシミュレーションを行った。

cocotbext-axi/tests ディレクトリの下に、test_square_axi ディレクトリを作成し、前回、高位合成した Verilog HDL ファイルの test_square_axi.v, test_square_axi_control_s_axi.v, test_square_axi_gmem_m_axi.v, test_square_axi_mul_32s_32s_32_2_1.v をコピーした。

cocotbext-axi の tests ディレクトリのファイルを参考にして、Makefile と test_square_axi.py を作成した。
cocotb_axi_38_230615.png

Makefile を示す。

# Makefile (for test_square_axi)
# 2023/06/08 by marsee

SIM ?= icarus

VERILOG_SOURCES += test_square_axi.v
VERILOG_SOURCES += test_square_axi_control_s_axi.v
VERILOG_SOURCES += test_square_axi_gmem_m_axi.v
VERILOG_SOURCES += test_square_axi_mul_32s_32s_32_2_1.v

TOPLEVEL = test_square_axi
MODULE = test_square_axi

include $(shell cocotb-config --makefiles)/Makefile.sim


test_square_axi.py を示す。

# test_aquare_axi.py
# 2023/06/13 by marsee
# I created the software with reference to cocotbext-axi/tests/axil/test_axil.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axil/test_axil.py
# I created the software with reference to cocotbext-axi/tests/axi/test_axi.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axi/test_axi.py

import random
import cocotb
from cocotb.clock import Clock
from cocotb.triggers import Timer, RisingEdge

from cocotbext.axi import AxiLiteBus, AxiLiteMaster, AxiLiteRam
from cocotbext.axi import AxiBus, AxiMaster, AxiRam

AP_DONE = 0x2

class TEST:
    def __init__(self, dut):
        self.dut = dut
        cocotb.start_soon(Clock(dut.ap_clk, 10, units="ns").start())
        self.axil_master = AxiLiteMaster(AxiLiteBus.from_prefix(dut, "s_axi_control"), dut.ap_clk)
        self.axi_ram = AxiRam(AxiBus.from_prefix(dut, "m_axi_gmem"), dut.ap_clk, size=2**16)
        self.axil_master = AxiLiteMaster(AxiLiteBus.from_prefix(dut, "s_axi_control"), dut.ap_clk)

@cocotb.test()
async def test_square_axil(dut):  
    test = TEST(dut)
    
    dut.ap_rst_n.value = 0; # Reset
    await Timer(30, units='ns')
    dut.ap_rst_n.value = 1; # Normal Operation
    await Timer(10, units='ns')
    
    for i in range(10):
        test.axi_ram.write(i*4, i.to_bytes(4,'little'))
    
    inv = 0
    out = 40
    zero = 0
    await test.axil_master.write(0x18, inv.to_bytes(4,'little')) # in_r[31:0]
    await test.axil_master.write(0x1C, zero.to_bytes(4,'little')) # in_r[63:32]
    await test.axil_master.write(0x24, out.to_bytes(4,'little')) # out_r[31:0]
    await test.axil_master.write(0x28, zero.to_bytes(4,'little')) # out_r[63:32]
    
    ap_start = 1
    await test.axil_master.write(0x00, ap_start.to_bytes(4,'little')) # ap_start
    await test.axil_master.read(0x00, 1)
    #await Timer(100, units='ns')
    
    data = await test.axil_master.read(0x00, 1) # wait end
    data_int = int.from_bytes(data, 'little')
    while (data_int & AP_DONE) != AP_DONE:
        data = await test.axil_master.read(0x00, 1)
        data_int = int.from_bytes(data, 'little')

    for i in range(10):
        data = test.axi_ram.read(40+i*4, 1)
        data_int = int.from_bytes(data, 'little')
        print('i = ', i, ' out = ', data_int)
        assert data_int == i*i
    


今回の Python コードは、ap_done を見て、AXI トランザクションの終了を検出するコードとその後に値のアサーションを追加した。

なお、test_square_axi.py は、タブを 4 個のスペースに変換してあるので、使用する場合は、スペースをタブに変換する。

更に、トップの Verilog HDL ファイル(test_square_axi.v)の WSTRB と AXI4 インターフェースの場合の BRESP, RRESP のみ、大文字だとテスベンチに接続されないので、小文字に置換した。更に VCD ファイルを出力する文を追加した。
test_square_axi.v を示す。

// ==============================================================
// Generated by Vitis HLS v2023.1
// Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
// Copyright 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved.
// ==============================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="test_square_axi_test_square_axi,hls_ip_2023_1,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z020-clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=7.300000,HLS_SYN_LAT=28,HLS_SYN_TPT=none,HLS_SYN_MEM=4,HLS_SYN_DSP=0,HLS_SYN_FF=1555,HLS_SYN_LUT=1351,HLS_VERSION=2023_1}" *)

module test_square_axi (
        ap_clk,
        ap_rst_n,
        m_axi_gmem_AWVALID,
        m_axi_gmem_AWREADY,
        m_axi_gmem_AWADDR,
        m_axi_gmem_AWID,
        m_axi_gmem_AWLEN,
        m_axi_gmem_AWSIZE,
        m_axi_gmem_AWBURST,
        m_axi_gmem_AWLOCK,
        m_axi_gmem_AWCACHE,
        m_axi_gmem_AWPROT,
        m_axi_gmem_AWQOS,
        m_axi_gmem_AWREGION,
        m_axi_gmem_AWUSER,
        m_axi_gmem_WVALID,
        m_axi_gmem_WREADY,
        m_axi_gmem_WDATA,
        m_axi_gmem_wstrb,
        m_axi_gmem_WLAST,
        m_axi_gmem_WID,
        m_axi_gmem_WUSER,
        m_axi_gmem_ARVALID,
        m_axi_gmem_ARREADY,
        m_axi_gmem_ARADDR,
        m_axi_gmem_ARID,
        m_axi_gmem_ARLEN,
        m_axi_gmem_ARSIZE,
        m_axi_gmem_ARBURST,
        m_axi_gmem_ARLOCK,
        m_axi_gmem_ARCACHE,
        m_axi_gmem_ARPROT,
        m_axi_gmem_ARQOS,
        m_axi_gmem_ARREGION,
        m_axi_gmem_ARUSER,
        m_axi_gmem_RVALID,
        m_axi_gmem_RREADY,
        m_axi_gmem_RDATA,
        m_axi_gmem_RLAST,
        m_axi_gmem_RID,
        m_axi_gmem_RUSER,
        m_axi_gmem_rresp,
        m_axi_gmem_BVALID,
        m_axi_gmem_BREADY,
        m_axi_gmem_bresp,
        m_axi_gmem_BID,
        m_axi_gmem_BUSER,
        s_axi_control_AWVALID,
        s_axi_control_AWREADY,
        s_axi_control_AWADDR,
        s_axi_control_WVALID,
        s_axi_control_WREADY,
        s_axi_control_WDATA,
        s_axi_control_wstrb,
        s_axi_control_ARVALID,
        s_axi_control_ARREADY,
        s_axi_control_ARADDR,
        s_axi_control_RVALID,
        s_axi_control_RREADY,
        s_axi_control_RDATA,
        s_axi_control_RRESP,
        s_axi_control_BVALID,
        s_axi_control_BREADY,
        s_axi_control_BRESP,
        interrupt
);

parameter    ap_ST_fsm_state1 = 3'd1;
parameter    ap_ST_fsm_pp0_stage0 = 3'd2;
parameter    ap_ST_fsm_state20 = 3'd4;
parameter    C_S_AXI_CONTROL_DATA_WIDTH = 32;
parameter    C_S_AXI_CONTROL_ADDR_WIDTH = 6;
parameter    C_S_AXI_DATA_WIDTH = 32;
parameter    C_M_AXI_GMEM_ID_WIDTH = 1;
parameter    C_M_AXI_GMEM_ADDR_WIDTH = 64;
parameter    C_M_AXI_GMEM_DATA_WIDTH = 32;
parameter    C_M_AXI_GMEM_AWUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_ARUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_WUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_RUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_BUSER_WIDTH = 1;
parameter    C_M_AXI_GMEM_USER_VALUE = 0;
parameter    C_M_AXI_GMEM_PROT_VALUE = 0;
parameter    C_M_AXI_GMEM_CACHE_VALUE = 3;
parameter    C_M_AXI_DATA_WIDTH = 32;

parameter C_S_AXI_CONTROL_WSTRB_WIDTH = (32 / 8);
parameter C_S_AXI_WSTRB_WIDTH = (32 / 8);
parameter C_M_AXI_GMEM_WSTRB_WIDTH = (32 / 8);
parameter C_M_AXI_WSTRB_WIDTH = (32 / 8);

input   ap_clk;
input   ap_rst_n;
output   m_axi_gmem_AWVALID;
input   m_axi_gmem_AWREADY;
output  [C_M_AXI_GMEM_ADDR_WIDTH - 1:0] m_axi_gmem_AWADDR;
output  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_AWID;
output  [7:0] m_axi_gmem_AWLEN;
output  [2:0] m_axi_gmem_AWSIZE;
output  [1:0] m_axi_gmem_AWBURST;
output  [1:0] m_axi_gmem_AWLOCK;
output  [3:0] m_axi_gmem_AWCACHE;
output  [2:0] m_axi_gmem_AWPROT;
output  [3:0] m_axi_gmem_AWQOS;
output  [3:0] m_axi_gmem_AWREGION;
output  [C_M_AXI_GMEM_AWUSER_WIDTH - 1:0] m_axi_gmem_AWUSER;
output   m_axi_gmem_WVALID;
input   m_axi_gmem_WREADY;
output  [C_M_AXI_GMEM_DATA_WIDTH - 1:0] m_axi_gmem_WDATA;
output  [C_M_AXI_GMEM_WSTRB_WIDTH - 1:0] m_axi_gmem_wstrb;
output   m_axi_gmem_WLAST;
output  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_WID;
output  [C_M_AXI_GMEM_WUSER_WIDTH - 1:0] m_axi_gmem_WUSER;
output   m_axi_gmem_ARVALID;
input   m_axi_gmem_ARREADY;
output  [C_M_AXI_GMEM_ADDR_WIDTH - 1:0] m_axi_gmem_ARADDR;
output  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_ARID;
output  [7:0] m_axi_gmem_ARLEN;
output  [2:0] m_axi_gmem_ARSIZE;
output  [1:0] m_axi_gmem_ARBURST;
output  [1:0] m_axi_gmem_ARLOCK;
output  [3:0] m_axi_gmem_ARCACHE;
output  [2:0] m_axi_gmem_ARPROT;
output  [3:0] m_axi_gmem_ARQOS;
output  [3:0] m_axi_gmem_ARREGION;
output  [C_M_AXI_GMEM_ARUSER_WIDTH - 1:0] m_axi_gmem_ARUSER;
input   m_axi_gmem_RVALID;
output   m_axi_gmem_RREADY;
input  [C_M_AXI_GMEM_DATA_WIDTH - 1:0] m_axi_gmem_RDATA;
input   m_axi_gmem_RLAST;
input  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_RID;
input  [C_M_AXI_GMEM_RUSER_WIDTH - 1:0] m_axi_gmem_RUSER;
input  [1:0] m_axi_gmem_rresp;
input   m_axi_gmem_BVALID;
output   m_axi_gmem_BREADY;
input  [1:0] m_axi_gmem_bresp;
input  [C_M_AXI_GMEM_ID_WIDTH - 1:0] m_axi_gmem_BID;
input  [C_M_AXI_GMEM_BUSER_WIDTH - 1:0] m_axi_gmem_BUSER;
input   s_axi_control_AWVALID;
output   s_axi_control_AWREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_AWADDR;
input   s_axi_control_WVALID;
output   s_axi_control_WREADY;
input  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_WDATA;
input  [C_S_AXI_CONTROL_WSTRB_WIDTH - 1:0] s_axi_control_wstrb;
input   s_axi_control_ARVALID;
output   s_axi_control_ARREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_ARADDR;
output   s_axi_control_RVALID;
input   s_axi_control_RREADY;
output  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_RDATA;
output  [1:0] s_axi_control_RRESP;
output   s_axi_control_BVALID;
input   s_axi_control_BREADY;
output  [1:0] s_axi_control_BRESP;
output   interrupt;

 reg    ap_rst_n_inv;
wire    ap_start;
reg    ap_done;
reg    ap_idle;
(* fsm_encoding = "none" *) reg   [2:0] ap_CS_fsm;
wire    ap_CS_fsm_state1;
reg    ap_ready;
wire   [63:0] in_r;
wire   [63:0] out_r;
reg    gmem_blk_n_AR;
wire    ap_CS_fsm_pp0_stage0;
reg    ap_enable_reg_pp0_iter1;
wire    ap_block_pp0_stage0;
reg   [0:0] first_iter_0_reg_132;
reg    gmem_blk_n_R;
reg    ap_enable_reg_pp0_iter9;
reg    gmem_blk_n_AW;
reg    gmem_blk_n_W;
reg    ap_enable_reg_pp0_iter12;
reg    gmem_blk_n_B;
reg    ap_enable_reg_pp0_iter17;
reg   [0:0] icmp_ln11_1_reg_263;
reg   [0:0] icmp_ln11_1_reg_263_pp0_iter16_reg;
wire    ap_block_state2_pp0_stage0_iter0;
reg    gmem_AWVALID;
wire    gmem_AWREADY;
reg    gmem_WVALID;
wire    gmem_WREADY;
reg    gmem_ARVALID;
wire    gmem_ARREADY;
wire    gmem_RVALID;
reg    gmem_RREADY;
wire   [31:0] gmem_RDATA;
wire   [8:0] gmem_RFIFONUM;
wire    gmem_BVALID;
reg    gmem_BREADY;
wire    ap_block_state3_pp0_stage0_iter1;
reg    ap_block_state3_io;
wire    ap_block_state4_pp0_stage0_iter2;
wire    ap_block_state5_pp0_stage0_iter3;
wire    ap_block_state6_pp0_stage0_iter4;
wire    ap_block_state7_pp0_stage0_iter5;
wire    ap_block_state8_pp0_stage0_iter6;
wire    ap_block_state9_pp0_stage0_iter7;
wire    ap_block_state10_pp0_stage0_iter8;
reg    ap_block_state11_pp0_stage0_iter9;
wire    ap_block_state12_pp0_stage0_iter10;
wire    ap_block_state13_pp0_stage0_iter11;
wire    ap_block_state14_pp0_stage0_iter12;
wire    ap_block_state15_pp0_stage0_iter13;
wire    ap_block_state16_pp0_stage0_iter14;
wire    ap_block_state17_pp0_stage0_iter15;
wire    ap_block_state18_pp0_stage0_iter16;
reg    ap_block_state19_pp0_stage0_iter17;
reg    ap_block_pp0_stage0_11001;
reg   [63:0] out_r_read_reg_226;
reg   [63:0] in_r_read_reg_231;
wire   [0:0] icmp_ln11_fu_157_p2;
reg   [0:0] icmp_ln11_reg_236;
wire   [3:0] add_ln11_fu_163_p2;
reg   [3:0] add_ln11_reg_240;
reg   [3:0] add_ln11_reg_240_pp0_iter1_reg;
reg   [3:0] add_ln11_reg_240_pp0_iter2_reg;
reg   [3:0] add_ln11_reg_240_pp0_iter3_reg;
reg   [3:0] add_ln11_reg_240_pp0_iter4_reg;
reg   [3:0] add_ln11_reg_240_pp0_iter5_reg;
reg   [3:0] add_ln11_reg_240_pp0_iter6_reg;
reg   [3:0] add_ln11_reg_240_pp0_iter7_reg;
reg   [3:0] add_ln11_reg_240_pp0_iter8_reg;
reg  signed [31:0] gmem_addr_read_reg_257;
wire   [0:0] icmp_ln11_1_fu_214_p2;
reg   [0:0] icmp_ln11_1_reg_263_pp0_iter10_reg;
reg   [0:0] icmp_ln11_1_reg_263_pp0_iter11_reg;
reg   [0:0] icmp_ln11_1_reg_263_pp0_iter12_reg;
reg   [0:0] icmp_ln11_1_reg_263_pp0_iter13_reg;
reg   [0:0] icmp_ln11_1_reg_263_pp0_iter14_reg;
reg   [0:0] icmp_ln11_1_reg_263_pp0_iter15_reg;
wire   [31:0] grp_fu_145_p2;
reg   [31:0] mul_ln12_reg_267;
reg    ap_enable_reg_pp0_iter0;
reg    ap_block_pp0_stage0_subdone;
reg    ap_condition_pp0_exit_iter0_state2;
reg    ap_enable_reg_pp0_iter2;
reg    ap_enable_reg_pp0_iter3;
reg    ap_enable_reg_pp0_iter4;
reg    ap_enable_reg_pp0_iter5;
reg    ap_enable_reg_pp0_iter6;
reg    ap_enable_reg_pp0_iter7;
reg    ap_enable_reg_pp0_iter8;
reg    ap_enable_reg_pp0_iter10;
reg    ap_enable_reg_pp0_iter11;
reg    ap_enable_reg_pp0_iter13;
reg    ap_enable_reg_pp0_iter14;
reg    ap_enable_reg_pp0_iter15;
reg    ap_enable_reg_pp0_iter16;
wire   [63:0] sext_ln11_fu_183_p1;
wire   [63:0] sext_ln11_1_fu_203_p1;
reg    ap_block_pp0_stage0_01001;
reg   [3:0] i_fu_88;
wire   [61:0] trunc_ln_fu_174_p4;
wire   [61:0] trunc_ln11_1_fu_194_p4;
reg    grp_fu_145_ce;
wire    ap_CS_fsm_state20;
reg   [2:0] ap_NS_fsm;
reg    ap_ST_fsm_state1_blk;
wire    ap_ST_fsm_state20_blk;
reg    ap_idle_pp0;
wire    ap_enable_pp0;
wire    ap_ce_reg;
wire   [31:0] ap_return;

// power-on initialization
initial begin
#0 ap_CS_fsm = 3'd1;
#0 ap_enable_reg_pp0_iter1 = 1'b0;
#0 ap_enable_reg_pp0_iter9 = 1'b0;
#0 ap_enable_reg_pp0_iter12 = 1'b0;
#0 ap_enable_reg_pp0_iter17 = 1'b0;
#0 ap_enable_reg_pp0_iter0 = 1'b0;
#0 ap_enable_reg_pp0_iter2 = 1'b0;
#0 ap_enable_reg_pp0_iter3 = 1'b0;
#0 ap_enable_reg_pp0_iter4 = 1'b0;
#0 ap_enable_reg_pp0_iter5 = 1'b0;
#0 ap_enable_reg_pp0_iter6 = 1'b0;
#0 ap_enable_reg_pp0_iter7 = 1'b0;
#0 ap_enable_reg_pp0_iter8 = 1'b0;
#0 ap_enable_reg_pp0_iter10 = 1'b0;
#0 ap_enable_reg_pp0_iter11 = 1'b0;
#0 ap_enable_reg_pp0_iter13 = 1'b0;
#0 ap_enable_reg_pp0_iter14 = 1'b0;
#0 ap_enable_reg_pp0_iter15 = 1'b0;
#0 ap_enable_reg_pp0_iter16 = 1'b0;
end

test_square_axi_control_s_axi #(
    .C_S_AXI_ADDR_WIDTH( C_S_AXI_CONTROL_ADDR_WIDTH ),
    .C_S_AXI_DATA_WIDTH( C_S_AXI_CONTROL_DATA_WIDTH ))
control_s_axi_U(
    .AWVALID(s_axi_control_AWVALID),
    .AWREADY(s_axi_control_AWREADY),
    .AWADDR(s_axi_control_AWADDR),
    .WVALID(s_axi_control_WVALID),
    .WREADY(s_axi_control_WREADY),
    .WDATA(s_axi_control_WDATA),
    .WSTRB(s_axi_control_wstrb),
    .ARVALID(s_axi_control_ARVALID),
    .ARREADY(s_axi_control_ARREADY),
    .ARADDR(s_axi_control_ARADDR),
    .RVALID(s_axi_control_RVALID),
    .RREADY(s_axi_control_RREADY),
    .RDATA(s_axi_control_RDATA),
    .RRESP(s_axi_control_RRESP),
    .BVALID(s_axi_control_BVALID),
    .BREADY(s_axi_control_BREADY),
    .BRESP(s_axi_control_BRESP),
    .ACLK(ap_clk),
    .ARESET(ap_rst_n_inv),
    .ACLK_EN(1'b1),
    .ap_start(ap_start),
    .interrupt(interrupt),
    .ap_ready(ap_ready),
    .ap_done(ap_done),
    .ap_idle(ap_idle),
    .ap_return(32'd0),
    .in_r(in_r),
    .out_r(out_r)
);

test_square_axi_gmem_m_axi #(
    .CONSERVATIVE( 1 ),
    .USER_MAXREQS( 5 ),
    .MAX_READ_BURST_LENGTH( 16 ),
    .MAX_WRITE_BURST_LENGTH( 16 ),
    .C_M_AXI_ID_WIDTH( C_M_AXI_GMEM_ID_WIDTH ),
    .C_M_AXI_ADDR_WIDTH( C_M_AXI_GMEM_ADDR_WIDTH ),
    .C_M_AXI_DATA_WIDTH( C_M_AXI_GMEM_DATA_WIDTH ),
    .C_M_AXI_AWUSER_WIDTH( C_M_AXI_GMEM_AWUSER_WIDTH ),
    .C_M_AXI_ARUSER_WIDTH( C_M_AXI_GMEM_ARUSER_WIDTH ),
    .C_M_AXI_WUSER_WIDTH( C_M_AXI_GMEM_WUSER_WIDTH ),
    .C_M_AXI_RUSER_WIDTH( C_M_AXI_GMEM_RUSER_WIDTH ),
    .C_M_AXI_BUSER_WIDTH( C_M_AXI_GMEM_BUSER_WIDTH ),
    .C_USER_VALUE( C_M_AXI_GMEM_USER_VALUE ),
    .C_PROT_VALUE( C_M_AXI_GMEM_PROT_VALUE ),
    .C_CACHE_VALUE( C_M_AXI_GMEM_CACHE_VALUE ),
    .USER_RFIFONUM_WIDTH( 9 ),
    .USER_DW( 32 ),
    .USER_AW( 64 ),
    .NUM_READ_OUTSTANDING( 16 ),
    .NUM_WRITE_OUTSTANDING( 16 ))
gmem_m_axi_U(
    .AWVALID(m_axi_gmem_AWVALID),
    .AWREADY(m_axi_gmem_AWREADY),
    .AWADDR(m_axi_gmem_AWADDR),
    .AWID(m_axi_gmem_AWID),
    .AWLEN(m_axi_gmem_AWLEN),
    .AWSIZE(m_axi_gmem_AWSIZE),
    .AWBURST(m_axi_gmem_AWBURST),
    .AWLOCK(m_axi_gmem_AWLOCK),
    .AWCACHE(m_axi_gmem_AWCACHE),
    .AWPROT(m_axi_gmem_AWPROT),
    .AWQOS(m_axi_gmem_AWQOS),
    .AWREGION(m_axi_gmem_AWREGION),
    .AWUSER(m_axi_gmem_AWUSER),
    .WVALID(m_axi_gmem_WVALID),
    .WREADY(m_axi_gmem_WREADY),
    .WDATA(m_axi_gmem_WDATA),
    .WSTRB(m_axi_gmem_wstrb),
    .WLAST(m_axi_gmem_WLAST),
    .WID(m_axi_gmem_WID),
    .WUSER(m_axi_gmem_WUSER),
    .ARVALID(m_axi_gmem_ARVALID),
    .ARREADY(m_axi_gmem_ARREADY),
    .ARADDR(m_axi_gmem_ARADDR),
    .ARID(m_axi_gmem_ARID),
    .ARLEN(m_axi_gmem_ARLEN),
    .ARSIZE(m_axi_gmem_ARSIZE),
    .ARBURST(m_axi_gmem_ARBURST),
    .ARLOCK(m_axi_gmem_ARLOCK),
    .ARCACHE(m_axi_gmem_ARCACHE),
    .ARPROT(m_axi_gmem_ARPROT),
    .ARQOS(m_axi_gmem_ARQOS),
    .ARREGION(m_axi_gmem_ARREGION),
    .ARUSER(m_axi_gmem_ARUSER),
    .RVALID(m_axi_gmem_RVALID),
    .RREADY(m_axi_gmem_RREADY),
    .RDATA(m_axi_gmem_RDATA),
    .RLAST(m_axi_gmem_RLAST),
    .RID(m_axi_gmem_RID),
    .RUSER(m_axi_gmem_RUSER),
    .RRESP(m_axi_gmem_rresp),
    .BVALID(m_axi_gmem_BVALID),
    .BREADY(m_axi_gmem_BREADY),
    .BRESP(m_axi_gmem_bresp),
    .BID(m_axi_gmem_BID),
    .BUSER(m_axi_gmem_BUSER),
    .ACLK(ap_clk),
    .ARESET(ap_rst_n_inv),
    .ACLK_EN(1'b1),
    .I_ARVALID(gmem_ARVALID),
    .I_ARREADY(gmem_ARREADY),
    .I_ARADDR(sext_ln11_fu_183_p1),
    .I_ARLEN(32'd10),
    .I_RVALID(gmem_RVALID),
    .I_RREADY(gmem_RREADY),
    .I_RDATA(gmem_RDATA),
    .I_RFIFONUM(gmem_RFIFONUM),
    .I_AWVALID(gmem_AWVALID),
    .I_AWREADY(gmem_AWREADY),
    .I_AWADDR(sext_ln11_1_fu_203_p1),
    .I_AWLEN(32'd10),
    .I_WVALID(gmem_WVALID),
    .I_WREADY(gmem_WREADY),
    .I_WDATA(mul_ln12_reg_267),
    .I_WSTRB(4'd15),
    .I_BVALID(gmem_BVALID),
    .I_BREADY(gmem_BREADY)
);

test_square_axi_mul_32s_32s_32_2_1 #(
    .ID( 1 ),
    .NUM_STAGE( 2 ),
    .din0_WIDTH( 32 ),
    .din1_WIDTH( 32 ),
    .dout_WIDTH( 32 ))
mul_32s_32s_32_2_1_U1(
    .clk(ap_clk),
    .reset(ap_rst_n_inv),
    .din0(gmem_addr_read_reg_257),
    .din1(gmem_addr_read_reg_257),
    .ce(grp_fu_145_ce),
    .dout(grp_fu_145_p2)
);

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_CS_fsm <= ap_ST_fsm_state1;
    end else begin
        ap_CS_fsm <= ap_NS_fsm;
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter0 <= 1'b0;
    end else begin
        if (((1'b0 == ap_block_pp0_stage0_subdone) & (1'b1 == ap_CS_fsm_pp0_stage0) & (1'b1 == ap_condition_pp0_exit_iter0_state2))) begin
            ap_enable_reg_pp0_iter0 <= 1'b0;
        end else if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
            ap_enable_reg_pp0_iter0 <= 1'b1;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter1 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            if ((1'b1 == ap_condition_pp0_exit_iter0_state2)) begin
                ap_enable_reg_pp0_iter1 <= (1'b1 ^ ap_condition_pp0_exit_iter0_state2);
            end else if ((1'b1 == 1'b1)) begin
                ap_enable_reg_pp0_iter1 <= ap_enable_reg_pp0_iter0;
            end
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter10 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter10 <= ap_enable_reg_pp0_iter9;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter11 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter11 <= ap_enable_reg_pp0_iter10;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter12 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter12 <= ap_enable_reg_pp0_iter11;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter13 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter13 <= ap_enable_reg_pp0_iter12;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter14 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter14 <= ap_enable_reg_pp0_iter13;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter15 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter15 <= ap_enable_reg_pp0_iter14;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter16 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter16 <= ap_enable_reg_pp0_iter15;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter17 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter17 <= ap_enable_reg_pp0_iter16;
        end else if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
            ap_enable_reg_pp0_iter17 <= 1'b0;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter2 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter2 <= ap_enable_reg_pp0_iter1;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter3 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter3 <= ap_enable_reg_pp0_iter2;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter4 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter4 <= ap_enable_reg_pp0_iter3;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter5 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter5 <= ap_enable_reg_pp0_iter4;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter6 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter6 <= ap_enable_reg_pp0_iter5;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter7 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter7 <= ap_enable_reg_pp0_iter6;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter8 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter8 <= ap_enable_reg_pp0_iter7;
        end
    end
end

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_enable_reg_pp0_iter9 <= 1'b0;
    end else begin
        if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
            ap_enable_reg_pp0_iter9 <= ap_enable_reg_pp0_iter8;
        end
    end
end

always @ (posedge ap_clk) begin
    if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
        first_iter_0_reg_132 <= 1'd1;
    end else if (((1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter1 == 1'b1) & (icmp_ln11_reg_236 == 1'd0) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        first_iter_0_reg_132 <= 1'd0;
    end
end

always @ (posedge ap_clk) begin
    if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
        i_fu_88 <= 4'd0;
    end else if (((1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter0 == 1'b1) & (icmp_ln11_fu_157_p2 == 1'd0) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        i_fu_88 <= add_ln11_fu_163_p2;
    end
end

always @ (posedge ap_clk) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        add_ln11_reg_240 <= add_ln11_fu_163_p2;
        add_ln11_reg_240_pp0_iter1_reg <= add_ln11_reg_240;
        icmp_ln11_reg_236 <= icmp_ln11_fu_157_p2;
    end
end

always @ (posedge ap_clk) begin
    if ((1'b0 == ap_block_pp0_stage0_11001)) begin
        add_ln11_reg_240_pp0_iter2_reg <= add_ln11_reg_240_pp0_iter1_reg;
        add_ln11_reg_240_pp0_iter3_reg <= add_ln11_reg_240_pp0_iter2_reg;
        add_ln11_reg_240_pp0_iter4_reg <= add_ln11_reg_240_pp0_iter3_reg;
        add_ln11_reg_240_pp0_iter5_reg <= add_ln11_reg_240_pp0_iter4_reg;
        add_ln11_reg_240_pp0_iter6_reg <= add_ln11_reg_240_pp0_iter5_reg;
        add_ln11_reg_240_pp0_iter7_reg <= add_ln11_reg_240_pp0_iter6_reg;
        add_ln11_reg_240_pp0_iter8_reg <= add_ln11_reg_240_pp0_iter7_reg;
        gmem_addr_read_reg_257 <= gmem_RDATA;
        icmp_ln11_1_reg_263 <= icmp_ln11_1_fu_214_p2;
        icmp_ln11_1_reg_263_pp0_iter10_reg <= icmp_ln11_1_reg_263;
        icmp_ln11_1_reg_263_pp0_iter11_reg <= icmp_ln11_1_reg_263_pp0_iter10_reg;
        icmp_ln11_1_reg_263_pp0_iter12_reg <= icmp_ln11_1_reg_263_pp0_iter11_reg;
        icmp_ln11_1_reg_263_pp0_iter13_reg <= icmp_ln11_1_reg_263_pp0_iter12_reg;
        icmp_ln11_1_reg_263_pp0_iter14_reg <= icmp_ln11_1_reg_263_pp0_iter13_reg;
        icmp_ln11_1_reg_263_pp0_iter15_reg <= icmp_ln11_1_reg_263_pp0_iter14_reg;
        icmp_ln11_1_reg_263_pp0_iter16_reg <= icmp_ln11_1_reg_263_pp0_iter15_reg;
        mul_ln12_reg_267 <= grp_fu_145_p2;
    end
end

always @ (posedge ap_clk) begin
    if ((1'b1 == ap_CS_fsm_state1)) begin
        in_r_read_reg_231 <= in_r;
        out_r_read_reg_226 <= out_r;
    end
end

always @ (*) begin
    if ((ap_start == 1'b0)) begin
        ap_ST_fsm_state1_blk = 1'b1;
    end else begin
        ap_ST_fsm_state1_blk = 1'b0;
    end
end

assign ap_ST_fsm_state20_blk = 1'b0;

always @ (*) begin
    if ((icmp_ln11_fu_157_p2 == 1'd1)) begin
        ap_condition_pp0_exit_iter0_state2 = 1'b1;
    end else begin
        ap_condition_pp0_exit_iter0_state2 = 1'b0;
    end
end

always @ (*) begin
    if ((1'b1 == ap_CS_fsm_state20)) begin
        ap_done = 1'b1;
    end else begin
        ap_done = 1'b0;
    end
end

always @ (*) begin
    if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b0))) begin
        ap_idle = 1'b1;
    end else begin
        ap_idle = 1'b0;
    end
end

always @ (*) begin
    if (((ap_enable_reg_pp0_iter9 == 1'b0) & (ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter16 == 1'b0) & (ap_enable_reg_pp0_iter15 == 1'b0) & (ap_enable_reg_pp0_iter14 == 1'b0) & (ap_enable_reg_pp0_iter13 == 1'b0) & (ap_enable_reg_pp0_iter11 == 1'b0) & (ap_enable_reg_pp0_iter10 == 1'b0) & (ap_enable_reg_pp0_iter8 == 1'b0) & (ap_enable_reg_pp0_iter7 == 1'b0) & (ap_enable_reg_pp0_iter6 == 1'b0) & (ap_enable_reg_pp0_iter5 == 1'b0) & (ap_enable_reg_pp0_iter4 == 1'b0) & (ap_enable_reg_pp0_iter3 == 1'b0) & (ap_enable_reg_pp0_iter2 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b0) & (ap_enable_reg_pp0_iter17 == 1'b0) & (ap_enable_reg_pp0_iter12 == 1'b0))) begin
        ap_idle_pp0 = 1'b1;
    end else begin
        ap_idle_pp0 = 1'b0;
    end
end

always @ (*) begin
    if ((1'b1 == ap_CS_fsm_state20)) begin
        ap_ready = 1'b1;
    end else begin
        ap_ready = 1'b0;
    end
end

always @ (*) begin
    if (((first_iter_0_reg_132 == 1'd1) & (1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        gmem_ARVALID = 1'b1;
    end else begin
        gmem_ARVALID = 1'b0;
    end
end

always @ (*) begin
    if (((first_iter_0_reg_132 == 1'd1) & (1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        gmem_AWVALID = 1'b1;
    end else begin
        gmem_AWVALID = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln11_1_reg_263_pp0_iter16_reg == 1'd1) & (ap_enable_reg_pp0_iter17 == 1'b1))) begin
        gmem_BREADY = 1'b1;
    end else begin
        gmem_BREADY = 1'b0;
    end
end

always @ (*) begin
    if (((ap_enable_reg_pp0_iter9 == 1'b1) & (1'b0 == ap_block_pp0_stage0_11001))) begin
        gmem_RREADY = 1'b1;
    end else begin
        gmem_RREADY = 1'b0;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (ap_enable_reg_pp0_iter12 == 1'b1))) begin
        gmem_WVALID = 1'b1;
    end else begin
        gmem_WVALID = 1'b0;
    end
end

always @ (*) begin
    if (((first_iter_0_reg_132 == 1'd1) & (1'b0 == ap_block_pp0_stage0) & (ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        gmem_blk_n_AR = m_axi_gmem_ARREADY;
    end else begin
        gmem_blk_n_AR = 1'b1;
    end
end

always @ (*) begin
    if (((first_iter_0_reg_132 == 1'd1) & (1'b0 == ap_block_pp0_stage0) & (ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        gmem_blk_n_AW = m_axi_gmem_AWREADY;
    end else begin
        gmem_blk_n_AW = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0) & (icmp_ln11_1_reg_263_pp0_iter16_reg == 1'd1) & (ap_enable_reg_pp0_iter17 == 1'b1))) begin
        gmem_blk_n_B = m_axi_gmem_BVALID;
    end else begin
        gmem_blk_n_B = 1'b1;
    end
end

always @ (*) begin
    if (((ap_enable_reg_pp0_iter9 == 1'b1) & (1'b0 == ap_block_pp0_stage0))) begin
        gmem_blk_n_R = m_axi_gmem_RVALID;
    end else begin
        gmem_blk_n_R = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0) & (ap_enable_reg_pp0_iter12 == 1'b1))) begin
        gmem_blk_n_W = m_axi_gmem_WREADY;
    end else begin
        gmem_blk_n_W = 1'b1;
    end
end

always @ (*) begin
    if (((1'b0 == ap_block_pp0_stage0_11001) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
        grp_fu_145_ce = 1'b1;
    end else begin
        grp_fu_145_ce = 1'b0;
    end
end

always @ (*) begin
    case (ap_CS_fsm)
        ap_ST_fsm_state1 : begin
            if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
                ap_NS_fsm = ap_ST_fsm_pp0_stage0;
            end else begin
                ap_NS_fsm = ap_ST_fsm_state1;
            end
        end
        ap_ST_fsm_pp0_stage0 : begin
            if ((~((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b1) & (icmp_ln11_fu_157_p2 == 1'd1)) & ~((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter16 == 1'b0) & (ap_enable_reg_pp0_iter17 == 1'b1)))) begin
                ap_NS_fsm = ap_ST_fsm_pp0_stage0;
            end else if ((((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter16 == 1'b0) & (ap_enable_reg_pp0_iter17 == 1'b1)) | ((1'b0 == ap_block_pp0_stage0_subdone) & (ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b1) & (icmp_ln11_fu_157_p2 == 1'd1)))) begin
                ap_NS_fsm = ap_ST_fsm_state20;
            end else begin
                ap_NS_fsm = ap_ST_fsm_pp0_stage0;
            end
        end
        ap_ST_fsm_state20 : begin
            ap_NS_fsm = ap_ST_fsm_state1;
        end
        default : begin
            ap_NS_fsm = 'bx;
        end
    endcase
end

assign add_ln11_fu_163_p2 = (i_fu_88 + 4'd1);

assign ap_CS_fsm_pp0_stage0 = ap_CS_fsm[32'd1];

assign ap_CS_fsm_state1 = ap_CS_fsm[32'd0];

assign ap_CS_fsm_state20 = ap_CS_fsm[32'd2];

assign ap_block_pp0_stage0 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_pp0_stage0_01001 = (((ap_enable_reg_pp0_iter9 == 1'b1) & (gmem_RVALID == 1'b0)) | ((gmem_BVALID == 1'b0) & (icmp_ln11_1_reg_263_pp0_iter16_reg == 1'd1) & (ap_enable_reg_pp0_iter17 == 1'b1)));
end

always @ (*) begin
    ap_block_pp0_stage0_11001 = (((ap_enable_reg_pp0_iter9 == 1'b1) & (gmem_RVALID == 1'b0)) | ((ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_block_state3_io)) | ((gmem_BVALID == 1'b0) & (icmp_ln11_1_reg_263_pp0_iter16_reg == 1'd1) & (ap_enable_reg_pp0_iter17 == 1'b1)) | ((gmem_WREADY == 1'b0) & (ap_enable_reg_pp0_iter12 == 1'b1)));
end

always @ (*) begin
    ap_block_pp0_stage0_subdone = (((ap_enable_reg_pp0_iter9 == 1'b1) & (gmem_RVALID == 1'b0)) | ((ap_enable_reg_pp0_iter1 == 1'b1) & (1'b1 == ap_block_state3_io)) | ((gmem_BVALID == 1'b0) & (icmp_ln11_1_reg_263_pp0_iter16_reg == 1'd1) & (ap_enable_reg_pp0_iter17 == 1'b1)) | ((gmem_WREADY == 1'b0) & (ap_enable_reg_pp0_iter12 == 1'b1)));
end

assign ap_block_state10_pp0_stage0_iter8 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_state11_pp0_stage0_iter9 = (gmem_RVALID == 1'b0);
end

assign ap_block_state12_pp0_stage0_iter10 = ~(1'b1 == 1'b1);

assign ap_block_state13_pp0_stage0_iter11 = ~(1'b1 == 1'b1);

assign ap_block_state14_pp0_stage0_iter12 = ~(1'b1 == 1'b1);

assign ap_block_state15_pp0_stage0_iter13 = ~(1'b1 == 1'b1);

assign ap_block_state16_pp0_stage0_iter14 = ~(1'b1 == 1'b1);

assign ap_block_state17_pp0_stage0_iter15 = ~(1'b1 == 1'b1);

assign ap_block_state18_pp0_stage0_iter16 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_state19_pp0_stage0_iter17 = ((gmem_BVALID == 1'b0) & (icmp_ln11_1_reg_263_pp0_iter16_reg == 1'd1));
end

assign ap_block_state2_pp0_stage0_iter0 = ~(1'b1 == 1'b1);

always @ (*) begin
    ap_block_state3_io = (((first_iter_0_reg_132 == 1'd1) & (gmem_AWREADY == 1'b0)) | ((first_iter_0_reg_132 == 1'd1) & (gmem_ARREADY == 1'b0)));
end

assign ap_block_state3_pp0_stage0_iter1 = ~(1'b1 == 1'b1);

assign ap_block_state4_pp0_stage0_iter2 = ~(1'b1 == 1'b1);

assign ap_block_state5_pp0_stage0_iter3 = ~(1'b1 == 1'b1);

assign ap_block_state6_pp0_stage0_iter4 = ~(1'b1 == 1'b1);

assign ap_block_state7_pp0_stage0_iter5 = ~(1'b1 == 1'b1);

assign ap_block_state8_pp0_stage0_iter6 = ~(1'b1 == 1'b1);

assign ap_block_state9_pp0_stage0_iter7 = ~(1'b1 == 1'b1);

assign ap_enable_pp0 = (ap_idle_pp0 ^ 1'b1);

always @ (*) begin
    ap_rst_n_inv = ~ap_rst_n;
end

assign icmp_ln11_1_fu_214_p2 = ((add_ln11_reg_240_pp0_iter8_reg == 4'd10) ? 1'b1 : 1'b0);

assign icmp_ln11_fu_157_p2 = ((i_fu_88 == 4'd10) ? 1'b1 : 1'b0);

assign sext_ln11_1_fu_203_p1 = $signed(trunc_ln11_1_fu_194_p4);

assign sext_ln11_fu_183_p1 = $signed(trunc_ln_fu_174_p4);

assign trunc_ln11_1_fu_194_p4 = {{out_r_read_reg_226[63:2]}};

assign trunc_ln_fu_174_p4 = {{in_r_read_reg_231[63:2]}};

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_square_axi.vcd");
  $dumpvars (0, test_square_axi);
  #1;
end
`endif

endmodule //test_square_axi


cocotbext-axi/tests/test_square_axi ディレクトリに行って、make を実行した。PASS した。
Verilog HDL シミュレータは Icarus Verilog を使用した。
make
cocotb_axi_39_230615.png

test_square_axi.vcd が生成された。

gtkwave で test_square_axi.vcd を開く。
test_square_axi の信号を追加して、AXI4 Lite インターフェースの信号を並べ替えた。
gtkwave test_square_axi.vcd
cocotb_axi_40_230615.png

今回は、0x00 番地に 1 を書いて、ap_start を 1 にしてから、0x00 番地を読んで ap_done を監視しているのが分かる。

AXI4 インターフェースの信号を示す。
cocotb_axi_41_230615.png

make の時のログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axi$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axi' に入ります
/usr/bin/iverilog -o sim_build/sim.vvp -D COCOTB_SIM=1 -s test_square_axi -f sim_build/cmds.f -g2012   test_square_axi.v test_square_axi_control_s_axi.v test_square_axi_gmem_m_axi.v test_square_axi_mul_32s_32s_32_2_1.v
rm -f results.xml
MODULE=test_square_axi TESTCASE= TOPLEVEL=test_square_axi TOPLEVEL_LANG=verilog \
         /usr/bin/vvp -M /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb/libs -m libcocotbvpi_icarus   sim_build/sim.vvp 
     -.--ns INFO     gpi                                ..mbed/gpi_embed.cpp:76   in set_program_name_in_venv        Did not detect Python virtual environment. Using system-wide Python interpreter
     -.--ns INFO     gpi                                ../gpi/GpiCommon.cpp:101  in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb                             Running on Icarus Verilog version 10.1 (stable)
     0.00ns INFO     cocotb                             Running tests with cocotb v1.7.0 from /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb
     0.00ns INFO     cocotb                             Seeding Python random module with 1686836887
     0.00ns INFO     cocotb.regression                  Found test test_square_axi.test_square_axil
     0.00ns INFO     cocotb.regression                  running test_square_axil (1/1)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master (write)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..tb.test_square_axi.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Address width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master signals:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awaddr width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awprot: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   bready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   bresp: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master (read)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..tb.test_square_axi.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Address width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master signals:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   araddr width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   arprot: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   arready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rresp: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  AXI slave model (write)
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Copyright (c) 2021 Alex Forencich
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Reset de-asserted
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Reset de-asserted
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Reset de-asserted
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  AXI slave model configuration:
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    Address width: 64 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    ID width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  AXI slave model signals:
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awaddr width: 64 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awburst width: 2 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awcache: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awlen width: 8 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awlock: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awprot: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awqos: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awready width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awregion: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awsize width: 3 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awuser: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    awvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    wdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    wlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    wready width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    wstrb width: 4 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    wuser: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    wvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    bid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    bready width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    bresp width: 2 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    buser: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    bvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Reset de-asserted
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  AXI slave model (read)
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  cocotbext-axi version 0.1.18
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Copyright (c) 2021 Alex Forencich
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Reset de-asserted
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Reset de-asserted
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  AXI slave model configuration:
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    Address width: 64 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    ID width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    Byte size: 8 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    Data width: 32 bits (4 bytes)
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  AXI slave model signals:
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    araddr width: 64 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arburst width: 2 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arcache: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arlen width: 8 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arlock: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arprot: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arqos: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arready width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arregion: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arsize width: 3 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    aruser: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    arvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    rdata width: 32 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    rid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    rlast width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    rready width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    rresp width: 2 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    ruser: not present
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem    rvalid width: 1 bits
     0.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master (write)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..tb.test_square_axi.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Address width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master signals:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awaddr width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awprot: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   bready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   bresp: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master (read)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..tb.test_square_axi.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Address width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..tb.test_square_axi.s_axi_control AXI lite master signals:
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   araddr width: 6 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   arprot: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   arready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rready width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rresp: not present
     0.00ns INFO     ..tb.test_square_axi.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ..tb.test_square_axi.s_axi_control Reset de-asserted
VCD info: dumpfile test_square_axi.vcd opened for output.
    40.00ns INFO     ..tb.test_square_axi.s_axi_control Write start addr: 0x00000018 prot: AxiProt.NONSECURE data: 00 00 00 00
    70.00ns INFO     ..tb.test_square_axi.s_axi_control Write complete addr: 0x00000018 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
    70.00ns INFO     ..tb.test_square_axi.s_axi_control Write start addr: 0x0000001c prot: AxiProt.NONSECURE data: 00 00 00 00
   110.00ns INFO     ..tb.test_square_axi.s_axi_control Write complete addr: 0x0000001c prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
   110.00ns INFO     ..tb.test_square_axi.s_axi_control Write start addr: 0x00000024 prot: AxiProt.NONSECURE data: 28 00 00 00
   150.00ns INFO     ..tb.test_square_axi.s_axi_control Write complete addr: 0x00000024 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
   150.00ns INFO     ..tb.test_square_axi.s_axi_control Write start addr: 0x00000028 prot: AxiProt.NONSECURE data: 00 00 00 00
   190.00ns INFO     ..tb.test_square_axi.s_axi_control Write complete addr: 0x00000028 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
   190.00ns INFO     ..tb.test_square_axi.s_axi_control Write start addr: 0x00000000 prot: AxiProt.NONSECURE data: 01 00 00 00
   230.00ns INFO     ..tb.test_square_axi.s_axi_control Write complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
   230.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   260.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   260.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   290.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   290.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   320.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Read burst arid: 0x0 araddr: 0x00000000 arlen: 9 arsize: 2 arprot: AxiProt.0
   320.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   320.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   350.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   350.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   380.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   380.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   410.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   410.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   440.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   440.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   470.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   470.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   500.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   500.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   530.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   530.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   540.00ns INFO     cocotb.test_square_axi.m_axi_gmem  Write burst awid: 0x0 awaddr: 0x00000028 awlen: 9 awsize: 2 awprot: AxiProt.0
   560.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   560.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   590.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   590.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   620.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   620.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   650.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   650.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   680.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 01
   680.00ns INFO     ..tb.test_square_axi.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   710.00ns INFO     ..tb.test_square_axi.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 0a
i =  0  out =  0
i =  1  out =  1
i =  2  out =  4
i =  3  out =  9
i =  4  out =  16
i =  5  out =  25
i =  6  out =  36
i =  7  out =  49
i =  8  out =  64
i =  9  out =  81
   710.00ns INFO     cocotb.regression                  test_square_axil passed
   710.00ns INFO     cocotb.regression                  ******************************************************************************************
                                                        ** TEST                              STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        ******************************************************************************************
                                                        ** test_square_axi.test_square_axil   PASS         710.00           0.08       9194.36  **
                                                        ******************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0                    710.00           0.30       2387.76  **
                                                        ******************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axi' から出ます

  1. 2023年06月16日 03:50 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4, AXI4 Lite インターフェースの IP をシミュレーション1

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーションしたいということで、2 乗する AXI4 インターフェースの test_square_axi IP を Vitis HLS 2023.1 で作成した。制御信号は AXI4 Lite インターフェースに実装したので、cocotbext-axi を使って、AXI4, AXI4 Lite インターフェースをシミュレーションする予定だ。

まずは、ZYBO Z7-20 用の test_square_axi プロジェクトを Vitis HLS 2023.1 で作成した。
ZYBO Z7-20 用だが、AXI4 インターフェースのアドレスは 64 ビット幅とする。
cocotb_axi_31_230615.png

test_square_axi.cpp を示す。

// test_square_axi.cpp
// 2023/06/13 by marsee

#include <stdint.h>

int test_square_axi(uint32_t *in, uint32_t *out){
#pragma HLS INTERFACE mode=s_axilite port=return
#pragma HLS INTERFACE mode=m_axi depth=10 port=out offset=slave
#pragma HLS INTERFACE mode=m_axi depth=10 port=in offset=slave

    for(int i=0; i<10; i++){
        out[i] = in[i] * in[i];
    }

    return(0);
}


test_square_axi_tb.cpp を示す。

// test_square_axi_tb.cpp
// 2023/06/13 by marsee

#include <stdint.h>
#include <iostream>

int test_square_axi(uint32_t *in, uint32_t *out);

int main(){
    uint32_t data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    uint32_t result[10];

    test_square_axi(data, result);

    for(int i=0; i<10; i++){
        std::cout << "data[" << i << "]= " << data[i] <<
                ", result[" << i << "] = " <<
                result[i] << std::endl;
    }

    return(0);
}


C シミュレーションを行った。
cocotb_axi_32_230615.png

C コードの合成を行った。
インターバルは 1 クロックだった。
cocotb_axi_33_230615.png

solution1/syn/verilog ディレクトリに test_square_axi.v, test_square_axi_control_s_axi.v, test_square_axi_gmem_m_axi.v, test_square_axi_mul_32s_32s_32_2_1.v の 4 個の Verilog HDL ファイルが生成された。
cocotb_axi_35_230615.png

test_square_axi_control_s_axi.v の Address Info を示す。

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read/COR)
//        bit 7  - auto_restart (Read/Write)
//        bit 9  - interrupt (Read)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0 - enable ap_done interrupt (Read/Write)
//        bit 1 - enable ap_ready interrupt (Read/Write)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0 - ap_done (Read/TOW)
//        bit 1 - ap_ready (Read/TOW)
//        others - reserved
// 0x10 : Data signal of ap_return
//        bit 31~0 - ap_return[31:0] (Read)
// 0x18 : Data signal of in_r
//        bit 31~0 - in_r[31:0] (Read/Write)
// 0x1c : Data signal of in_r
//        bit 31~0 - in_r[63:32] (Read/Write)
// 0x20 : reserved
// 0x24 : Data signal of out_r
//        bit 31~0 - out_r[31:0] (Read/Write)
// 0x28 : Data signal of out_r
//        bit 31~0 - out_r[63:32] (Read/Write)
// 0x2c : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


C/RTL 協調シミュレーションを行った。
cocotb_axi_35_230615.png

C/RTL 協調シミュレーションの波形を示す。
cocotb_axi_36_230615.png
cocotb_axi_37_230615.png
  1. 2023年06月15日 04:20 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーション2

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーション1”の続き。

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーションしたいということで、前回は、2 乗する AXI4 Lite インターフェースの test_square_axil IP を Vitis HLS 2023.1 で作成した。今回は、前回、高位合成した Verilog HDL ファイルを cocotbext-axi を使って、シミュレーションした。

cocotbext-axi/tests ディレクトリの下に、test_square_axil ディレクトリを作成し、前回、高位合成した Verilog HDL ファイルの test_square_axil.v, test_square_axil_control_s_axi.v, test_square_axil_mul_32s_32s_32_2_1.v をコピーした。

cocotbext-axi の tests ディレクトリのファイルを参考にして、Makefile と test_square_axil.py を作成した。
cocotb_axi_27_230614.png

Makefile を示す。

# Makefile (for test_square)
# 2023/06/08 by marsee

SIM ?= icarus

VERILOG_SOURCES += test_square_axil.v
VERILOG_SOURCES += test_square_axil_control_s_axi.v
VERILOG_SOURCES += test_square_axil_mul_32s_32s_32_2_1.v

TOPLEVEL = test_square_axil
MODULE = test_square_axil

include $(shell cocotb-config --makefiles)/Makefile.sim


test_square_axil.py を示す。

# test_aquare_axil.py
# 2023/06/12 by marsee
# I created the software with reference to cocotbext-axi/tests/axil/test_axil.py.
# https://github.com/alexforencich/cocotbext-axi/blob/master/tests/axil/test_axil.py

import random
import cocotb
from cocotb.clock import Clock
from cocotb.triggers import Timer, RisingEdge

from cocotbext.axi import AxiLiteBus, AxiLiteMaster, AxiLiteRam

class TEST:
    def __init__(self, dut):
        self.dut = dut
        cocotb.start_soon(Clock(dut.ap_clk, 10, units="ns").start())
        self.axil_master = AxiLiteMaster(AxiLiteBus.from_prefix(dut, "s_axi_control"), dut.ap_clk)
    
@cocotb.test()
async def test_square_axil(dut):  
    test = TEST(dut)
    
    dut.ap_rst_n.value = 0; # Reset
    await Timer(30, units='ns')
    dut.ap_rst_n.value = 1; # Normal Operation
    await Timer(30, units='ns')
    
    await test.axil_master.write(0x18, bytearray([0x03, 0x00, 0x00, 0x00]))
    data = await test.axil_master.read(0x18, 1)
    await test.axil_master.write(0x00, bytearray([0x01, 0x00, 0x00, 0x00]))
    
    await Timer(30, units='ns')
    await test.axil_master.read(0x00, 1)
    data = await test.axil_master.read(0x20, 1)
    await Timer(200, units='ns')


なお、test_square_axil.py は、タブを 4 個のスペースに変換してあるので、使用する場合は、スペースをタブに変換する。

更に、トップの Verilog HDL ファイル(test_square_axil.v)の WSTRB のみ、大文字だとテスベンチに接続されないので、小文字の wstrb に置換した。更に VCD ファイルを出力する文を追加した。
test_square_axil.v を示す。

// ==============================================================
// Generated by Vitis HLS v2023.1
// Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
// Copyright 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved.
// ==============================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="test_square_axil_test_square_axil,hls_ip_2023_1,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z020-clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=6.912000,HLS_SYN_LAT=3,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=377,HLS_SYN_LUT=307,HLS_VERSION=2023_1}" *)

module test_square_axil (
        ap_clk,
        ap_rst_n,
        s_axi_control_AWVALID,
        s_axi_control_AWREADY,
        s_axi_control_AWADDR,
        s_axi_control_WVALID,
        s_axi_control_WREADY,
        s_axi_control_WDATA,
        s_axi_control_wstrb,
        s_axi_control_ARVALID,
        s_axi_control_ARREADY,
        s_axi_control_ARADDR,
        s_axi_control_RVALID,
        s_axi_control_RREADY,
        s_axi_control_RDATA,
        s_axi_control_RRESP,
        s_axi_control_BVALID,
        s_axi_control_BREADY,
        s_axi_control_BRESP,
        interrupt
);

parameter    ap_ST_fsm_state1 = 4'd1;
parameter    ap_ST_fsm_state2 = 4'd2;
parameter    ap_ST_fsm_state3 = 4'd4;
parameter    ap_ST_fsm_state4 = 4'd8;
parameter    C_S_AXI_CONTROL_DATA_WIDTH = 32;
parameter    C_S_AXI_CONTROL_ADDR_WIDTH = 6;
parameter    C_S_AXI_DATA_WIDTH = 32;

parameter C_S_AXI_CONTROL_WSTRB_WIDTH = (32 / 8);
parameter C_S_AXI_WSTRB_WIDTH = (32 / 8);

input   ap_clk;
input   ap_rst_n;
input   s_axi_control_AWVALID;
output   s_axi_control_AWREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_AWADDR;
input   s_axi_control_WVALID;
output   s_axi_control_WREADY;
input  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_WDATA;
input  [C_S_AXI_CONTROL_WSTRB_WIDTH - 1:0] s_axi_control_wstrb;
input   s_axi_control_ARVALID;
output   s_axi_control_ARREADY;
input  [C_S_AXI_CONTROL_ADDR_WIDTH - 1:0] s_axi_control_ARADDR;
output   s_axi_control_RVALID;
input   s_axi_control_RREADY;
output  [C_S_AXI_CONTROL_DATA_WIDTH - 1:0] s_axi_control_RDATA;
output  [1:0] s_axi_control_RRESP;
output   s_axi_control_BVALID;
input   s_axi_control_BREADY;
output  [1:0] s_axi_control_BRESP;
output   interrupt;

 reg    ap_rst_n_inv;
wire    ap_start;
reg    ap_done;
reg    ap_idle;
(* fsm_encoding = "none" *) reg   [3:0] ap_CS_fsm;
wire    ap_CS_fsm_state1;
reg    ap_ready;
wire   [31:0] in_r;
reg    out_r_ap_vld;
reg  signed [31:0] in_r_read_reg_51;
wire   [31:0] grp_fu_47_p2;
reg   [31:0] mul_ln10_reg_57;
wire    ap_CS_fsm_state3;
wire    ap_CS_fsm_state4;
wire    ap_CS_fsm_state2;
reg   [3:0] ap_NS_fsm;
reg    ap_ST_fsm_state1_blk;
wire    ap_ST_fsm_state2_blk;
wire    ap_ST_fsm_state3_blk;
wire    ap_ST_fsm_state4_blk;
wire    ap_ce_reg;
wire   [31:0] ap_return;

// power-on initialization
initial begin
#0 ap_CS_fsm = 4'd1;
end

test_square_axil_control_s_axi #(
    .C_S_AXI_ADDR_WIDTH( C_S_AXI_CONTROL_ADDR_WIDTH ),
    .C_S_AXI_DATA_WIDTH( C_S_AXI_CONTROL_DATA_WIDTH ))
control_s_axi_U(
    .AWVALID(s_axi_control_AWVALID),
    .AWREADY(s_axi_control_AWREADY),
    .AWADDR(s_axi_control_AWADDR),
    .WVALID(s_axi_control_WVALID),
    .WREADY(s_axi_control_WREADY),
    .WDATA(s_axi_control_WDATA),
    .WSTRB(s_axi_control_wstrb),
    .ARVALID(s_axi_control_ARVALID),
    .ARREADY(s_axi_control_ARREADY),
    .ARADDR(s_axi_control_ARADDR),
    .RVALID(s_axi_control_RVALID),
    .RREADY(s_axi_control_RREADY),
    .RDATA(s_axi_control_RDATA),
    .RRESP(s_axi_control_RRESP),
    .BVALID(s_axi_control_BVALID),
    .BREADY(s_axi_control_BREADY),
    .BRESP(s_axi_control_BRESP),
    .ACLK(ap_clk),
    .ARESET(ap_rst_n_inv),
    .ACLK_EN(1'b1),
    .ap_start(ap_start),
    .interrupt(interrupt),
    .ap_ready(ap_ready),
    .ap_done(ap_done),
    .ap_idle(ap_idle),
    .ap_return(32'd0),
    .in_r(in_r),
    .out_r(mul_ln10_reg_57),
    .out_r_ap_vld(out_r_ap_vld)
);

test_square_axil_mul_32s_32s_32_2_1 #(
    .ID( 1 ),
    .NUM_STAGE( 2 ),
    .din0_WIDTH( 32 ),
    .din1_WIDTH( 32 ),
    .dout_WIDTH( 32 ))
mul_32s_32s_32_2_1_U1(
    .clk(ap_clk),
    .reset(ap_rst_n_inv),
    .din0(in_r_read_reg_51),
    .din1(in_r_read_reg_51),
    .ce(1'b1),
    .dout(grp_fu_47_p2)
);

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        ap_CS_fsm <= ap_ST_fsm_state1;
    end else begin
        ap_CS_fsm <= ap_NS_fsm;
    end
end

always @ (posedge ap_clk) begin
    if ((1'b1 == ap_CS_fsm_state1)) begin
        in_r_read_reg_51 <= in_r;
    end
end

always @ (posedge ap_clk) begin
    if ((1'b1 == ap_CS_fsm_state3)) begin
        mul_ln10_reg_57 <= grp_fu_47_p2;
    end
end

always @ (*) begin
    if ((ap_start == 1'b0)) begin
        ap_ST_fsm_state1_blk = 1'b1;
    end else begin
        ap_ST_fsm_state1_blk = 1'b0;
    end
end

assign ap_ST_fsm_state2_blk = 1'b0;

assign ap_ST_fsm_state3_blk = 1'b0;

assign ap_ST_fsm_state4_blk = 1'b0;

always @ (*) begin
    if ((1'b1 == ap_CS_fsm_state4)) begin
        ap_done = 1'b1;
    end else begin
        ap_done = 1'b0;
    end
end

always @ (*) begin
    if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b0))) begin
        ap_idle = 1'b1;
    end else begin
        ap_idle = 1'b0;
    end
end

always @ (*) begin
    if ((1'b1 == ap_CS_fsm_state4)) begin
        ap_ready = 1'b1;
    end else begin
        ap_ready = 1'b0;
    end
end

always @ (*) begin
    if ((1'b1 == ap_CS_fsm_state4)) begin
        out_r_ap_vld = 1'b1;
    end else begin
        out_r_ap_vld = 1'b0;
    end
end

always @ (*) begin
    case (ap_CS_fsm)
        ap_ST_fsm_state1 : begin
            if (((1'b1 == ap_CS_fsm_state1) & (ap_start == 1'b1))) begin
                ap_NS_fsm = ap_ST_fsm_state2;
            end else begin
                ap_NS_fsm = ap_ST_fsm_state1;
            end
        end
        ap_ST_fsm_state2 : begin
            ap_NS_fsm = ap_ST_fsm_state3;
        end
        ap_ST_fsm_state3 : begin
            ap_NS_fsm = ap_ST_fsm_state4;
        end
        ap_ST_fsm_state4 : begin
            ap_NS_fsm = ap_ST_fsm_state1;
        end
        default : begin
            ap_NS_fsm = 'bx;
        end
    endcase
end

assign ap_CS_fsm_state1 = ap_CS_fsm[32'd0];

assign ap_CS_fsm_state2 = ap_CS_fsm[32'd1];

assign ap_CS_fsm_state3 = ap_CS_fsm[32'd2];

assign ap_CS_fsm_state4 = ap_CS_fsm[32'd3];

always @ (*) begin
    ap_rst_n_inv = ~ap_rst_n;
end

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_square_axil.vcd");
  $dumpvars (0, test_square_axil);
  #1;
end
`endif

endmodule //test_square_axil


cocotbext-axi/tests/test_square_axil ディレクトリに行って、make を実行した。
Verilog HDL シミュレータは Icarus Verilog を使用した。
make
cocotb_axi_28_230614.png

test_square_axil.vcd が生成された。
cocotb_axi_29_230614.png

gtkwave で test_square_axil.vcd を開く。
test_square_axil の信号を追加して、AXI4 Lite インターフェースの信号を並べ替えた。
cocotb_axi_30_230614.png

in_r の 0x18 番地に 3 を書いて、0x00 番地に 1 を書いて ap_start を 1 にした。
その後、out_r の 0x20 番地を Read すると 9 が読めた。2 乗されているので正常だ。

make 時のログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axil$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axil' に入ります
mkdir -p sim_build
/usr/bin/iverilog -o sim_build/sim.vvp -D COCOTB_SIM=1 -s test_square_axil -f sim_build/cmds.f -g2012   test_square_axil.v test_square_axil_control_s_axi.v test_square_axil_mul_32s_32s_32_2_1.v
rm -f results.xml
MODULE=test_square_axil TESTCASE= TOPLEVEL=test_square_axil TOPLEVEL_LANG=verilog \
         /usr/bin/vvp -M /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb/libs -m libcocotbvpi_icarus   sim_build/sim.vvp 
     -.--ns INFO     gpi                                ..mbed/gpi_embed.cpp:76   in set_program_name_in_venv        Did not detect Python virtual environment. Using system-wide Python interpreter
     -.--ns INFO     gpi                                ../gpi/GpiCommon.cpp:101  in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb                             Running on Icarus Verilog version 10.1 (stable)
     0.00ns INFO     cocotb                             Running tests with cocotb v1.7.0 from /home/masaaki/anaconda3/lib/python3.8/site-packages/cocotb
     0.00ns INFO     cocotb                             Seeding Python random module with 1686682652
     0.00ns INFO     cocotb.regression                  Found test test_square_axil.test_square_axil
     0.00ns INFO     cocotb.regression                  running test_square_axil (1/1)
     0.00ns INFO     ..b.test_square_axil.s_axi_control AXI lite master (write)
     0.00ns INFO     ..b.test_square_axil.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..b.test_square_axil.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..b.test_square_axil.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..b.test_square_axil.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axil.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axil.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axil.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..b.test_square_axil.s_axi_control   Address width: 6 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..b.test_square_axil.s_axi_control AXI lite master signals:
     0.00ns INFO     ..b.test_square_axil.s_axi_control   awaddr width: 6 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   awprot: not present
     0.00ns INFO     ..b.test_square_axil.s_axi_control   awready width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   awvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   wdata width: 32 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   wready width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   wstrb width: 4 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   wvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   bready width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   bresp: not present
     0.00ns INFO     ..b.test_square_axil.s_axi_control   bvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axil.s_axi_control AXI lite master (read)
     0.00ns INFO     ..b.test_square_axil.s_axi_control cocotbext-axi version 0.1.18
     0.00ns INFO     ..b.test_square_axil.s_axi_control Copyright (c) 2020 Alex Forencich
     0.00ns INFO     ..b.test_square_axil.s_axi_control https://github.com/alexforencich/cocotbext-axi
     0.00ns INFO     ..b.test_square_axil.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axil.s_axi_control Reset de-asserted
     0.00ns INFO     ..b.test_square_axil.s_axi_control AXI lite master configuration:
     0.00ns INFO     ..b.test_square_axil.s_axi_control   Address width: 6 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   Byte size: 8 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   Data width: 32 bits (4 bytes)
     0.00ns INFO     ..b.test_square_axil.s_axi_control AXI lite master signals:
     0.00ns INFO     ..b.test_square_axil.s_axi_control   araddr width: 6 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   arprot: not present
     0.00ns INFO     ..b.test_square_axil.s_axi_control   arready width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   arvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   rdata width: 32 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   rready width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control   rresp: not present
     0.00ns INFO     ..b.test_square_axil.s_axi_control   rvalid width: 1 bits
     0.00ns INFO     ..b.test_square_axil.s_axi_control Reset de-asserted
VCD info: dumpfile test_square_axil.vcd opened for output.
    60.00ns INFO     ..b.test_square_axil.s_axi_control Write start addr: 0x00000018 prot: AxiProt.NONSECURE data: 03 00 00 00
    90.00ns INFO     ..b.test_square_axil.s_axi_control Write complete addr: 0x00000018 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
    90.00ns INFO     ..b.test_square_axil.s_axi_control Read start addr: 0x00000018 prot: AxiProt.NONSECURE length: 1
   120.00ns INFO     ..b.test_square_axil.s_axi_control Read complete addr: 0x00000018 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 03
   120.00ns INFO     ..b.test_square_axil.s_axi_control Write start addr: 0x00000000 prot: AxiProt.NONSECURE data: 01 00 00 00
   160.00ns INFO     ..b.test_square_axil.s_axi_control Write complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY length: 4
   190.00ns INFO     ..b.test_square_axil.s_axi_control Read start addr: 0x00000000 prot: AxiProt.NONSECURE length: 1
   210.00ns INFO     ..b.test_square_axil.s_axi_control Read complete addr: 0x00000000 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 0a
   210.00ns INFO     ..b.test_square_axil.s_axi_control Read start addr: 0x00000020 prot: AxiProt.NONSECURE length: 1
   240.00ns INFO     ..b.test_square_axil.s_axi_control Read complete addr: 0x00000020 prot: AxiProt.NONSECURE resp: AxiResp.OKAY data: 09
   440.00ns INFO     cocotb.regression                  test_square_axil passed
   440.00ns INFO     cocotb.regression                  *******************************************************************************************
                                                        ** TEST                               STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        *******************************************************************************************
                                                        ** test_square_axil.test_square_axil   PASS         440.00           0.02      18759.06  **
                                                        *******************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0                     440.00           2.40        183.66  **
                                                        *******************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/Cocotb/cocotbext-axi/tests/test_square_axil' から出ます

  1. 2023年06月14日 04:30 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーション1

cocotbext-axi を使って、Vitis HLS 2023.1 で作成した AXI4 Lite インターフェースの IP をシミュレーションしたいということで、2 乗する AXI4 Lite インターフェースの test_square_axil IP を Vitis HLS 2023.1 で作成した。

Vitis HLS 2023.1 で ZYBO Z7-20 用の test_square_axil プロジェクトを作成した。
cocotb_axi_20_230613.png

ソースコードの test_square_axil.cpp を示す。

// test_axil.cpp
// 2023/06/12 by marsee

#include <stdint.h>

int test_square_axil(uint32_t in, uint32_t *out){
#pragma HLS INTERFACE mode=s_axilite port=out
#pragma HLS INTERFACE mode=s_axilite port=in
#pragma HLS INTERFACE mode=s_axilite port=return
    *out = in * in;

    return(0);
}


テスベンチの test_square_axil_tb.cpp を示す。

// test_square_axil_tb.cpp
// 2023/06/13 by marsee

#include <stdint.h>
#include <iostream>

int test_square_axil(uint32_t in, uint32_t *out);

int main(){
    uint32_t data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    uint32_t result[10];

    for(int i=0; i<10; i++){
        test_square_axil(data[i], &result[i]);
    }

    for(int i=0; i<10; i++){
        std::cout << "data[" << i << "]= " << data[i] <<
                ", result[" << i << "] = " <<
                result[i] << std::endl;
    }

    return(0);
}


C シミュレーションを行った。
cocotb_axi_21_230613.png

C コードの合成を行った。
レイテンシは 3 クロックだった。
cocotb_axi_22_230613.png

solution1/syn/verilog ディレクトリに test_square_axil.v, test_square_axil_control_s_axi.v, test_square_axil_mul_32s_32s_32_2_1.v が生成された。
cocotb_axi_23_230613.png

test_square_axil_control_s_axi.v の Address Info を貼っておく。

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read/COR)
//        bit 7  - auto_restart (Read/Write)
//        bit 9  - interrupt (Read)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0 - enable ap_done interrupt (Read/Write)
//        bit 1 - enable ap_ready interrupt (Read/Write)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0 - ap_done (Read/TOW)
//        bit 1 - ap_ready (Read/TOW)
//        others - reserved
// 0x10 : Data signal of ap_return
//        bit 31~0 - ap_return[31:0] (Read)
// 0x18 : Data signal of in_r
//        bit 31~0 - in_r[31:0] (Read/Write)
// 0x1c : reserved
// 0x20 : Data signal of out_r
//        bit 31~0 - out_r[31:0] (Read)
// 0x24 : Control signal of out_r
//        bit 0  - out_r_ap_vld (Read/COR)
//        others - reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)



C/RTL 強調シミュレーションを行った。
開始間隔は 51 クロックで、レイテンシは 3 クロックだった。
cocotb_axi_24_230613.png

C/RTL 強調シミュレーションの全体波形を示す。
cocotb_axi_25_230613.png

2 * 2 = 4 の時の AXI4 Lite インターフェースのトランザクションを示す。
cocotb_axi_26_230613.png

次回は生成された Verilog HDL ファイルの test_square_axil.v, test_square_axil_control_s_axi.v, test_square_axil_mul_32s_32s_32_2_1.v を cocotbext-axi でシミュレーションしてみよう。
  1. 2023年06月13日 04:02 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を試してみる3(AXI-Stream インターフェース)

cocotbext-axi を試してみる2(AXI インターフェース)”の続き。

cocotbext-axi を試して見たいということで、前回は、AXI インターフェースを試した。今回は、AXI-Stream インターフェースを試してみる。

cocotbext-axi/tests/axi ディレクトリに行った。
Makefile, test_axis.py, test_axis.v の 3 個のファイルがある。

test_axi.v をテキスト・エディタで開く。
axi, axil と同じにポートの宣言しか無い。
endmodule の前に vcd ファイルに出力する記述を追加した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_axis.vcd");
  $dumpvars (0, test_axis);
  #1;
end
`endif


cocotb_axi_17_230611.png

make を行った。
make
cocotb_axi_18_230611.png

test_axis.vcd ファイルが生成されたので、gtkwave で確認した。
gtkwave test_axis.vcd

全体波形を示す。
cocotb_axi_19_230611.png

一部分を拡大した。
cocotb_axi_20_230611.png
  1. 2023年06月11日 04:41 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を試してみる2(AXI インターフェース)

cocotbext-axi を試してみる1(AXI Lite インターフェース)”の続き。

cocotbext-axi を試して見たいということで、前回は、 AXI Lite インターフェースを試した。今回は、AXI インターフェースを試してみる。

cocotbext-axi/tests/axi ディレクトリに行った。
Makefile, test_axi.py, test_axi.v の 3 個のファイルがある。
cocotb_axi_12_230610.png

test_axi.v をテキスト・エディタで開く。
axil と同じにポートの宣言しか無い。
endmodule の前に vcd ファイルに出力する記述を追加した。

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_axi.vcd");
  $dumpvars (0, test_axi);
  #1;
end
`endif


cocotb_axi_11_230610.png

make を行った。
make
成功した。
cocotb_axi_13_230610.png

gtkwave で test_axi.vcd を開いた。
gtkwave test_axi.vcd

波形を示す。なお、信号名は並べ替えた。
cocotb_axi_14_230610.png

AXI Write トランザクションの一部を示す。
cocotb_axi_15_230610.png

AXI Read トランザクションの一部を示す。
cocotb_axi_16_230610.png
  1. 2023年06月10日 04:40 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

cocotbext-axi を試してみる1(AXI Lite インターフェース)

以前 Python で書いたテスベンチでシミュレーションすることができる cocotb を試してみたが、AXI インターフェースを cocotb でシミュレーションできる cocotbext-axi を試してみよう。最初は AXI Lite インターフェースを試してみる。

最初に cocotbext-axi を git clone し、pip で cocotbext-axi をインストールした。
cd /media/masaaki/Ubuntu_Disk/Cocotb
git clone https://github.com/alexforencich/cocotbext-axi.git
pip install cocotbext-axi

cocotb_axi_1_230608.png

cocotbext-axi/tests ディレクトリに axil, axi, axis の example があった。
今回は、その内の axil をやってみる。
cocotb_axi_2_230608.png

axil ディレクトリに入ると Makefile, test_axil.py, test_axil.v の 3 個のファイルがある。
test_axil.v を VCD ファイルを出力する様に変更する。
cocotb_axi_3_230608.png

endmodule の上に

`ifdef COCOTB_SIM
initial begin
  $dumpfile ("test_axil.vcd");
  $dumpvars (0, test_axil);
  #1;
end
`endif


を追加した。
cocotb_axi_4_230608.png

シミュレーションを行うために make を使用する。
make SIM=icarus
エラーになってしまった。
cocotb_axi_5_230608.png

cocotb_test をインストールする必要があるようだ。

cocotb_test をインストールした。
pip install cocotb-test
cocotb_axi_6_230608.png

もう一度、シミュレーションを行うために make を使用する。
make SIM=icarus
今度は成功した。
cocotb_axi_7_230608.png

test_axil.vcd ファイルが生成された。
test_axil.vcd ファイルを gtkwave で確認した。
cocotb_axi_10_230608.png

多くの AXI Lite のトランザクションがあるのが分かる。

AXI Lite インターフェースの Write トランザクションの一例を示す。
cocotb_axi_8_230608.png

AXI Lite インターフェースの Read トランザクションの一例を示す。
cocotb_axi_9_230608.png
  1. 2023年06月09日 04:34 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

KR260 用 ZynqMP-FPGA-Debian11で Vitis で作成したラプラシアン・フィルタを実行する3

KR260 用 ZynqMP-FPGA-Debian11で Vitis で作成したラプラシアン・フィルタを実行する2”の続き。

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-1.0.0 を動作させてみる”で作成した ZynqMP-FPGA-Debian11 上で、”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる”のラプラシアン・フィルタを動作させたいということで、前回は、、ikwzm さんに教えていただいた dtbo-config を使って、デバイス・ツリーをロードした。その後、/sys/class/uio ディレクトリを調べたら uio が増えていた。今回は、cam_dp_ov5642.cpp を書き換えて、make して、実行ファイルを生成した。その後、環境を整えて、実行ファイルを実行したところ、カメラ画像とラプラシアン・フィルタ画像を DisplayPort に表示することができた。

KR260 の Debian11 で ~/examples/kr260_lap ディレクトリの下に cam_dp ディレクトリを作成した。GUI (nautilus) で作成した。

CMakeLists.txt を作成した。CMakeLists.txt のコードに関しては、”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する4”を参照のこと。
kr260_Debian11_31_230606.png

アプリケーション・ソフトウェアの cam_dp_ov5642.cpp を作成した。
kr260_Debian11_32_230606.png

build ディレクトリを作成した。
kr260_Debian11_33_230606.png

build ディレクトリに入って、cmake を実行した。
cmake ..

make を実行した。
make

cam_dp_ov5642 実行ファイルが生成された。

~/examples/kr260_lap2/pl.dtsi に u-dma-buf のエントリを追加した。
kr260_Debian11_46_230608.png

現在の pl.dtsi を貼っておく。

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: XSCT 2022.1
 * Today is: Sun May 14 16:46:28 2023
 */


/dts-v1/;
/plugin/;
/ {
    fragment@0 {
        target = <&fpga_full>;
        overlay0: __overlay__ {
            #address-cells = <2>;
            #size-cells = <2>;
            firmware-name = "kr260_cam_disp.bit.bin";
            resets = <&zynqmp_reset 116>, <&zynqmp_reset 117>, <&zynqmp_reset 118>, <&zynqmp_reset 119>;
        };
    };
    fragment@1 {
        target = <&amba>;
        overlay1: __overlay__ {
            afi0: afi0 {
                compatible = "xlnx,afi-fpga";
                config-afi = < 0 0>, <1 0>, <2 0>, <3 0>, <4 0>, <5 0>, <6 0>, <7 0>, <8 0>, <9 0>, <10 0>, <11 0>, <12 0>, <13 0>, <14 0xa00>, <15 0x000>;
            };
            clocking0: clocking0 {
                #clock-cells = <0>;
                assigned-clock-rates = <99999001>;
                assigned-clocks = <&zynqmp_clk 71>;
                clock-output-names = "fabric_clk";
                clocks = <&zynqmp_clk 71>;
                compatible = "xlnx,fclk";
            };
            clocking1: clocking1 {
                #clock-cells = <0>;
                assigned-clock-rates = <23809286>;
                assigned-clocks = <&zynqmp_clk 72>;
                clock-output-names = "fabric_clk";
                clocks = <&zynqmp_clk 72>;
                compatible = "xlnx,fclk";
            };
            pwm_fan0: pwm-fan {
                compatible = "pwm-fan";
                status = "okay";
                pwms = <&ttc0 2 40000 0>;
            };
            udmabuf4: udmabuf4 {
                compatible = "ikwzm,u-dma-buf";
                device-name = "udmabuf4";
                minor-number = <0>;
                size = <0x02000000>;
            };
        };
    };
    fragment@2 {
        target = <&amba>;
        overlay2: __overlay__ {
            #address-cells = <2>;
            #size-cells = <2>;
            active_frame: gpio@80060000 {
                #gpio-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                gpio-controller ;
                reg = <0x0 0x80060000 0x0 0x10000>;
                xlnx,all-inputs = <0x1>;
                xlnx,all-inputs-2 = <0x0>;
                xlnx,all-outputs = <0x0>;
                xlnx,all-outputs-2 = <0x0>;
                xlnx,dout-default = <0x00000000>;
                xlnx,dout-default-2 = <0x00000000>;
                xlnx,gpio-width = <0x2>;
                xlnx,gpio2-width = <0x20>;
                xlnx,interrupt-present = <0x0>;
                xlnx,is-dual = <0x0>;
                xlnx,tri-default = <0xFFFFFFFF>;
                xlnx,tri-default-2 = <0xFFFFFFFF>;
            };
            misc_clk_0: misc_clk_0 {
                #clock-cells = <0>;
                clock-frequency = <199998000>;
                compatible = "fixed-clock";
            };
            axi_intc_0: interrupt-controller@80000000 {
                #interrupt-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                interrupt-controller ;
                interrupt-names = "irq";
                interrupt-parent = <&gic>;
                interrupts = <0 89 4>;
                reg = <0x0 0x80000000 0x0 0x10000>;
                xlnx,kind-of-intr = <0xfffffffd>;
                xlnx,num-intr-inputs = <0x20>;
            };
            camera_axi_iic_0: i2c@80010000 {
                #address-cells = <1>;
                #size-cells = <0>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80010000 0x0 0x10000>;
            };
            camera_mt9d111_inf_axis_0: mt9d111_inf_axis@80020000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "s_axi_lite_aclk", "m_axis_aclk";
                clocks = <&misc_clk_0>, <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80020000 0x0 0x10000>;
            };
            camera_vflip_dma_write2_0: vflip_dma_write2@80030000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "ap_clk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80030000 0x0 0x10000>;
                xlnx,s-axi-axilites-addr-width = <0x6>;
                xlnx,s-axi-axilites-data-width = <0x20>;
            };
            display_axi_gpio_0: gpio@80040000 {
                #gpio-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                gpio-controller ;
                reg = <0x0 0x80040000 0x0 0x10000>;
                xlnx,all-inputs = <0x0>;
                xlnx,all-inputs-2 = <0x0>;
                xlnx,all-outputs = <0x1>;
                xlnx,all-outputs-2 = <0x0>;
                xlnx,dout-default = <0x00000000>;
                xlnx,dout-default-2 = <0x00000000>;
                xlnx,gpio-width = <0x1>;
                xlnx,gpio2-width = <0x20>;
                xlnx,interrupt-present = <0x0>;
                xlnx,is-dual = <0x0>;
                xlnx,tri-default = <0xFFFFFFFF>;
                xlnx,tri-default-2 = <0xFFFFFFFF>;
            };
            display_disp_dmar_axis_0: disp_dmar_axis@80050000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "ap_clk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80050000 0x0 0x10000>;
                xlnx,s-axi-axilites-addr-width = <0x6>;
                xlnx,s-axi-axilites-data-width = <0x20>;
            };
            lap_filter_axim_1: lap_filter_axim@a0000000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                /*clock-names = "ap_clk";
                clocks = <&misc_clk_0>;*/
                compatible = "generic-uio";
                /*interrupt-names = "interrupt";
                interrupt-parent = <&axi_intc_0>;
                interrupts = <1 2>;*/
                reg = <0x0 0xa0000000 0x0 0x10000>;
                /*xlnx,s-axi-control-addr-width = <0x6>;
                xlnx,s-axi-control-data-width = <0x20>;*/
            };
            zyxclmm_drm {
                compatible = "xlnx,zocl";
                interrupts-extended = <&axi_intc_0 0 4>, <&axi_intc_0 1 4>, <&axi_intc_0 2 4>, <&axi_intc_0 3 4>, <&axi_intc_0 4 4>, <&axi_intc_0 5 4>, <&axi_intc_0 6 4>, <&axi_intc_0 7 4>, <&axi_intc_0 8 4>, <&axi_intc_0 9 4>,
<&axi_intc_0 10 4>, <&axi_intc_0 11 4>, <&axi_intc_0 12 4>, <&axi_intc_0 13 4>, <&axi_intc_0 14 4>,
<&axi_intc_0 15 4>, <&axi_intc_0 16 4>, <&axi_intc_0 17 4>, <&axi_intc_0 18 4>, <&axi_intc_0 19 4>,
<&axi_intc_0 20 4>, <&axi_intc_0 21 4>, <&axi_intc_0 22 4>, <&axi_intc_0 23 4>, <&axi_intc_0 24 4>,
<&axi_intc_0 25 4>, <&axi_intc_0 26 4>, <&axi_intc_0 27 4>, <&axi_intc_0 28 4>, <&axi_intc_0 29 4>,
<&axi_intc_0 30 4>, <&axi_intc_0 31 4 >;
            };

        };
    };
};


デバイス・ツリー・オーバーレイの kr260_lap2 をロードした。
sudo dtbo-config -i --dts pl.dtsi kr260_lap2
sudo chmod 666 /dev/udmabuf*
sudo chmod 666 /dev/uio*


kr260_lap2 ロード時のターミナルの表示を貼っておく。

[ 2626.242446] fpga_manager fpga0: writing kr260_cam_disp.bit.bin to Xilinx ZynqMP FPGA Manager
[ 2628.213587] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/firmware-name
[ 2628.223693] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/resets
[ 2628.233615] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay0
[ 2628.243453] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay1
[ 2628.253285] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/afi0
[ 2628.262772] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/clocking0
[ 2628.272693] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/clocking1
[ 2628.282614] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/pwm_fan0
[ 2628.292448] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/udmabuf4
[ 2628.302284] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay2
[ 2628.312118] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/active_frame
[ 2628.322300] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/misc_clk_0
[ 2628.332308] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/axi_intc_0
[ 2628.342321] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_axi_iic_0
[ 2628.352854] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_mt9d111_inf_axis_0
[ 2628.364164] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_vflip_dma_write2_0
[ 2628.375474] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/display_axi_gpio_0
[ 2628.386179] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/display_disp_dmar_axis_0
[ 2628.397400] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/lap_filter_axim_1
[ 2628.418872] pwm-fan axi:pwm-fan: error -EBUSY: Could not get PWM
[ 2628.424917] pwm-fan: probe of axi:pwm-fan failed with error -16
[ 2628.439545] u-dma-buf udmabuf4: driver version = 4.4.1
[ 2628.444687] u-dma-buf udmabuf4: major number   = 239
[ 2628.449645] u-dma-buf udmabuf4: minor number   = 0
[ 2628.454436] u-dma-buf udmabuf4: phys address   = 0x0000000042200000
[ 2628.460702] u-dma-buf udmabuf4: buffer size    = 33554432
[ 2628.466093] u-dma-buf axi:udmabuf4: driver installed.


AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01


cam_dp_ov5642 を起動した。
./cam_dp_ov5642 -r 2
HD モードで起動した。
DiaplayPort にカメラ画像が表示された。

w コマンドでカメラ画像のファイルを生成した。

f コマンドで、ラプラシアン・フィルタ処理画像にしてから w コマンドで画像を生成した。
この時も DiaplayPort にラプラシアン・フィルタ処理画像が表示された。
kr260_Debian11_50_230608.png

~/examples/kr260_lap2/cam_dp/build ディレクトリの様子を示す。
kr260_Debian11_51_230608.png

カメラ画像の画像ファイルを示す。
なお、画像を表示するために Viewnior をインストールした。sudo apt install viewnior
kr260_Debian11_52_230608.jpg

ラプラシアン・フィルタ画像の画像ファイルを示す。
kr260_Debian11_53_230608.jpg

最後に変更した cam_dp_ov5642.cpp の画像を貼っておく。

// cam_dp_ov5642.cpp (for KR260, Debian11)
// 2018/12/14 by marsee
//
// This software converts the left and right of the camera image to BMP file.
// -b : bmp file name
// -n : Start File Number
// -h : help
//
// 2018/12/20 : completed.
// I am using the SVGA driver register setting of https://github.com/virajkanwade/rk3188_android_kernel/blob/master/drivers/media/video/ov5642.c
// 2018/12/22 : fixed
// 2018/12/30 : ov5642_inf_axis[0] fixed
// 2019/02/06 : for DisplayPort
// 2023/04/23 : kr260_cam_disp vitis platform
// 2023/05/15 : bug fix
// 2023/05/16 : Added support for lap_filter_axim
// 2023/06/05 : Changed uio4 and uio5 for ikwzm's Debian11

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>

#define PIXEL_NUM_OF_BYTES    4
#define NUMBER_OF_WRITE_FRAMES  4

#define SVGA_HORIZONTAL_PIXELS  800
#define SVGA_VERTICAL_LINES     600
#define SVGA_ALL_DISP_ADDRESS   (SVGA_HORIZONTAL_PIXELS * SVGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define SVGA_3_PICTURES         (SVGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define XGA_HORIZONTAL_PIXELS  1024
#define XGA_VERTICAL_LINES     768
#define XGA_ALL_DISP_ADDRESS   (XGA_HORIZONTAL_PIXELS * XGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define XGA_3_PICTURES         (XGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define HD_HORIZONTAL_PIXELS  1920
#define HD_VERTICAL_LINES     1080
#define HD_ALL_DISP_ADDRESS   (HD_HORIZONTAL_PIXELS * HD_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define HD_3_PICTURES         (HD_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution, bool filter_on);

void cam_i2c_init(volatile unsigned *ov5642_axi_iic) {
    ov5642_axi_iic[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
    ov5642_axi_iic[64] = 0x1; // enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
    // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *ov5642_axi_iic, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    ov5642_axi_iic[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    ov5642_axi_iic[66] = (write_addr >> 8) & 0xff;  // address upper byte
    ov5642_axi_iic[66] = write_addr & 0xff;           // address lower byte
    ov5642_axi_iic[66] = 0x200 | (write_data & 0xff);      // data
    cam_i2x_write_sync();
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr);

int main(int argc, char *argv[]){
    int opt;
    int c, help_flag=0;
    char bmp_fn[256] = "bmp_file";
    char  attr[1024];
    unsigned long  phys_addr;
    int file_no = -1;
    int fd1, fd2, fd3, fd4, fd5, fd6, fd10, fd11, fd_lap;
    volatile unsigned int *ov5642_inf_axis, *axi_iic, *disp_dmar_axis, *vflip_dma_write;
    volatile unsigned int *axi_gpio_0, *active_frame_gpio, *lap_filter_axim;
    volatile unsigned int *frame_buffer;
    int active_frame;
    int resolution;
    int all_disp_addr;
    bool filter_on = false;
    
    resolution = 1; // XGA
    while ((opt=getopt(argc, argv, "b:n:h:r:")) != -1){
        switch (opt){
            case 'b':
                strcpy(bmp_fn, optarg);
                break;
            case 'n':
                file_no = atoi(optarg);
                printf("file_no = %d\n", file_no+1);
                break;
            case 'r':
                resolution = atoi(optarg);
                break;
            case 'h':
                help_flag = 1;
                break;
        }
    }
    if(resolution == 0){
        printf("SVGA\n");
    } else if(resolution == 1){
        printf("XGA\n");
    } else {
        printf("HD\n");
    }

    if (help_flag == 1){ // help
        printf("Usage : cam_capture [-b <bmp file name>] [-n <Start File Number>] [-h]\n");
        printf("         -r [0|1|2](0:SVGA, 1:XGA, 2:HD)\n");
        exit(0);
    }
       
    // all_disp_addr
    switch(resolution){
        case 0 :
            all_disp_addr = SVGA_ALL_DISP_ADDRESS;
            break;
        case 1 :
            all_disp_addr = XGA_ALL_DISP_ADDRESS;
            break;
        default : // 2
            all_disp_addr = HD_ALL_DISP_ADDRESS;
            break;
    }
    
    // ov5642_inf_axis-uio IP
    fd1 = open("/dev/uio7", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio7 (ov5642_inf_axis) open error\n");
        exit(-1);
    }
    ov5642_inf_axis = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!ov5642_inf_axis){
        fprintf(stderr, "ov5642_inf_axis mmap error\n");
        exit(-1);
    }
    
    // axi_iic-uio IP
    fd2 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd2 < 1){
        fprintf(stderr, "/dev/uio6 (axi_iic) open error\n");
        exit(-1);
    }
    axi_iic = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
    if (!axi_iic){
        fprintf(stderr, "axi_iic mmap error\n");
        exit(-1);
    }

    // disp_dmar_axis-uio IP
    fd3 = open("/dev/uio10", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd3 < 1){
        fprintf(stderr, "/dev/uio10 (disp_dmar_axis) open error\n");
        exit(-1);
    }
    disp_dmar_axis = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!disp_dmar_axis){
        fprintf(stderr, "disp_dmar_axis mmap error\n");
        exit(-1);
    }

    // vflip_dma_write-uio IP
    fd4 = open("/dev/uio8", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd4 < 1){
        fprintf(stderr, "/dev/uio8 (vflip_dma_write) open error\n");
        exit(-1);
    }
    vflip_dma_write = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd4, 0);
    if (!vflip_dma_write){
        fprintf(stderr, "vflip_dma_write mmap error\n");
        exit(-1);
    }

    // axi_gpio_0-uio IP (init_done output)
    fd5 = open("/dev/uio9", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd5 < 1){
        fprintf(stderr, "/dev/uio9 (axi_gpio_0) open error\n");
        exit(-1);
    }
    axi_gpio_0 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd5, 0);
    if (!axi_gpio_0){
        fprintf(stderr, "axi_gpio_0 mmap error\n");
        exit(-1);
    }

    // active_frame_gpio-uio IP (active_frame input)
    fd6 = open("/dev/uio5", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd6 < 1){
        fprintf(stderr, "/dev/uio5 (active_frame_gpio) open error\n");
        exit(-1);
    }
    active_frame_gpio = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd6, 0);
    if (!active_frame_gpio){
        fprintf(stderr, "active_frame_gpio mmap error\n");
        exit(-1);
    }
    
    // laplacian_fliter-uio IP (active_frame input)
    fd_lap = open("/dev/uio11", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd_lap < 1){
        fprintf(stderr, "/dev/uio11 (lap_filter_axim) open error\n");
        exit(-1);
    }
    lap_filter_axim = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd_lap, 0);
    if (!active_frame_gpio){
        fprintf(stderr, "lap_filter_axim mmap error\n");
        exit(-1);
    }
    
    
    // udmabuf4
    fd10 = open("/dev/udmabuf4", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd10 == -1){
        fprintf(stderr, "/dev/udmabuf4 open error\n");
        exit(-1);
    }
    frame_buffer = (volatile unsigned int *)mmap(NULL, all_disp_addr*NUMBER_OF_WRITE_FRAMES, PROT_READ|PROT_WRITE, MAP_SHARED, fd10, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer4 mmap error\n");
        exit(-1);
    }
    
    // phys_addr of udmabuf4
    fd11 = open("/sys/class/u-dma-buf/udmabuf4/phys_addr", O_RDONLY);
    if (fd11 == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf4/phys_addr open error\n");
        exit(-1);
    }
    read(fd11, attr, 1024);
    sscanf(attr, "%lx", &phys_addr);  
    close(fd11);
    printf("phys_addr = %x\n", (int)phys_addr);
    
    // vflip_dma_write start
    vflip_dma_write[6] = phys_addr; // fb0
    vflip_dma_write[8] = phys_addr+all_disp_addr; // fb1
    vflip_dma_write[10] = phys_addr+2*all_disp_addr; // fb2
    vflip_dma_write[12] = resolution;
    vflip_dma_write[0] = 0x1; // start
    vflip_dma_write[0] = 0x80; // EnableAutoRestart
       
    // CMOS Camera initialize, ov5642
    cam_i2c_init(axi_iic);
    
    cam_reg_set(axi_iic, 0x78); // OV5642 register set

    ov5642_inf_axis[0] = phys_addr; // ov5642 AXI4-Stream Start
    ov5642_inf_axis[1] = 0;
 
     // disp_dmar_axis start
    disp_dmar_axis[4] = phys_addr; // fb0
    disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
    disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
    disp_dmar_axis[10] = resolution;
    axi_gpio_0[0] = 1; // disp_dmar_axis start(init_done = 1)
    
    char bmp_file[256];

    // All 0 set
    int all_disp_frame_index = all_disp_addr/PIXEL_NUM_OF_BYTES*NUMBER_OF_WRITE_FRAMES;
    for (int i=0; i<all_disp_frame_index; i++){
        frame_buffer[i] = 0x0;
    }
    
    // lap_filer_axm initialize
    lap_filter_axim[5] = 0 ; // bit 31~0 - cam_fb[63:32] (Read/Write)
    lap_filter_axim[7] = phys_addr+3*all_disp_addr; // bit 31~0 - lap_fb[31:0] (Read/Write)
    lap_filter_axim[8] = 0; // bit 31~0 - lap_fb[63:32] (Read/Write)
    switch (resolution){
        case 0 : // SVGA
            lap_filter_axim[10] = SVGA_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = SVGA_VERTICAL_LINES;
            break;
        case 1 : // XGA
            lap_filter_axim[10] = XGA_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = XGA_VERTICAL_LINES;
            break;
        default : // HD
            lap_filter_axim[10] = HD_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = HD_VERTICAL_LINES;
            break;
    }

    // w - writed the left and right eye's bmp files.  q - exit.
    c = getc(stdin);
    while(c != 'q'){
        switch ((char)c) {
            case 'w' : // w - writed a bmp files.
                // writed the frame buffer
                file_no++;
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution, filter_on);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'e' : // e - writed a same bmp files.
                // writed the frame buffer
                if (file_no == -1)
                    file_no = 0;
                
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution, filter_on);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'f' : // laplacian_filter on
                filter_on = true;
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                int read_frame;
                if (active_frame == 0)
                    read_frame = 2;
                else if (active_frame == 1)
                    read_frame = 0;
                else // active_frame == 2
                    read_frame = 1;
                lap_filter_axim[4] = phys_addr+read_frame*all_disp_addr;
                lap_filter_axim[0] = 0x81; // ap_start + auto_restart

                disp_dmar_axis[4] = phys_addr+3*all_disp_addr; // fb0
                disp_dmar_axis[6] = phys_addr+3*all_disp_addr; // fb1
                disp_dmar_axis[8] = phys_addr+3*all_disp_addr; // fb2
                break;
            case 'c' : // Display camera image
                filter_on = false;
                lap_filter_axim[0] = 1; // ap_start
                disp_dmar_axis[4] = phys_addr; // fb0
                disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
                disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
                break; 
        }
        c = getc(stdin);
    }
    
    munmap((void *)ov5642_inf_axis, 0x1000);
    munmap((void *)axi_iic, 0x1000);
    munmap((void *)disp_dmar_axis, 0x10000);
    munmap((void *)vflip_dma_write, 0x10000);
    munmap((void *)axi_gpio_0, 0x1000);
    munmap((void *)active_frame_gpio, 0x1000);
    munmap((void *)frame_buffer, all_disp_addr*3);
    
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);
    close(fd6);
    close(fd10);
    
    return(0);
}

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution, bool filter_on){
    int read_frame;
    int img_width, img_height;
    
    if (active_frame == 0)
        read_frame = 2;
    else if (active_frame == 1)
        read_frame = 0;
    else // active_frame == 2
        read_frame = 1;
        
    switch(resolution){
        case 0 :
            img_width = SVGA_HORIZONTAL_PIXELS;
            img_height = SVGA_VERTICAL_LINES;
            break;
        case 1 :
            img_width = XGA_HORIZONTAL_PIXELS;
            img_height = XGA_VERTICAL_LINES;
            break;
        default : // case 2 :
            img_width = HD_HORIZONTAL_PIXELS;
            img_height = HD_VERTICAL_LINES;
            break;
    }
    
    int offset_addr;
    if (filter_on == false){
        offset_addr = read_frame * img_width * img_height;
    }else{
        offset_addr = 3 * img_width * img_height;
    }

    cv::Mat img(img_height, img_width, CV_8UC3);

    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for(int y=0; y<img.rows; y++){
        for(int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            int rgb = frame_buffer[offset_addr+y*img.cols+x];
            pixel[0] = (rgb & 0xff); // blue
            pixel[1] = (rgb & 0xff00) >> 8; // green
            pixel[2] = (rgb & 0xff0000) >> 16; // red
            dst_vec3b(y,x) = pixel;
        }
    }
    
    cv::imwrite(bmp_file, img);
    
    return(0);
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr){
    cam_i2c_write(axi_iic, device_addr, 0x3103, 0x93);
    cam_i2c_write(axi_iic, device_addr, 0x3008, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x3017, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x3018, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc2);
    cam_i2c_write(axi_iic, device_addr, 0x3615, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x5c);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3005, 0xb7);
    cam_i2c_write(axi_iic, device_addr, 0x3006, 0x43);
    cam_i2c_write(axi_iic, device_addr, 0x3007, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3011, 0x08); // 0x08 - 15fps, 0x10 - 30fps
    cam_i2c_write(axi_iic, device_addr, 0x3010, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x460c, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x370c, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3602, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3612, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x3634, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3613, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3622, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3604, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0xa7);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x4000, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x401d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3600, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3606, 0x3f);
    cam_i2c_write(axi_iic, device_addr, 0x3c01, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x5020, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x79);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x0a);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5080, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x300e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x4610, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x471d, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x4708, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x3710, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3632, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3631, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61); // RGB565
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x73);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3824, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0xc1);
    cam_i2c_write(axi_iic, device_addr, 0x3705, 0xdb);
    cam_i2c_write(axi_iic, device_addr, 0x370a, 0x81);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3827, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a1a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a13, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a18, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a19, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x350c, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x350d, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3500, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3030, 0x0b);
    cam_i2c_write(axi_iic, device_addr, 0x3a02, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a03, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a04, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a14, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a15, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a16, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0x98);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x589b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x589a, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x4e);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x538a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538b, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x538c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538d, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538f, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xab);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x65);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x71);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x87);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x91);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x9a);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0xaa);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xcd);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xdd);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xea);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x86);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0x5b);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0x3b);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xed);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0xa5);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x3406, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04); // 0x04
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8); // 0xf8
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0xbd);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x68);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x02); // 0x02
    cam_i2c_write(axi_iic, device_addr, 0x3633, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0xb2);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x370b, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x3c00, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xFF);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5503, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0xE1);
    cam_i2c_write(axi_iic, device_addr, 0x538A, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538B, 0x2B);
    cam_i2c_write(axi_iic, device_addr, 0x538C, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538D, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538E, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538F, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xB3);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xA6);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x49);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x56);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x76);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x88);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0x96);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xcc);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0xee);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0xd8);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xb3);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0x90);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b1, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54b2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b3, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b4, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54b5, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x54b6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b7, 0xdf);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5587, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5588, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x558a, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x5589, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0xcf);
    cam_i2c_write(axi_iic, device_addr, 0x5800, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5801, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x5802, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5803, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5804, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5805, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5806, 0x29);
    cam_i2c_write(axi_iic, device_addr, 0x5807, 0x38);
    cam_i2c_write(axi_iic, device_addr, 0x5808, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x5809, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x580a, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x580b, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580c, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x580d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580e, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x580f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5810, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5811, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5812, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x5813, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5814, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5815, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5816, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5817, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5818, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5819, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x581a, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x581b, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581c, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581d, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x581e, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x581f, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5820, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x5821, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5822, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5823, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5824, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5825, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x5826, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x5827, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5828, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5829, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x582a, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x582b, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582c, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x582d, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582e, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x582f, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5830, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5831, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5832, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5833, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5834, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5835, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5836, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5837, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5838, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x5839, 0x39);
    cam_i2c_write(axi_iic, device_addr, 0x583a, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x583b, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x583c, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x583d, 0x23);
    cam_i2c_write(axi_iic, device_addr, 0x583e, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x583f, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x5840, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5841, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5842, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5843, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5844, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5845, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5846, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5847, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5848, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5849, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584a, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584b, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x584c, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584e, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x584f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5850, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5851, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5852, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5853, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5854, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5855, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5856, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5857, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5858, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5859, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x585a, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585b, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585c, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585d, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x585e, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x585f, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5860, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5861, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5862, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5863, 0x7);
    cam_i2c_write(axi_iic, device_addr, 0x5864, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5865, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5866, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5867, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5868, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5869, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x586a, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x586b, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x586c, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586d, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x586f, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5870, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5871, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5872, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5873, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5874, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x5875, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5876, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5877, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5878, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5879, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x587a, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x587b, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x587c, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587d, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587e, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x587f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5880, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5881, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5882, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5883, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5884, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5885, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5886, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5887, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5180, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0x9c);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x34);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x4c);
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5196, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5198, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5199, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x519a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x519b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x519c, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x519d, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x519e, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3800, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3802, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0x58);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0x81); // No Mirror
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xa7);
    
    cam_i2c_write(axi_iic, device_addr, 0x4740, 0x21);
    
    cam_i2c_write(axi_iic, device_addr, 0x501e, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5002, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61);
    
    return(0);
}

  1. 2023年06月08日 04:53 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 の Debian11 上で memread, memwrite を生成した

KR260 の Petalinux 2022.1 上で memread と memwrite を生成した”を参考に、KR260 の Debian11 上で memread, memwrite を生成した。

KR260 の Debian11 上で examples ディレクトリの下に mem ディレクトリを新規作成した。
cd examples
mkdir mem
cd mem


mem ディレクトリに C ソースコードを作成した。
kr260_Debian11_47_230608.png

memread.c と memwrite.c のソースコードは”KR260 の Petalinux 2022.1 上で memread と memwrite を生成した”を参照のこと。

memread.c と memwrite.c を gcc でコンパイルした。
成功した。
gcc -o memread memread.c
gcc -o memwrite memwrite.c

memread と memwrite 実行ファイルが生成された。
kr260_Debian11_48_230608.png

memread と memwrite 実行ファイルを実行してみた。
問題ないようだ。
fpga@debian-fpga:~/examples/mem$ sudo ./memread fd4ab070
00000057
fpga@debian-fpga:~/examples/mem$ sudo ./memwrite fd4ab070 54
fpga@debian-fpga:~/examples/mem$ sudo ./memread fd4ab070
00000054
fpga@debian-fpga:~/examples/mem$ sudo ./memwrite fd4ab070 57
fpga@debian-fpga:~/examples/mem$ sudo ./memread fd4ab070
00000057
kr260_Debian11_49_230608.png
  1. 2023年06月08日 04:18 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 の Debian11 に OpenCV 3.4.16 をインストールした

ラプラシアン・フィルタの実行ファイル cam_dp_ov5642 の実行には、OpenCV が必要だったということで、”ZYBO Z7-20 の PYNQ 2.7 に OpenCV 3.4.16 をインストールする1”と”ZYBO Z7-20 の PYNQ 2.7 に OpenCV 3.4.16 をインストールする2”を参考に、OpenCV 3.4.16 をインストールした。

KR260 の Debian11 を起動した。
ホーム・ディレクトリで OpenCV 3.4.16 を wget して、opencv ディレクトリを作成し、名前を 3.4.16.zip から opencv-3.4.16.zip に変更しながら、移動した。
wget https://github.com/opencv/opencv/archive/3.4.16.zip
mkdir opencv
mv 3.4.16.zip opencv/opencv-3.4.16.zip
cd opencv/


opencv_contrib を wget して、名前を 3.4.16.zip から opencv_contrib-3.4.16.zip に変更した。
wget https://github.com/opencv/opencv_contrib/archive/3.4.16.zip
mv 3.4.16.zip opencv_contrib-3.4.16.zip


opencv-3.4.16.zip を解凍し、 opencv-3.4.16 ディレクトリを opencv ディレクトリとしてシンボリック・リンクする。
opencv_contrib-3.4.16.zip を解凍し、opencv_contrib-3.4.16 ディレクトリを opencv_contrib ディレクトリとしてシンボリック・リンクする。
環境変数の設定を行った。
unzip -q opencv-3.4.16.zip
ln -s opencv-3.4.16 opencv
unzip -q opencv_contrib-3.4.16.zip
ln -s opencv_contrib-3.4.16 opencv_contrib
export CC=gcc
export CXX=g++


build ディレクトリを作成し、 build ディレクトリに cd した。
cmake を実行した。
mkdir build
cd build
cmake -S /home/fpga/opencv/opencv-3.4.16 -B /home/fpga/opencv/build -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=OFF -D WITH_VTK=OFF -D INSTALL_C_EXAMPLES=ON -D PYTHON3_EXECUTABLE=/usr/bin/python3.8 -D PYTHON_INCLUDE_DIR=/usr/include/python3.8 -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D ENABLE_FAST_MATH=1 -D WITH_CUDA=OFF -D WITH_FFMPEG=OFF

kr260_Debian11_34_230606.png
kr260_Debian11_35_230606.png

make を行って、成功した。
make -j4
kr260_Debian11_36_230606.png

sudo make install
kr260_Debian11_37_230606.png

sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

kr260_Debian11_38_230606.png

OpenCV の動作を見てみよう。
opencv/opencv-3.4.16/samples/python ディレクトリに入った。
demo.py を起動したところ、”ModuleNotFoundError: No module named 'cv2'”と言われてしまった。
cd ~/opencv/opencv-3.4.16/samples/python
python3 demo.py

kr260_Debian11_39_230606.png

pip3 で opencv-python をインストールした。
pip3 install opencv-python
kr260_Debian11_40_230606.png

demo.py を起動したところ、”ModuleNotFoundError: No module named 'Tkinter'”と言われてしまった。
python3 demo.py
kr260_Debian11_41_230606.png

python3-tk をインストールした。
sudo apt-get install python3-tk
kr260_Debian11_42_230606.png

demo.py を起動した。
python3 demo.py

OpenCV Demo ダイアログが表示された。
asift を選択して、Run ボタンをクリックした。
kr260_Debian11_43_230606.png

asift の結果のダイアログが表示された。
kr260_Debian11_44_230606.png
kr260_Debian11_45_230606.jpg

おまけで matplotlib をインストールした。
pip3 install matplotlib

最後に cmake のログを貼っておく。

fpga@debian-fpga:~/opencv/build$ cmake -S /home/fpga/opencv/opencv-3.4.16 -B /home/fpga/opencv/build -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=OFF -D WITH_VTK=OFF -D INSTALL_C_EXAMPLES=ON -D PYTHON3_EXECUTABLE=/usr/bin/python3.8 -D PYTHON_INCLUDE_DIR=/usr/include/python3.8 -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D ENABLE_FAST_MATH=1 -D WITH_CUDA=OFF -D WITH_FFMPEG=OFF
-- The CXX compiler identification is GNU 10.2.1
-- The C compiler identification is GNU 10.2.1
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detected processor: aarch64
-- Performing Test HAVE_CXX11 (check file: cmake/checks/cxx11.cpp)
-- Performing Test HAVE_CXX11 - Success
-- Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE) (Required is at least version "2.7")
-- Found PythonInterp: /usr/bin/python3.8 (Required is at least version "3.2") 
-- Looking for ccache - not found
-- Performing Test HAVE_CXX_FSIGNED_CHAR
-- Performing Test HAVE_CXX_FSIGNED_CHAR - Success
-- Performing Test HAVE_C_FSIGNED_CHAR
-- Performing Test HAVE_C_FSIGNED_CHAR - Success
-- Performing Test HAVE_CXX_FFAST_MATH
-- Performing Test HAVE_CXX_FFAST_MATH - Success
-- Performing Test HAVE_C_FFAST_MATH
-- Performing Test HAVE_C_FFAST_MATH - Success
-- Performing Test HAVE_CXX_W
-- Performing Test HAVE_CXX_W - Success
-- Performing Test HAVE_C_W
-- Performing Test HAVE_C_W - Success
-- Performing Test HAVE_CXX_WALL
-- Performing Test HAVE_CXX_WALL - Success
-- Performing Test HAVE_C_WALL
-- Performing Test HAVE_C_WALL - Success
-- Performing Test HAVE_CXX_WERROR_RETURN_TYPE
-- Performing Test HAVE_CXX_WERROR_RETURN_TYPE - Success
-- Performing Test HAVE_C_WERROR_RETURN_TYPE
-- Performing Test HAVE_C_WERROR_RETURN_TYPE - Success
-- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR
-- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR - Success
-- Performing Test HAVE_C_WERROR_NON_VIRTUAL_DTOR
-- Performing Test HAVE_C_WERROR_NON_VIRTUAL_DTOR - Failed
-- Performing Test HAVE_CXX_WERROR_ADDRESS
-- Performing Test HAVE_CXX_WERROR_ADDRESS - Success
-- Performing Test HAVE_C_WERROR_ADDRESS
-- Performing Test HAVE_C_WERROR_ADDRESS - Success
-- Performing Test HAVE_CXX_WERROR_SEQUENCE_POINT
-- Performing Test HAVE_CXX_WERROR_SEQUENCE_POINT - Success
-- Performing Test HAVE_C_WERROR_SEQUENCE_POINT
-- Performing Test HAVE_C_WERROR_SEQUENCE_POINT - Success
-- Performing Test HAVE_CXX_WFORMAT
-- Performing Test HAVE_CXX_WFORMAT - Success
-- Performing Test HAVE_C_WFORMAT
-- Performing Test HAVE_C_WFORMAT - Success
-- Performing Test HAVE_CXX_WERROR_FORMAT_SECURITY
-- Performing Test HAVE_CXX_WERROR_FORMAT_SECURITY - Success
-- Performing Test HAVE_C_WERROR_FORMAT_SECURITY
-- Performing Test HAVE_C_WERROR_FORMAT_SECURITY - Success
-- Performing Test HAVE_CXX_WMISSING_DECLARATIONS
-- Performing Test HAVE_CXX_WMISSING_DECLARATIONS - Success
-- Performing Test HAVE_C_WMISSING_DECLARATIONS
-- Performing Test HAVE_C_WMISSING_DECLARATIONS - Success
-- Performing Test HAVE_CXX_WMISSING_PROTOTYPES
-- Performing Test HAVE_CXX_WMISSING_PROTOTYPES - Failed
-- Performing Test HAVE_C_WMISSING_PROTOTYPES
-- Performing Test HAVE_C_WMISSING_PROTOTYPES - Success
-- Performing Test HAVE_CXX_WSTRICT_PROTOTYPES
-- Performing Test HAVE_CXX_WSTRICT_PROTOTYPES - Failed
-- Performing Test HAVE_C_WSTRICT_PROTOTYPES
-- Performing Test HAVE_C_WSTRICT_PROTOTYPES - Success
-- Performing Test HAVE_CXX_WUNDEF
-- Performing Test HAVE_CXX_WUNDEF - Success
-- Performing Test HAVE_C_WUNDEF
-- Performing Test HAVE_C_WUNDEF - Success
-- Performing Test HAVE_CXX_WINIT_SELF
-- Performing Test HAVE_CXX_WINIT_SELF - Success
-- Performing Test HAVE_C_WINIT_SELF
-- Performing Test HAVE_C_WINIT_SELF - Success
-- Performing Test HAVE_CXX_WPOINTER_ARITH
-- Performing Test HAVE_CXX_WPOINTER_ARITH - Success
-- Performing Test HAVE_C_WPOINTER_ARITH
-- Performing Test HAVE_C_WPOINTER_ARITH - Success
-- Performing Test HAVE_CXX_WSHADOW
-- Performing Test HAVE_CXX_WSHADOW - Success
-- Performing Test HAVE_C_WSHADOW
-- Performing Test HAVE_C_WSHADOW - Success
-- Performing Test HAVE_CXX_WSIGN_PROMO
-- Performing Test HAVE_CXX_WSIGN_PROMO - Success
-- Performing Test HAVE_C_WSIGN_PROMO
-- Performing Test HAVE_C_WSIGN_PROMO - Failed
-- Performing Test HAVE_CXX_WUNINITIALIZED
-- Performing Test HAVE_CXX_WUNINITIALIZED - Success
-- Performing Test HAVE_C_WUNINITIALIZED
-- Performing Test HAVE_C_WUNINITIALIZED - Success
-- Performing Test HAVE_CXX_WSUGGEST_OVERRIDE
-- Performing Test HAVE_CXX_WSUGGEST_OVERRIDE - Success
-- Performing Test HAVE_C_WSUGGEST_OVERRIDE
-- Performing Test HAVE_C_WSUGGEST_OVERRIDE - Failed
-- Performing Test HAVE_CXX_WNO_DELETE_NON_VIRTUAL_DTOR
-- Performing Test HAVE_CXX_WNO_DELETE_NON_VIRTUAL_DTOR - Success
-- Performing Test HAVE_C_WNO_DELETE_NON_VIRTUAL_DTOR
-- Performing Test HAVE_C_WNO_DELETE_NON_VIRTUAL_DTOR - Failed
-- Performing Test HAVE_CXX_WNO_UNNAMED_TYPE_TEMPLATE_ARGS
-- Performing Test HAVE_CXX_WNO_UNNAMED_TYPE_TEMPLATE_ARGS - Failed
-- Performing Test HAVE_C_WNO_UNNAMED_TYPE_TEMPLATE_ARGS
-- Performing Test HAVE_C_WNO_UNNAMED_TYPE_TEMPLATE_ARGS - Failed
-- Performing Test HAVE_CXX_WNO_COMMENT
-- Performing Test HAVE_CXX_WNO_COMMENT - Success
-- Performing Test HAVE_C_WNO_COMMENT
-- Performing Test HAVE_C_WNO_COMMENT - Success
-- Performing Test HAVE_CXX_WIMPLICIT_FALLTHROUGH_3
-- Performing Test HAVE_CXX_WIMPLICIT_FALLTHROUGH_3 - Success
-- Performing Test HAVE_C_WIMPLICIT_FALLTHROUGH_3
-- Performing Test HAVE_C_WIMPLICIT_FALLTHROUGH_3 - Success
-- Performing Test HAVE_CXX_WNO_STRICT_OVERFLOW
-- Performing Test HAVE_CXX_WNO_STRICT_OVERFLOW - Success
-- Performing Test HAVE_C_WNO_STRICT_OVERFLOW
-- Performing Test HAVE_C_WNO_STRICT_OVERFLOW - Success
-- Performing Test HAVE_CXX_FDIAGNOSTICS_SHOW_OPTION
-- Performing Test HAVE_CXX_FDIAGNOSTICS_SHOW_OPTION - Success
-- Performing Test HAVE_C_FDIAGNOSTICS_SHOW_OPTION
-- Performing Test HAVE_C_FDIAGNOSTICS_SHOW_OPTION - Success
-- Performing Test HAVE_CXX_PTHREAD
-- Performing Test HAVE_CXX_PTHREAD - Success
-- Performing Test HAVE_C_PTHREAD
-- Performing Test HAVE_C_PTHREAD - Success
-- Performing Test HAVE_CXX_FOMIT_FRAME_POINTER
-- Performing Test HAVE_CXX_FOMIT_FRAME_POINTER - Success
-- Performing Test HAVE_C_FOMIT_FRAME_POINTER
-- Performing Test HAVE_C_FOMIT_FRAME_POINTER - Success
-- Performing Test HAVE_CXX_FFUNCTION_SECTIONS
-- Performing Test HAVE_CXX_FFUNCTION_SECTIONS - Success
-- Performing Test HAVE_C_FFUNCTION_SECTIONS
-- Performing Test HAVE_C_FFUNCTION_SECTIONS - Success
-- Performing Test HAVE_CXX_FDATA_SECTIONS
-- Performing Test HAVE_CXX_FDATA_SECTIONS - Success
-- Performing Test HAVE_C_FDATA_SECTIONS
-- Performing Test HAVE_C_FDATA_SECTIONS - Success
-- Performing Test HAVE_CPU_NEON_SUPPORT (check file: cmake/checks/cpu_neon.cpp)
-- Performing Test HAVE_CPU_NEON_SUPPORT - Success
-- Performing Test HAVE_CPU_FP16_SUPPORT (check file: cmake/checks/cpu_fp16.cpp)
-- Performing Test HAVE_CPU_FP16_SUPPORT - Success
-- Performing Test HAVE_CPU_BASELINE_FLAGS
-- Performing Test HAVE_CPU_BASELINE_FLAGS - Success
-- Performing Test HAVE_CXX_FVISIBILITY_HIDDEN
-- Performing Test HAVE_CXX_FVISIBILITY_HIDDEN - Success
-- Performing Test HAVE_C_FVISIBILITY_HIDDEN
-- Performing Test HAVE_C_FVISIBILITY_HIDDEN - Success
-- Performing Test HAVE_CXX_FVISIBILITY_INLINES_HIDDEN
-- Performing Test HAVE_CXX_FVISIBILITY_INLINES_HIDDEN - Success
-- Performing Test HAVE_C_FVISIBILITY_INLINES_HIDDEN
-- Performing Test HAVE_C_FVISIBILITY_INLINES_HIDDEN - Failed
-- Performing Test HAVE_LINK_AS_NEEDED
-- Performing Test HAVE_LINK_AS_NEEDED - Success
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for posix_memalign
-- Looking for posix_memalign - found
-- Looking for malloc.h
-- Looking for malloc.h - found
-- Looking for memalign
-- Looking for memalign - found
-- Check if the system is big endian
-- Searching 16 bit integer
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of unsigned short
-- Check size of unsigned short - done
-- Searching 16 bit integer - Using unsigned short
-- Check if the system is big endian - little endian
-- Found ZLIB: /usr/lib/aarch64-linux-gnu/libz.so (found suitable version "1.2.11", minimum required is "1.2.3") 
-- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR) 
-- Performing Test HAVE_C_WNO_UNUSED_PARAMETER
-- Performing Test HAVE_C_WNO_UNUSED_PARAMETER - Success
-- Performing Test HAVE_C_WNO_SIGN_COMPARE
-- Performing Test HAVE_C_WNO_SIGN_COMPARE - Success
-- Performing Test HAVE_C_WNO_SHORTEN_64_TO_32
-- Performing Test HAVE_C_WNO_SHORTEN_64_TO_32 - Failed
-- Performing Test HAVE_C_WNO_IMPLICIT_FALLTHROUGH
-- Performing Test HAVE_C_WNO_IMPLICIT_FALLTHROUGH - Success
-- libjpeg-turbo: VERSION = 2.1.0, BUILD = opencv-3.4.16-libjpeg-turbo
-- Check size of size_t
-- Check size of size_t - done
-- Check size of unsigned long
-- Check size of unsigned long - done
-- Performing Test HAVE_BUILTIN_CTZL
-- Performing Test HAVE_BUILTIN_CTZL - Success
-- Looking for include file locale.h
-- Looking for include file locale.h - found
-- Looking for include file stdlib.h
-- Looking for include file stdlib.h - found
-- Looking for include file sys/types.h
-- Looking for include file sys/types.h - found
-- Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR) 
-- Looking for assert.h
-- Looking for assert.h - found
-- Looking for dlfcn.h
-- Looking for dlfcn.h - found
-- Looking for fcntl.h
-- Looking for fcntl.h - found
-- Looking for inttypes.h
-- Looking for inttypes.h - found
-- Looking for io.h
-- Looking for io.h - not found
-- Looking for limits.h
-- Looking for limits.h - found
-- Looking for memory.h
-- Looking for memory.h - found
-- Looking for search.h
-- Looking for search.h - found
-- Looking for string.h
-- Looking for string.h - found
-- Looking for strings.h
-- Looking for strings.h - found
-- Looking for sys/time.h
-- Looking for sys/time.h - found
-- Looking for unistd.h
-- Looking for unistd.h - found
-- Performing Test C_HAS_inline
-- Performing Test C_HAS_inline - Success
-- Check size of signed short
-- Check size of signed short - done
-- Check size of unsigned short
-- Check size of unsigned short - done
-- Check size of signed int
-- Check size of signed int - done
-- Check size of unsigned int
-- Check size of unsigned int - done
-- Check size of signed long
-- Check size of signed long - done
-- Check size of signed long long
-- Check size of signed long long - done
-- Check size of unsigned long long
-- Check size of unsigned long long - done
-- Check size of unsigned char *
-- Check size of unsigned char * - done
-- Check size of ptrdiff_t
-- Check size of ptrdiff_t - done
-- Check size of INT8
-- Check size of INT8 - failed
-- Check size of INT16
-- Check size of INT16 - failed
-- Check size of INT32
-- Check size of INT32 - failed
-- Looking for floor
-- Looking for floor - found
-- Looking for pow
-- Looking for pow - found
-- Looking for sqrt
-- Looking for sqrt - found
-- Looking for isascii
-- Looking for isascii - found
-- Looking for memset
-- Looking for memset - found
-- Looking for mmap
-- Looking for mmap - found
-- Looking for getopt
-- Looking for getopt - found
-- Looking for memmove
-- Looking for memmove - found
-- Looking for setmode
-- Looking for setmode - not found
-- Looking for strcasecmp
-- Looking for strcasecmp - found
-- Looking for strchr
-- Looking for strchr - found
-- Looking for strrchr
-- Looking for strrchr - found
-- Looking for strstr
-- Looking for strstr - found
-- Looking for strtol
-- Looking for strtol - found
-- Looking for strtol
-- Looking for strtol - found
-- Looking for strtoull
-- Looking for strtoull - found
-- Looking for lfind
-- Looking for lfind - found
-- Performing Test HAVE_SNPRINTF
-- Performing Test HAVE_SNPRINTF - Success
-- Check if the system is big endian
-- Searching 16 bit integer
-- Searching 16 bit integer - Using unsigned short
-- Check if the system is big endian - little endian
-- Performing Test HAVE_C_WNO_UNUSED_BUT_SET_VARIABLE
-- Performing Test HAVE_C_WNO_UNUSED_BUT_SET_VARIABLE - Success
-- Performing Test HAVE_C_WNO_MISSING_PROTOTYPES
-- Performing Test HAVE_C_WNO_MISSING_PROTOTYPES - Success
-- Performing Test HAVE_C_WNO_MISSING_DECLARATIONS
-- Performing Test HAVE_C_WNO_MISSING_DECLARATIONS - Success
-- Performing Test HAVE_C_WNO_UNDEF
-- Performing Test HAVE_C_WNO_UNDEF - Success
-- Performing Test HAVE_C_WNO_UNUSED
-- Performing Test HAVE_C_WNO_UNUSED - Success
-- Performing Test HAVE_C_WNO_CAST_ALIGN
-- Performing Test HAVE_C_WNO_CAST_ALIGN - Success
-- Performing Test HAVE_C_WNO_SHADOW
-- Performing Test HAVE_C_WNO_SHADOW - Success
-- Performing Test HAVE_C_WNO_MAYBE_UNINITIALIZED
-- Performing Test HAVE_C_WNO_MAYBE_UNINITIALIZED - Success
-- Performing Test HAVE_C_WNO_POINTER_TO_INT_CAST
-- Performing Test HAVE_C_WNO_POINTER_TO_INT_CAST - Success
-- Performing Test HAVE_C_WNO_INT_TO_POINTER_CAST
-- Performing Test HAVE_C_WNO_INT_TO_POINTER_CAST - Success
-- Performing Test HAVE_C_WNO_MISLEADING_INDENTATION
-- Performing Test HAVE_C_WNO_MISLEADING_INDENTATION - Success
-- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS
-- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS - Success
-- Performing Test HAVE_CXX_WNO_UNUSED_PARAMETER
-- Performing Test HAVE_CXX_WNO_UNUSED_PARAMETER - Success
-- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES
-- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES - Failed
-- Performing Test HAVE_CXX_WNO_UNDEF
-- Performing Test HAVE_CXX_WNO_UNDEF - Success
-- Performing Test HAVE_C_STD_C99
-- Performing Test HAVE_C_STD_C99 - Success
-- Performing Test HAVE_C_WNO_UNUSED_VARIABLE
-- Performing Test HAVE_C_WNO_UNUSED_VARIABLE - Success
-- Performing Test HAVE_C_WNO_UNUSED_FUNCTION
-- Performing Test HAVE_C_WNO_UNUSED_FUNCTION - Success
-- Found JPEG: libjpeg-turbo  
-- Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR) 
-- Performing Test HAVE_C_WNO_IMPLICIT_FUNCTION_DECLARATION
-- Performing Test HAVE_C_WNO_IMPLICIT_FUNCTION_DECLARATION - Success
-- Performing Test HAVE_C_WNO_UNINITIALIZED
-- Performing Test HAVE_C_WNO_UNINITIALIZED - Success
-- Performing Test HAVE_C_WNO_UNUSED_BUT_SET_PARAMETER
-- Performing Test HAVE_C_WNO_UNUSED_BUT_SET_PARAMETER - Success
-- Performing Test HAVE_C_WNO_POINTER_COMPARE
-- Performing Test HAVE_C_WNO_POINTER_COMPARE - Success
-- Performing Test HAVE_C_WNO_ABSOLUTE_VALUE
-- Performing Test HAVE_C_WNO_ABSOLUTE_VALUE - Success
-- Performing Test HAVE_C_WNO_STRICT_PROTOTYPES
-- Performing Test HAVE_C_WNO_STRICT_PROTOTYPES - Success
-- Found ZLIB: /usr/lib/aarch64-linux-gnu/libz.so (found version "1.2.11") 
-- Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) 
-- Looking for semaphore.h
-- Looking for semaphore.h - found
-- Performing Test HAVE_CXX_WNO_SHADOW
-- Performing Test HAVE_CXX_WNO_SHADOW - Success
-- Performing Test HAVE_CXX_WNO_UNUSED
-- Performing Test HAVE_CXX_WNO_UNUSED - Success
-- Performing Test HAVE_CXX_WNO_SIGN_COMPARE
-- Performing Test HAVE_CXX_WNO_SIGN_COMPARE - Success
-- Performing Test HAVE_CXX_WNO_UNINITIALIZED
-- Performing Test HAVE_CXX_WNO_UNINITIALIZED - Success
-- Performing Test HAVE_CXX_WNO_SWITCH
-- Performing Test HAVE_CXX_WNO_SWITCH - Success
-- Performing Test HAVE_CXX_WNO_PARENTHESES
-- Performing Test HAVE_CXX_WNO_PARENTHESES - Success
-- Performing Test HAVE_CXX_WNO_ARRAY_BOUNDS
-- Performing Test HAVE_CXX_WNO_ARRAY_BOUNDS - Success
-- Performing Test HAVE_CXX_WNO_EXTRA
-- Performing Test HAVE_CXX_WNO_EXTRA - Success
-- Performing Test HAVE_CXX_WNO_DEPRECATED_DECLARATIONS
-- Performing Test HAVE_CXX_WNO_DEPRECATED_DECLARATIONS - Success
-- Performing Test HAVE_CXX_WNO_MISLEADING_INDENTATION
-- Performing Test HAVE_CXX_WNO_MISLEADING_INDENTATION - Success
-- Performing Test HAVE_CXX_WNO_DEPRECATED
-- Performing Test HAVE_CXX_WNO_DEPRECATED - Success
-- Performing Test HAVE_CXX_WNO_SUGGEST_OVERRIDE
-- Performing Test HAVE_CXX_WNO_SUGGEST_OVERRIDE - Success
-- Performing Test HAVE_CXX_WNO_INCONSISTENT_MISSING_OVERRIDE
-- Performing Test HAVE_CXX_WNO_INCONSISTENT_MISSING_OVERRIDE - Failed
-- Performing Test HAVE_CXX_WNO_IMPLICIT_FALLTHROUGH
-- Performing Test HAVE_CXX_WNO_IMPLICIT_FALLTHROUGH - Success
-- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_COMPARE
-- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_COMPARE - Success
-- Performing Test HAVE_CXX_WNO_REORDER
-- Performing Test HAVE_CXX_WNO_REORDER - Success
-- Performing Test HAVE_CXX_WNO_UNUSED_RESULT
-- Performing Test HAVE_CXX_WNO_UNUSED_RESULT - Success
-- Performing Test HAVE_CXX_WNO_CLASS_MEMACCESS
-- Performing Test HAVE_CXX_WNO_CLASS_MEMACCESS - Success
-- Checking for module 'gtk+-3.0'
--   No package 'gtk+-3.0' found
-- Checking for module 'gtk+-2.0'
--   No package 'gtk+-2.0' found
-- Checking for module 'gthread-2.0'
--   No package 'gthread-2.0' found
-- Checking for modules 'gstreamer-base-1.0;gstreamer-video-1.0;gstreamer-app-1.0;gstreamer-riff-1.0;gstreamer-pbutils-1.0'
--   No package 'gstreamer-base-1.0' found
--   No package 'gstreamer-video-1.0' found
--   No package 'gstreamer-app-1.0' found
--   No package 'gstreamer-riff-1.0' found
--   No package 'gstreamer-pbutils-1.0' found
-- Checking for modules 'gstreamer-base-0.10;gstreamer-video-0.10;gstreamer-app-0.10;gstreamer-riff-0.10;gstreamer-pbutils-0.10'
--   No package 'gstreamer-base-0.10' found
--   No package 'gstreamer-video-0.10' found
--   No package 'gstreamer-app-0.10' found
--   No package 'gstreamer-riff-0.10' found
--   No package 'gstreamer-pbutils-0.10' found
-- Checking for module 'libdc1394-2'
--   No package 'libdc1394-2' found
-- Checking for module 'libdc1394'
--   No package 'libdc1394' found
-- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
-- Could NOT find Atlas (missing: Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY Atlas_LAPACK_LIBRARY) 
-- Looking for sgemm_
-- Looking for sgemm_ - not found
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE  
-- Could NOT find BLAS (missing: BLAS_LIBRARIES) 
-- LAPACK requires BLAS
-- A library with LAPACK API not found. Please specify library location.
-- Performing Test HAVE_CXX_WNO_UNUSED_LOCAL_TYPEDEFS
-- Performing Test HAVE_CXX_WNO_UNUSED_LOCAL_TYPEDEFS - Success
-- Performing Test HAVE_CXX_WNO_SIGN_PROMO
-- Performing Test HAVE_CXX_WNO_SIGN_PROMO - Success
-- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_UNDEFINED_COMPARE
-- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_UNDEFINED_COMPARE - Failed
-- Performing Test HAVE_CXX_WNO_IGNORED_QUALIFIERS
-- Performing Test HAVE_CXX_WNO_IGNORED_QUALIFIERS - Success
-- Performing Test HAVE_CXX_WNO_UNUSED_FUNCTION
-- Performing Test HAVE_CXX_WNO_UNUSED_FUNCTION - Success
-- Performing Test HAVE_CXX_WNO_UNUSED_CONST_VARIABLE
-- Performing Test HAVE_CXX_WNO_UNUSED_CONST_VARIABLE - Success
-- Performing Test HAVE_CXX_WNO_SHORTEN_64_TO_32
-- Performing Test HAVE_CXX_WNO_SHORTEN_64_TO_32 - Failed
-- Performing Test HAVE_CXX_WNO_INVALID_OFFSETOF
-- Performing Test HAVE_CXX_WNO_INVALID_OFFSETOF - Success
-- Performing Test HAVE_CXX_WNO_ENUM_COMPARE_SWITCH
-- Performing Test HAVE_CXX_WNO_ENUM_COMPARE_SWITCH - Failed
-- Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 
-- Looking for dlerror in dl
-- Looking for dlerror in dl - found
-- OpenCV Python: during development append to PYTHONPATH: /home/fpga/opencv/build/python_loader
-- Checking for module 'freetype2'
--   No package 'freetype2' found
-- Checking for module 'harfbuzz'
--   No package 'harfbuzz' found
-- freetype2:   NO
-- harfbuzz:    NO
-- Could NOT find HDF5 (missing: HDF5_LIBRARIES HDF5_INCLUDE_DIRS) (found version "")
-- Module opencv_ovis disabled because OGRE3D was not found
-- No preference for use of exported gflags CMake configuration set, and no hints for include/library directories provided. Defaulting to preferring an installed/exported gflags CMake configuration if available.
-- Failed to find installed gflags CMake configuration, searching for gflags build directories exported with CMake.
-- Failed to find gflags - Failed to find an installed/exported CMake configuration for gflags, will perform search for installed gflags components.
-- Failed to find gflags - Could not find gflags include directory, set GFLAGS_INCLUDE_DIR to directory containing gflags/gflags.h
-- Failed to find glog - Could not find glog include directory, set GLOG_INCLUDE_DIR to directory containing glog/logging.h
-- Module opencv_sfm disabled because the following dependencies are not found: Eigen Glog/Gflags
-- Checking for module 'tesseract'
--   No package 'tesseract' found
-- Tesseract:   NO
-- Allocator metrics storage type: 'int'
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.sse2.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.sse3.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.ssse3.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.sse4_1.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.sse4_2.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.avx.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.avx2.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin128.avx512_skx.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin256.avx2.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin256.avx512_skx.cpp
-- Excluding from source files list: <BUILD>/modules/core/test/test_intrin512.avx512_skx.cpp
-- Excluding from source files list: modules/imgproc/src/corner.avx.cpp
-- Excluding from source files list: modules/imgproc/src/imgwarp.avx2.cpp
-- Excluding from source files list: modules/imgproc/src/imgwarp.sse4_1.cpp
-- Excluding from source files list: modules/imgproc/src/resize.avx2.cpp
-- Excluding from source files list: modules/imgproc/src/resize.sse4_1.cpp
-- Excluding from source files list: <BUILD>/modules/dnn/layers/layers_common.avx.cpp
-- Excluding from source files list: <BUILD>/modules/dnn/layers/layers_common.avx2.cpp
-- Excluding from source files list: <BUILD>/modules/dnn/layers/layers_common.avx512_skx.cpp
-- Excluding from source files list: modules/features2d/src/fast.avx2.cpp
-- Performing Test HAVE_CXX_WNO_OVERLOADED_VIRTUAL
-- Performing Test HAVE_CXX_WNO_OVERLOADED_VIRTUAL - Success
-- Excluding from source files list: modules/objdetect/src/haar.avx.cpp
-- xfeatures2d/boostdesc: Download: boostdesc_bgm.i
-- xfeatures2d/boostdesc: Download: boostdesc_bgm_bi.i
-- xfeatures2d/boostdesc: Download: boostdesc_bgm_hd.i
-- xfeatures2d/boostdesc: Download: boostdesc_binboost_064.i
-- xfeatures2d/boostdesc: Download: boostdesc_binboost_128.i
-- xfeatures2d/boostdesc: Download: boostdesc_binboost_256.i
-- xfeatures2d/boostdesc: Download: boostdesc_lbgm.i
-- xfeatures2d/vgg: Download: vgg_generated_48.i
-- xfeatures2d/vgg: Download: vgg_generated_64.i
-- xfeatures2d/vgg: Download: vgg_generated_80.i
-- xfeatures2d/vgg: Download: vgg_generated_120.i
-- data: Download: face_landmark_model.dat
-- 
-- General configuration for OpenCV 3.4.16 =====================================
--   Version control:               unknown
-- 
--   Extra modules:
--     Location (extra):            /home/fpga/opencv/opencv_contrib/modules
--     Version control (extra):     unknown
-- 
--   Platform:
--     Timestamp:                   2023-06-06T11:51:34Z
--     Host:                        Linux 5.15.108-zynqmp-fpga-generic aarch64
--     CMake:                       3.18.4
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/gmake
--     Configuration:               RELEASE
-- 
--   CPU/HW features:
--     Baseline:                    NEON FP16
-- 
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++11:                       YES
--     C++ Compiler:                /usr/bin/g++  (ver 10.2.1)
--     C++ flags (Release):         -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/gcc
--     C flags (Release):           -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):      -Wl,--gc-sections -Wl,--as-needed  
--     Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed  
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          dl m pthread rt
--     3rdparty dependencies:
-- 
--   OpenCV modules:
--     To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dpm face features2d flann fuzzy hfs highgui img_hash imgcodecs imgproc line_descriptor ml objdetect optflow phase_unwrapping photo plot reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv freetype hdf java matlab ovis python2 python3 sfm viz
--     Applications:                tests perf_tests apps
--     Documentation:               NO
--     Non-free algorithms:         NO
-- 
--   GUI: 
--     GTK+:                        NO
-- 
--   Media I/O: 
--     ZLib:                        /usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.11)
--     JPEG:                        libjpeg-turbo (ver 2.1.0-62)
--     WEBP:                        build (ver encoder: 0x020f)
--     PNG:                         build (ver 1.6.37)
--     TIFF:                        build (ver 42 - 4.2.0)
--     JPEG 2000:                   build (ver 1.900.1)
--     OpenEXR:                     build (ver 2.3.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
-- 
--   Video I/O:
--     DC1394:                      NO
--     GStreamer:                   NO
-- 
--   Parallel framework:            pthreads
-- 
--   Trace:                         YES (with Intel ITT)
-- 
--   Other third-party libraries:
--     Lapack:                      NO
--     Eigen:                       NO
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.5.1)
-- 
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/fpga/opencv/opencv-3.4.16/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
-- 
--   Python (for build):            NO
-- 
--   Java:                          
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/fpga/opencv/build
fpga@debian-fpga:~/opencv/build$ 


  1. 2023年06月07日 04:54 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 用 ZynqMP-FPGA-Debian11で Vitis で作成したラプラシアン・フィルタを実行する2

KR260 用 ZynqMP-FPGA-Debian11で Vitis で作成したラプラシアン・フィルタを実行する1”の続き。

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-1.0.0 を動作させてみる”で作成した ZynqMP-FPGA-Debian11 上で、”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる”のラプラシアン・フィルタを動作させたいということで、前回は、ファイルを用意し、環境を整えて、dtbocfg.rb でデバイス・ツリーをロードしたが、dtbocfg.rb が無かった。今回は、ikwzm さんに教えていただいた dtbo-config を使って、デバイス・ツリーをロードした。その後、/sys/class/uio ディレクトリを調べたら uio が増えていた。

dtbo-config を git clone した。
cd ~
git clone https://github.com/ikwzm/dtbo-utils.git


dtbo-utils ディレクトリに入って、dtbo-compile dtbo-config を /usr/local/bin ディレクトリにコピーした。
cd dtbo-utils/
sudo cp dtbo-compile dtbo-config /usr/local/bin

kr260_Debian11_27_230605.png

~/examples/kr260_lap2 ディレクトリに行って、dtbo-config を使用して、デバイス・ツリーをロードできた。
cd ~/examples/kr260_lap2/
sudo dtbo-config -i --dts pl.dtsi kr260_lap2

kr260_Debian11_28_230605.png

デバイス・ツリーは pl.dtsi なので、xsct で生成したデバイス・ツリーを Debian11 でも読み込めたことになる。
ターミナルの表示を示す。
kr260_Debian11_29_230605.png

debian-fpga login: [ 1083.910786] fpga_manager fpga0: writing kr260_cam_disp.bit.bin to Xilinx ZynqMP FPGA Manager
[ 1086.132312] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/firmware-name
[ 1086.142420] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/resets
[ 1086.152310] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay0
[ 1086.162152] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay1
[ 1086.171990] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/afi0
[ 1086.181476] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/clocking0
[ 1086.191398] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/clocking1
[ 1086.201320] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/pwm_fan0
[ 1086.211155] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay2
[ 1086.220989] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/active_frame
[ 1086.231169] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/misc_clk_0
[ 1086.241181] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/axi_intc_0
[ 1086.251187] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_axi_iic_0
[ 1086.261721] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_mt9d111_inf_axis_0
[ 1086.273035] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_vflip_dma_write2_0
[ 1086.284344] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/display_axi_gpio_0
[ 1086.295047] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/display_disp_dmar_axis_0
[ 1086.306271] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/lap_filter_axim_1
[ 1086.327388] pwm-fan axi:pwm-fan: error -EBUSY: Could not get PWM
[ 1086.333438] pwm-fan: probe of axi:pwm-fan failed with error -16


/sys/class/uio ディレクトリを見ると、uio4 〜 uio11 が増えていた。
kr260_Debian11_30_230605.png

uio の対応表を示す。

uio4 - interrupt-controller
uio5 - gpio
uio6 - i2c
uio7 - mt9d111_inf_axis
uio8 - vflip_dma_write2
uio9 - gpio
uio10 - disp_dmar_axis
uio11 - lap_filter_axim


もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する4”の uio の対応表とは uio4 と uio5 の対応が入れ替わっている。
  1. 2023年06月06日 04:23 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 用 ZynqMP-FPGA-Debian11で Vitis で作成したラプラシアン・フィルタを実行する1

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-1.0.0 を動作させてみる”で作成した ZynqMP-FPGA-Debian11 上で、”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる”のラプラシアン・フィルタを動作させたい。

binary_container_1.xclbin と pl.dtsi を ZynqMP-FPGA-Debian11 に転送したのだが、デバイス・ツリー・オーバーレイを実行する dtbocfg.rb が無かった。

ZynqMP-FPGA-Debian11 上で examples/kr260_lap2 ディレクトリを作成した。
cd
mkdir examples
cd examples
mkdir kr260_lap2
cd kr260_lap2


FileZilla で binary_container_1.xclbin と pl.dtsi を ZynqMP-FPGA-Debian11 に転送した。
kr260_Debian11_24_230605.png

pl.dtsi の一部を示す。
なお、pl.dtsi は”もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する3”の pl.dtsi に”KR260 のファンの音を静かにしたい”の pwm-fan のエントリを追加したものだ。
kr260_Debian11_26_230605.png

binary_container_1.xclbin の名前を kr260_cam_disp.bit.bin に変更した。
mv binary_container_1.xclbin kr260_cam_disp.bit.bin

kr260_cam_disp.bit.bin を /lib/firmware ディレクトリにコピーした。
sudo cp kr260_cam_disp.bit.bin /lib/firmware/

dtbocfg.rb でデバイス・ツリーをロードしたが、dtbocfg.rb が無かった。
sudo dtbocfg.rb -i --dts pl.dtsi kr260_lap2
kr260_Debian11_25_230605.png

そういえば、dtbocfg の Debian パッケージが無かった。今はデバイス・ツリーのロードはどうやるんだろう?
  1. 2023年06月05日 04:19 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 の Ubuntu 22.04 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる2

KR260 の Ubuntu 22.04 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる1”の続き。

前回は、cmake, make を使用して、cam_dp_ov5642 実行ファイルを生成したのだが、kr260_lap2 をロードして、/sys/class/uio を見ると、Petalinux とは uio の数が違っていたので、cam_dp_ov5642.cpp を書き換える必要がある。今回は、cam_dp_ov5642.cpp を書き換えて、make して、実行ファイルを生成した。その後、環境を整えて、実行ファイルを実行してみたが、カメラ画像が DiaplayPort に出力されなかった。どうやら、Ubuntu 22.04 はスクリーン・セーバーが起動して画面が消えているようだ。カメラ画像はメモリのバッファに正常に保存されていた。

cam_dp_ov5642.cpp の uio4 を uio5 に書き換えた。
kr260_cam_disp_274_230531.png

~/examples/kr260_lap2/cam_dp/build ディレクトリに行った。
cd ~/examples/kr260_lap2/cam_dp/build

再度 make を行った。
make
kr260_cam_disp_275_230531.png

実行ファイルの cam_dp_ov5642.cpp が生成された。

u-dma-buf.ko が ~/udmabuf ディレクトリにあったので、~/examples ディレクトリにコピーした。

u-dma-buf をロードした。
sudo insmod ../../../u-dma-buf.ko udmabuf4=0x2000000
sudo chmod 666 /dev/udmabuf*


現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap2 をロードした。(前回ロードしているが、日を改めたので、もう一度ロードする)
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap2
sudo chmod 666 /dev/uio*


AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01


cam_dp_ov5642 を起動した。
./cam_dp_ov5642 -r 2
HD モードで起動した。

w コマンドでカメラ画像のファイルを生成した。

f コマンドで、ラプラシアン・フィルタ処理画像にしてから w コマンドで画像を生成した。
kr260_cam_disp_276_230531.png

~/examples/kr260_lap2/cam_dp/build ディレクトリを見ると、カメラ画像は正常だった。
kr260_cam_disp_277_230531.png

kr260_cam_disp_278_230531.jpg

しかし、ラプラシアン・フィルタ画像は真っ暗だった。ラプラシアン・フィルタは動作していないようだ。

もう一度、やってみたところ、今度はカメラ画像が DisplayPort に出力できた。どうやら、最初の時はスクリーン・セーバーが働いていたようだ。。。
今回の回路は、プロンプト表示回路にオーバーレイ表示するためにタイミングをプロンプト表示から受け取っているので、プロンプトが表示されていないとカメラ画像が表示できない。

最後に変更した cam_dp_ov5642.cpp の画像を貼っておく。

// cam_dp_ov5642.cpp (for KR260)
// 2018/12/14 by marsee
//
// This software converts the left and right of the camera image to BMP file.
// -b : bmp file name
// -n : Start File Number
// -h : help
//
// 2018/12/20 : completed.
// I am using the SVGA driver register setting of https://github.com/virajkanwade/rk3188_android_kernel/blob/master/drivers/media/video/ov5642.c
// 2018/12/22 : fixed
// 2018/12/30 : ov5642_inf_axis[0] fixed
// 2019/02/06 : for DisplayPort
// 2023/04/23 : kr260_cam_disp vitis platform
// 2023/05/15 : bug fix
// 2023/05/16 : Added support for lap_filter_axim
// 2023/05/31 : Modified for Ubuntu 22.04.(uio4 - uio5)

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>

#define PIXEL_NUM_OF_BYTES    4
#define NUMBER_OF_WRITE_FRAMES  4

#define SVGA_HORIZONTAL_PIXELS  800
#define SVGA_VERTICAL_LINES     600
#define SVGA_ALL_DISP_ADDRESS   (SVGA_HORIZONTAL_PIXELS * SVGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define SVGA_3_PICTURES         (SVGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define XGA_HORIZONTAL_PIXELS  1024
#define XGA_VERTICAL_LINES     768
#define XGA_ALL_DISP_ADDRESS   (XGA_HORIZONTAL_PIXELS * XGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define XGA_3_PICTURES         (XGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define HD_HORIZONTAL_PIXELS  1920
#define HD_VERTICAL_LINES     1080
#define HD_ALL_DISP_ADDRESS   (HD_HORIZONTAL_PIXELS * HD_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define HD_3_PICTURES         (HD_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution, bool filter_on);

void cam_i2c_init(volatile unsigned *ov5642_axi_iic) {
    ov5642_axi_iic[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
    ov5642_axi_iic[64] = 0x1; // enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
    // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *ov5642_axi_iic, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    ov5642_axi_iic[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    ov5642_axi_iic[66] = (write_addr >> 8) & 0xff;  // address upper byte
    ov5642_axi_iic[66] = write_addr & 0xff;           // address lower byte
    ov5642_axi_iic[66] = 0x200 | (write_data & 0xff);      // data
    cam_i2x_write_sync();
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr);

int main(int argc, char *argv[]){
    int opt;
    int c, help_flag=0;
    char bmp_fn[256] = "bmp_file";
    char  attr[1024];
    unsigned long  phys_addr;
    int file_no = -1;
    int fd1, fd2, fd3, fd4, fd5, fd6, fd10, fd11, fd_lap;
    volatile unsigned int *ov5642_inf_axis, *axi_iic, *disp_dmar_axis, *vflip_dma_write;
    volatile unsigned int *axi_gpio_0, *active_frame_gpio, *lap_filter_axim;
    volatile unsigned int *frame_buffer;
    int active_frame;
    int resolution;
    int all_disp_addr;
    bool filter_on = false;
    
    resolution = 1; // XGA
    while ((opt=getopt(argc, argv, "b:n:h:r:")) != -1){
        switch (opt){
            case 'b':
                strcpy(bmp_fn, optarg);
                break;
            case 'n':
                file_no = atoi(optarg);
                printf("file_no = %d\n", file_no+1);
                break;
            case 'r':
                resolution = atoi(optarg);
                break;
            case 'h':
                help_flag = 1;
                break;
        }
    }
    if(resolution == 0){
        printf("SVGA\n");
    } else if(resolution == 1){
        printf("XGA\n");
    } else {
        printf("HD\n");
    }

    if (help_flag == 1){ // help
        printf("Usage : cam_capture [-b <bmp file name>] [-n <Start File Number>] [-h]\n");
        printf("         -r [0|1|2](0:SVGA, 1:XGA, 2:HD)\n");
        exit(0);
    }
       
    // all_disp_addr
    switch(resolution){
        case 0 :
            all_disp_addr = SVGA_ALL_DISP_ADDRESS;
            break;
        case 1 :
            all_disp_addr = XGA_ALL_DISP_ADDRESS;
            break;
        default : // 2
            all_disp_addr = HD_ALL_DISP_ADDRESS;
            break;
    }
    
    // ov5642_inf_axis-uio IP
    fd1 = open("/dev/uio7", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio7 (ov5642_inf_axis) open error\n");
        exit(-1);
    }
    ov5642_inf_axis = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!ov5642_inf_axis){
        fprintf(stderr, "ov5642_inf_axis mmap error\n");
        exit(-1);
    }
    
    // axi_iic-uio IP
    fd2 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd2 < 1){
        fprintf(stderr, "/dev/uio6 (axi_iic) open error\n");
        exit(-1);
    }
    axi_iic = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
    if (!axi_iic){
        fprintf(stderr, "axi_iic mmap error\n");
        exit(-1);
    }

    // disp_dmar_axis-uio IP
    fd3 = open("/dev/uio10", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd3 < 1){
        fprintf(stderr, "/dev/uio10 (disp_dmar_axis) open error\n");
        exit(-1);
    }
    disp_dmar_axis = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!disp_dmar_axis){
        fprintf(stderr, "disp_dmar_axis mmap error\n");
        exit(-1);
    }

    // vflip_dma_write-uio IP
    fd4 = open("/dev/uio8", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd4 < 1){
        fprintf(stderr, "/dev/uio8 (vflip_dma_write) open error\n");
        exit(-1);
    }
    vflip_dma_write = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd4, 0);
    if (!vflip_dma_write){
        fprintf(stderr, "vflip_dma_write mmap error\n");
        exit(-1);
    }

    // axi_gpio_0-uio IP (init_done output)
    fd5 = open("/dev/uio9", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd5 < 1){
        fprintf(stderr, "/dev/uio9 (axi_gpio_0) open error\n");
        exit(-1);
    }
    axi_gpio_0 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd5, 0);
    if (!axi_gpio_0){
        fprintf(stderr, "axi_gpio_0 mmap error\n");
        exit(-1);
    }

    // active_frame_gpio-uio IP (active_frame input)
    fd6 = open("/dev/uio5", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd6 < 1){
        fprintf(stderr, "/dev/uio5 (active_frame_gpio) open error\n");
        exit(-1);
    }
    active_frame_gpio = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd6, 0);
    if (!active_frame_gpio){
        fprintf(stderr, "active_frame_gpio mmap error\n");
        exit(-1);
    }
    
    // laplacian_fliter-uio IP (active_frame input)
    fd_lap = open("/dev/uio11", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd_lap < 1){
        fprintf(stderr, "/dev/uio11 (lap_filter_axim) open error\n");
        exit(-1);
    }
    lap_filter_axim = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd_lap, 0);
    if (!active_frame_gpio){
        fprintf(stderr, "lap_filter_axim mmap error\n");
        exit(-1);
    }
    
    
    // udmabuf4
    fd10 = open("/dev/udmabuf4", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd10 == -1){
        fprintf(stderr, "/dev/udmabuf4 open error\n");
        exit(-1);
    }
    frame_buffer = (volatile unsigned int *)mmap(NULL, all_disp_addr*NUMBER_OF_WRITE_FRAMES, PROT_READ|PROT_WRITE, MAP_SHARED, fd10, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer4 mmap error\n");
        exit(-1);
    }
    
    // phys_addr of udmabuf4
    fd11 = open("/sys/class/u-dma-buf/udmabuf4/phys_addr", O_RDONLY);
    if (fd11 == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf4/phys_addr open error\n");
        exit(-1);
    }
    read(fd11, attr, 1024);
    sscanf(attr, "%lx", &phys_addr);  
    close(fd11);
    printf("phys_addr = %x\n", (int)phys_addr);
    
    // vflip_dma_write start
    vflip_dma_write[6] = phys_addr; // fb0
    vflip_dma_write[8] = phys_addr+all_disp_addr; // fb1
    vflip_dma_write[10] = phys_addr+2*all_disp_addr; // fb2
    vflip_dma_write[12] = resolution;
    vflip_dma_write[0] = 0x1; // start
    vflip_dma_write[0] = 0x80; // EnableAutoRestart
       
    // CMOS Camera initialize, ov5642
    cam_i2c_init(axi_iic);
    
    cam_reg_set(axi_iic, 0x78); // OV5642 register set

    ov5642_inf_axis[0] = phys_addr; // ov5642 AXI4-Stream Start
    ov5642_inf_axis[1] = 0;
 
     // disp_dmar_axis start
    disp_dmar_axis[4] = phys_addr; // fb0
    disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
    disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
    disp_dmar_axis[10] = resolution;
    axi_gpio_0[0] = 1; // disp_dmar_axis start(init_done = 1)
    
    char bmp_file[256];

    // All 0 set
    int all_disp_frame_index = all_disp_addr/PIXEL_NUM_OF_BYTES*NUMBER_OF_WRITE_FRAMES;
    for (int i=0; i<all_disp_frame_index; i++){
        frame_buffer[i] = 0x0;
    }
    
    // lap_filer_axm initialize
    lap_filter_axim[5] = 0 ; // bit 31~0 - cam_fb[63:32] (Read/Write)
    lap_filter_axim[7] = phys_addr+3*all_disp_addr; // bit 31~0 - lap_fb[31:0] (Read/Write)
    lap_filter_axim[8] = 0; // bit 31~0 - lap_fb[63:32] (Read/Write)
    switch (resolution){
        case 0 : // SVGA
            lap_filter_axim[10] = SVGA_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = SVGA_VERTICAL_LINES;
            break;
        case 1 : // XGA
            lap_filter_axim[10] = XGA_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = XGA_VERTICAL_LINES;
            break;
        default : // HD
            lap_filter_axim[10] = HD_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = HD_VERTICAL_LINES;
            break;
    }

    // w - writed the left and right eye's bmp files.  q - exit.
    c = getc(stdin);
    while(c != 'q'){
        switch ((char)c) {
            case 'w' : // w - writed a bmp files.
                // writed the frame buffer
                file_no++;
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution, filter_on);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'e' : // e - writed a same bmp files.
                // writed the frame buffer
                if (file_no == -1)
                    file_no = 0;
                
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution, filter_on);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'f' : // laplacian_filter on
                filter_on = true;
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                int read_frame;
                if (active_frame == 0)
                    read_frame = 2;
                else if (active_frame == 1)
                    read_frame = 0;
                else // active_frame == 2
                    read_frame = 1;
                lap_filter_axim[4] = phys_addr+read_frame*all_disp_addr;
                lap_filter_axim[0] = 0x81; // ap_start + auto_restart

                disp_dmar_axis[4] = phys_addr+3*all_disp_addr; // fb0
                disp_dmar_axis[6] = phys_addr+3*all_disp_addr; // fb1
                disp_dmar_axis[8] = phys_addr+3*all_disp_addr; // fb2
                break;
            case 'c' : // Display camera image
                filter_on = false;
                lap_filter_axim[0] = 1; // ap_start
                disp_dmar_axis[4] = phys_addr; // fb0
                disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
                disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
                break; 
        }
        c = getc(stdin);
    }
    
    munmap((void *)ov5642_inf_axis, 0x1000);
    munmap((void *)axi_iic, 0x1000);
    munmap((void *)disp_dmar_axis, 0x10000);
    munmap((void *)vflip_dma_write, 0x10000);
    munmap((void *)axi_gpio_0, 0x1000);
    munmap((void *)active_frame_gpio, 0x1000);
    munmap((void *)frame_buffer, all_disp_addr*3);
    
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);
    close(fd6);
    close(fd10);
    
    return(0);
}

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution, bool filter_on){
    int read_frame;
    int img_width, img_height;
    
    if (active_frame == 0)
        read_frame = 2;
    else if (active_frame == 1)
        read_frame = 0;
    else // active_frame == 2
        read_frame = 1;
        
    switch(resolution){
        case 0 :
            img_width = SVGA_HORIZONTAL_PIXELS;
            img_height = SVGA_VERTICAL_LINES;
            break;
        case 1 :
            img_width = XGA_HORIZONTAL_PIXELS;
            img_height = XGA_VERTICAL_LINES;
            break;
        default : // case 2 :
            img_width = HD_HORIZONTAL_PIXELS;
            img_height = HD_VERTICAL_LINES;
            break;
    }
    
    int offset_addr;
    if (filter_on == false){
        offset_addr = read_frame * img_width * img_height;
    }else{
        offset_addr = 3 * img_width * img_height;
    }

    cv::Mat img(img_height, img_width, CV_8UC3);

    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for(int y=0; y<img.rows; y++){
        for(int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            int rgb = frame_buffer[offset_addr+y*img.cols+x];
            pixel[0] = (rgb & 0xff); // blue
            pixel[1] = (rgb & 0xff00) >> 8; // green
            pixel[2] = (rgb & 0xff0000) >> 16; // red
            dst_vec3b(y,x) = pixel;
        }
    }
    
    cv::imwrite(bmp_file, img);
    
    return(0);
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr){
    cam_i2c_write(axi_iic, device_addr, 0x3103, 0x93);
    cam_i2c_write(axi_iic, device_addr, 0x3008, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x3017, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x3018, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc2);
    cam_i2c_write(axi_iic, device_addr, 0x3615, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x5c);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3005, 0xb7);
    cam_i2c_write(axi_iic, device_addr, 0x3006, 0x43);
    cam_i2c_write(axi_iic, device_addr, 0x3007, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3011, 0x08); // 0x08 - 15fps, 0x10 - 30fps
    cam_i2c_write(axi_iic, device_addr, 0x3010, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x460c, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x370c, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3602, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3612, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x3634, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3613, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3622, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3604, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0xa7);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x4000, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x401d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3600, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3606, 0x3f);
    cam_i2c_write(axi_iic, device_addr, 0x3c01, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x5020, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x79);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x0a);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5080, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x300e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x4610, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x471d, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x4708, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x3710, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3632, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3631, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61); // RGB565
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x73);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3824, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0xc1);
    cam_i2c_write(axi_iic, device_addr, 0x3705, 0xdb);
    cam_i2c_write(axi_iic, device_addr, 0x370a, 0x81);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3827, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a1a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a13, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a18, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a19, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x350c, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x350d, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3500, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3030, 0x0b);
    cam_i2c_write(axi_iic, device_addr, 0x3a02, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a03, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a04, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a14, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a15, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a16, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0x98);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x589b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x589a, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x4e);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x538a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538b, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x538c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538d, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538f, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xab);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x65);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x71);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x87);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x91);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x9a);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0xaa);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xcd);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xdd);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xea);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x86);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0x5b);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0x3b);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xed);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0xa5);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x3406, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04); // 0x04
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8); // 0xf8
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0xbd);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x68);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x02); // 0x02
    cam_i2c_write(axi_iic, device_addr, 0x3633, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0xb2);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x370b, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x3c00, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xFF);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5503, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0xE1);
    cam_i2c_write(axi_iic, device_addr, 0x538A, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538B, 0x2B);
    cam_i2c_write(axi_iic, device_addr, 0x538C, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538D, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538E, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538F, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xB3);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xA6);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x49);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x56);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x76);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x88);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0x96);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xcc);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0xee);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0xd8);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xb3);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0x90);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b1, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54b2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b3, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b4, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54b5, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x54b6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b7, 0xdf);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5587, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5588, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x558a, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x5589, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0xcf);
    cam_i2c_write(axi_iic, device_addr, 0x5800, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5801, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x5802, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5803, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5804, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5805, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5806, 0x29);
    cam_i2c_write(axi_iic, device_addr, 0x5807, 0x38);
    cam_i2c_write(axi_iic, device_addr, 0x5808, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x5809, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x580a, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x580b, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580c, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x580d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580e, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x580f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5810, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5811, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5812, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x5813, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5814, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5815, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5816, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5817, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5818, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5819, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x581a, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x581b, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581c, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581d, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x581e, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x581f, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5820, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x5821, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5822, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5823, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5824, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5825, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x5826, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x5827, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5828, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5829, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x582a, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x582b, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582c, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x582d, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582e, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x582f, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5830, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5831, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5832, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5833, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5834, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5835, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5836, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5837, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5838, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x5839, 0x39);
    cam_i2c_write(axi_iic, device_addr, 0x583a, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x583b, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x583c, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x583d, 0x23);
    cam_i2c_write(axi_iic, device_addr, 0x583e, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x583f, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x5840, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5841, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5842, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5843, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5844, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5845, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5846, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5847, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5848, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5849, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584a, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584b, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x584c, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584e, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x584f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5850, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5851, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5852, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5853, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5854, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5855, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5856, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5857, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5858, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5859, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x585a, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585b, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585c, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585d, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x585e, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x585f, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5860, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5861, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5862, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5863, 0x7);
    cam_i2c_write(axi_iic, device_addr, 0x5864, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5865, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5866, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5867, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5868, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5869, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x586a, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x586b, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x586c, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586d, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x586f, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5870, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5871, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5872, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5873, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5874, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x5875, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5876, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5877, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5878, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5879, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x587a, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x587b, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x587c, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587d, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587e, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x587f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5880, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5881, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5882, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5883, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5884, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5885, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5886, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5887, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5180, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0x9c);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x34);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x4c);
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5196, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5198, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5199, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x519a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x519b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x519c, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x519d, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x519e, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3800, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3802, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0x58);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0x81); // No Mirror
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xa7);
    
    cam_i2c_write(axi_iic, device_addr, 0x4740, 0x21);
    
    cam_i2c_write(axi_iic, device_addr, 0x501e, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5002, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61);
    
    return(0);
}

  1. 2023年06月01日 04:56 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0