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

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

FPGAの部屋

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

Gowin EDA のサンプル・プロジェクトの内の CAN プロジェクトをやってみる2

Gowin EDA のサンプル・プロジェクトの内の CAN プロジェクトをやってみる1”の続き。

前回は、GOWIN FPGA Designer で CAN サンプル・プロジェクトが生成し、ファイルを確認した。今回は、Synthesis と Place & Route をやってみた。論理合成のログを確認した。

Run Synthesis ボタンをクリックして、論理合成を行った。
Tang_Primer_25K_25_240129.png

論理合成が成功した。ログを示す。

GowinSynthesis start
Running parser ...
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/button.v'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/gw_pll.v'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v'
Undeclared symbol 't_htrans', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":18)
Undeclared symbol 't_hsize', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":19)
Undeclared symbol 't_hready_in', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":20)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/top.v'
Undeclared symbol 'ponrst_n', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/top.v":25)
Undeclared symbol 'rcv_en', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/top.v":65)
Undeclared symbol 'rd_config_en', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/top.v":66)
Compiling module 'top'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/top.v":1)
Compiling module 'deUstb'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/button.v":2)
Compiling module 'GW_PLL'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/gw_pll.v":1)
Compiling module 'can_top'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":21712)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/can/can.v":0)
Compiling module 'reg_if'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":1)
WARN  (EX3791) : Expression size 2 truncated to fit in target size 1("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":18)
WARN  (EX3791) : Expression size 2 truncated to fit in target size 1("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":19)
WARN  (EX3791) : Expression size 13 truncated to fit in target size 12("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":97)
WARN  (EX3791) : Expression size 6 truncated to fit in target size 5("/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg_if.v":194)
NOTE  (EX0101) : Current top module is "top"
[5%] Running netlist conversion ...
Running device independent optimization ...
[10%] Optimizing Phase 0 completed
[15%] Optimizing Phase 1 completed
[25%] Optimizing Phase 2 completed
Running inference ...
[30%] Inferring Phase 0 completed
[40%] Inferring Phase 1 completed
[50%] Inferring Phase 2 completed
[55%] Inferring Phase 3 completed
Running technical mapping ...
[60%] Tech-Mapping Phase 0 completed
[65%] Tech-Mapping Phase 1 completed
[75%] Tech-Mapping Phase 2 completed
[80%] Tech-Mapping Phase 3 completed
[90%] Tech-Mapping Phase 4 completed
[95%] Generate netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/gwsynthesis/can.vg" completed
[100%] Generate report file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/gwsynthesis/can_syn.rpt.html" completed
GowinSynthesis finish


Run Place & Routte ボタンをクリックし、配置配線を行った。
Tang_Primer_25K_26_240129.png

配置配線が成功した。
Tang_Primer_25K_27_240129.png

ログを示す。

Generating Post-Synthesis GAO
Post-Synthesis GAO generation finish
Reading netlist file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/gwsynthesis/can.vg"
Parsing netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/gwsynthesis/can.vg" completed
Processing netlist completed
Parsing netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/gao/gao.v" completed
Processing netlist completed
Reading constraint file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/src/reg.cst"
Physical Constraint parsed completed
Running placement......
[10%] Placement Phase 0 completed
[20%] Placement Phase 1 completed
[30%] Placement Phase 2 completed
WARN  (TA1123) : the clock "myclk1"'s frequency does not match uut_GW_PLL/pll_inst/CLKOUT's 
[50%] Placement Phase 3 completed
Running routing......
[60%] Routing Phase 0 completed
[70%] Routing Phase 1 completed
[80%] Routing Phase 2 completed
[90%] Routing Phase 3 completed
Running timing analysis......
[95%] Timing analysis completed
Placement and routing completed
Bitstream generation in progress......
Bitstream generation completed
Running power analysis......
[100%] Power analysis completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/pnr/can.power.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/pnr/can.pin.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/pnr/can.rpt.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/pnr/can.rpt.txt" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/can/impl/pnr/can.tr.html" completed
Mon Jan 29 05:22:58 2024


Process ウインドウのタブの Process をクリックし、結果を見ていこう。
Synthesis Report をクリックし、論理合成のレポートを確認する。
Tang_Primer_25K_28_240130.png

Synthesis Details をクリックした。
Tang_Primer_25K_29_240130.png

Resource の Resource Usage Summary をクリックした。
Tang_Primer_25K_30_240130.png

Resource の Resource Utilization Summary をクリックした。
Tang_Primer_25K_33_240130.png

Logic の使用量は 25% だった。

Timing の Clock Summary をクリックすると Max Frequency Summary も見えた。
Tang_Primer_25K_31_240130.png

PLL の出力クロックの予測値が 96.3 MHz だった。タイミング制約違反になりそうという予測なのか?

Timing の Detail Timing Paths Infomation をクリックした。
Tang_Primer_25K_32_240130.png
  1. 2024年01月31日 04:55 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Gowin EDA のサンプル・プロジェクトの内の CAN プロジェクトをやってみる1

Gowin EDA のダウンロードとインストール”で Gowin EDA をインストールして、GOWIN FPGA Designer を起動した。
今回は、試しに Example プロジェクトの内の CAN プロジェクトをやってみよう。

GOWIN FPGA Designer の File メニューから Open Example Project... を選択する。
Tang_Primer_25K_15_240129.png

CAN サンプル・プロジェクトが生成された。
Tang_Primer_25K_16_240129.png

HDL/Examples ディレクトリの下に can ディレクトリが生成された。
can ディレクトリを示す。
Tang_Primer_25K_17_240129.png

can ディレクトリのディレクトリ構造とファイルは readme.txt に書いてあった。
readme.txt を引用する。
Tang_Primer_25K_18_240129.png

impl の下に temp ディレクトリが作成されていた。そこに作成されているファイルを示す。
Tang_Primer_25K_19_240129.png

top.v を表示した。
deUstb というプリミティブ? があるようだ。これは出力には追加されていないで、入力だけ追加しているようだ?
IOB のようなものなのかな?
Tang_Primer_25K_20_240129.png

can.v は暗号化されている? ようだ。
Tang_Primer_25K_21_240129.png

gw_pll.v を引用する。
PLL プリミティブがあるようだ。
Tang_Primer_25K_22_240129.png

他の Verilog HDL ファイルは普通だった。

制約ファイルには、Physical Constraints Files と Timing Constraints Files があるようだ。
Physical Constraints Files の reg.cst を引用する。
IO_LOC で信号名のピン番号を指定するようだ。
IP_PORT で信号名の IO 規格を支持するようだ。
Tang_Primer_25K_23_240129.png

Timing Constraints Files は SDC ファイルだった。
project.sdc を引用する。
Tang_Primer_25K_24_240129.png
  1. 2024年01月30日 04:31 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Gowin EDA のダウンロードとインストール

Gowin EDA のダウンロードとインストールを行う。

GOWIN EDAのインストール方法”のページを参考にすると良いと思う。

Ubuntu 22.04 のパソコンに Gowin EDA をインストールする。

Gowin のトップページの右上の”登録/メンバーログイン”をクリックして、登録する。
メールアドレス、パスワード、名前、住所を入力する。
なお、Ubuntu 22.04 のパソコンで Gowin のトップページ以下を表示するときはブラウザをフルサイズにしないと、モバイル・デバイスの画面が表示されてしまう。

GOWIN EDA ホーム -> Gowin EDA ダウンロードに行って、Gowin V1.9.9Beta-4 Education (Linux x86) と、念の為、Gowin Programmer V1.9.9 Beta-4 Education (Linux x86) をダウンロードした。
Tang_Primer_25K_9_240128.png

Gowin_V1.9.9Beta-4_Education.tar.gz と programmer1.9.9b4_edu(build30911).Linux.x86.tar.gz がダウンロードできた。
Tang_Primer_25K_10_240128.png

Gowin_V1.9.9Beta-4_Education.tar.gz をダブルクリックして、表示した。
Programmer と IDE ディレクトリがある。
Tang_Primer_25K_11_240128.png

Gowin_V1.9.9Beta-4_Education.tar.gz を Gowin ディレクトリを作成して、その中に解凍した。
Tang_Primer_25K_12_240128.png

IDE/bin ディレクトリの内容を示す。
Tang_Primer_25K_13_240128.png

gw_ide をダブルクリックで開くと、GOWIN FPGA Designer が起動した。
Tang_Primer_25K_14_240128.png
  1. 2024年01月29日 04:00 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Sipeed Tang Primer 25K を使ってみよう1

Sipeed Tang Primer 25Kが届いた”で Sipeed Tang Primer 25K を購入したが、後で、 SDRAM モジュールも購入できた。
Tang_Primer_25K_7_240127.jpg

Tang_Primer_25K_8_240127.jpg

SDRAM モジュールのバージョンは 1.2 のようだ。

SDRAM モジュールを挿す方向は、”FPGAマガジン公式 Tang Primer 25K”に載っていた。

まずは、ツールをインストールする必要があるよね。。。
GOWIN の登録サイトで登録してから、Gowin EDA をダウンロードしてインストールする必要がある。

Tang Primer 25K のマニュアルはここにあるが、PMOD モジュールや SDRAM の回路図は、TANG/PMOD にある。

Gowin EDA ツールを示しておく。
Gowin ソフトウェアクイックインストール ユーザーガイド SUG501-1.4J, 2023-11-30
Gowin ソフトウェア ユーザーガイド SUG100-3.8J, 2023-11-30
Gowin Programmer ユーザーガイド SUG502-1.3J, 2020-02-17

Tang Primer 25K のプロジェクトのサンプル
sipeed/TangPrimer-25K-example
  1. 2024年01月27日 13:11 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する5

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する4”の続き。

median_hlsst_RGB24 に tlast を追加するということで、前回は、Bambu で生成された median_hlsst_RGB24.v を Vivado 2023.2 の bambu_median プロジェクトの median_hlsst_RGB24.v と入れ替えて、tdata と tlast を出力できるように Slice を追加した。その後、論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。今回は、前回作成した bit ファイルと hwh ファイルを ZUBoard 1CG の PYNQ Linux の Jupyter Notebook 上にアップロードして動作を確認したところ、問題なく動作した。

ZUBoard 1CG で PYNQ Linux を起動して、ホスト・パソコンの Chrome ブラウザで PYNQ Linux の Jupyter Notebook を表示した。
bambu_median ディレクトリに移動した。
bambu_median.bit と bambu_median.hwh ファイルを削除した。

bit ファイルと hwh ファイルを再アップロードした。
bambu_median_wrapper.bit を bambu_median.bit に名前を変更した。

現在の bambu_median ディレクトリを示す。
bambu_267_240126.png

bambu_median.ipynb を実行したところ、”Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる5”とは異なり、問題なく動作した。やはり、tlast が axi dma に入らないのが問題だったようだ。
bambu_268_240126.png
bambu_269_240126.jpg
bambu_274_240126.png
bambu_270_240126.jpg

ILA ダッシュボードで tlast を確認した。
median_hlsst_RGB24_outs_din の最後が 0x1948170 になっているのが分かる。
median_hlsst_RGB24_outs_din[24] の最上位ビットが 1 のときが tlast = 1 なので、tlast が出力されいることが分かる。
tlast は最後のデータ転送以外は 0 になっている。
bambu_271_240126.png
bambu_272_240126.png
bambu_273_240126.png

sobel_axs_RGB24_0_outs : TLAST も最後に 1 になっているのが分かる。
  1. 2024年01月26日 04:45 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する4

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する3”の続き。

median_hlsst_RGB24 に tlast を追加するということで、前回は、Cocotb でシミュレーションを行って、tlast が正常に出力できているのが確認できた。今回は、Bambu で生成された median_hlsst_RGB24.v を Vivado 2023.2 の bambu_median プロジェクトの median_hlsst_RGB24.v と入れ替えて、tdata と tlast を出力できるように Slice を追加した。その後、論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。

前回までで、Bambu で生成された median_hlsst_RGB24.v を Vivado 2023.2 の bambu_median プロジェクトの median_hlsst_RGB24.v と入れ替えた。
bambu_261_240125.png

なお、bambu_median プロジェクトについては、以下のブログ記事を参照のこと。
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる1
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる2
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる3
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる4

median_hlsst_RGB24_0 の outs_din の 0 ビット目から 23 ビット目までを tdata24 の Slice で分離して、sobel_axis_RGB24_0 の TDATA[23:0] に入力した。
bambu_262_240125.png

median_hlsst_RGB24_0 の outs_din の 24 ビット目を tlast の Slice で分離して、sobel_axis_RGB24_0 の TLAST[0:0] に入力した。
bambu_263_240125.png

tkeep の Constant の出力を sobel_axis_RGB24_0 の TKEEP[2:0] に入力した。
Const Width は 3 、Const Val は 7 に設定した。
bambu_264_240125.png

Address Editor を示す。
bambu_266_240125.png

論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。
Project Summary を示す。
bambu_265_240125.png
  1. 2024年01月25日 04:23 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する3

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する2”の続き。

median_hlsst_RGB24 に tlast を追加するということで、前回は、median_hlsst_RGB24.cpp を Bambu で高位合成して、median_hlsst_RGB24.v を生成した。今回は、Cocotb でシミュレーションを行って、tlast が正常に出力できているのが確認できた。

PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリにある Makefile とテストベンチの test_median.py はそのまま使用することができる。

tlast 付きで生成された median_hlsst_RGB24.v を PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリにコピーした。
シミュレーション時に VCD ファイルを出力するため、median_hlsst_RGB24.v の endmodule の前に以下の文を追加した。

// the "macro" to dump signals
`ifdef COCOTB_SIM
initial begin
  $dumpfile ("median_hlsst_RGB24.vcd");
  $dumpvars (0, median_hlsst_RGB24);
  #1;
end
`endif


bambu_257_240124.png

これで、準備が終わったので、PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリに行って、make を実行し、シミュレーションを行った。
ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb' に入ります
rm -f results.xml
MODULE=test_median TESTCASE= TOPLEVEL=median_hlsst_RGB24 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 11.0 (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 1706039891
     0.00ns INFO     cocotb.regression                  Found test test_median.test_median
     0.00ns INFO     cocotb.regression                  running test_median (1/1)
VCD info: dumpfile median_hlsst_RGB24.vcd opened for output.
674111.00ns INFO     cocotb.regression                  test_median passed
674111.00ns INFO     cocotb.regression                  **************************************************************************************
                                                        ** TEST                          STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        **************************************************************************************
                                                        ** test_median.test_median        PASS      674111.00          76.64       8795.42  **
                                                        **************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0             674111.00          77.01       8753.08  **
                                                        **************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb' から出ます


median.jpg が生成された。median.jpg は”Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する3”と同じ結果だった。
bambu_199_240111.png

median_hlsst_RGB24.vcd ファイルが生成されたので、GTKWave で確認した。
bambu_258_240124.png

始まりの部分を拡大する。
bambu_259_240124.png

outs_write の間隔は 14 クロックだった。Vitis HLS で実装した場合の 1/14 のスループットということが言える。

最後の部分を拡大した。
bambu_260_240124.png

done_port に 1 が出る前の最後のトランザクションで、outs_din が 0x18E826A になっていて、tlast が 1 になっているのが分かった。最後以外の tlast は 0 のようだ。
  1. 2024年01月24日 05:17 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する2

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する1”の続き。

median_hlsst_RGB24 に tlast を追加するということで、前回は、median_hlsst_RGB24.cpp を変更し、outs 出力ストリームのデータ・ビット幅を 1 ビット増やして、そこに tlast の機能を割り当てた。そして、g++ コンパイラでコンパイルし動作を確認した。今回は、median_hlsst_RGB24.cpp を Bambu で高位合成して、median_hlsst_RGB24.v を生成した。

median_hlsst_RGB24.cpp を Bambu で高位合成した。
bambu median_hlsst_RGB24.cpp --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24$ bambu median_hlsst_RGB24.cpp --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1
 ==  Bambu executed with: /tmp/.mount_bambuZtXzVh/usr/bin/bambu --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1 median_hlsst_RGB24.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z18median_hlsst_RGB24R10ac_channelI6ac_intILi24ELb0EEERS_IS0_ILi25ELb0EEEii
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 24
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 25
      Alignment : 8
  Analyzed function _Z18median_hlsst_RGB24R10ac_channelI6ac_intILi24ELb0EEERS_IS0_ILi25ELb0EEEii

  Functions to be synthesized:
    median_hlsst_RGB24


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function median_hlsst_RGB24:
    Number of complex operations: 26
    Number of complex operations: 26
  Time to perform module allocation: 0.39 seconds


  Scheduling Information of function median_hlsst_RGB24:
    Number of control steps: 21
    Minimum slack: 0.16582799699998785
    Estimated max frequency (MHz): 101.686242593168
  Time to perform scheduling: 0.15 seconds


  State Transition Graph Information of function median_hlsst_RGB24:
    Number of states: 21
    Done port is registered
  Time to perform creation of STG: 0.08 seconds


  Easy binding information for function median_hlsst_RGB24:
    Bound operations:175/859
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function median_hlsst_RGB24:
    Number of storage values inserted: 120
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.01 seconds
  Weight computation completed in 0.03 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 116 registers(LB:53)
  Time to perform register binding: 0.01 seconds


  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 116 registers(LB:53)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.02 seconds

  Module binding information for function median_hlsst_RGB24:
    Number of modules instantiated: 843
    Number of performance conflicts: 2567
    Estimated resources area (no Muxes and address logic): 9857
    Estimated area of MUX21: 349
    Total estimated area: 10206
    Estimated number of DSPs: 0
  Time to perform module binding: 0.07 seconds


  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 116 registers(LB:53)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function median_hlsst_RGB24:
    Number of allocated multiplexers (2-to-1 equivalent): 24
  Time to perform interconnection binding: 0.01 seconds

  Total number of flip-flops in function median_hlsst_RGB24: 2395
error -> Value of ins is missing in test vector

Please report bugs to <panda-info@polimi.it>


やはり、”Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する2”よりもリソース使用量が増えている。

median_hlsst_RGB24.v が生成された。
outs_din 出力ポートが 25 ビット幅になっているのが分かる。
bambu_256_240123.png

やはり、PandA-bambu-2023.1/examples/median_hlsst_RGB24/HLS_output/simulation ディレクトリは空で、VCD ファイルが生成されていなかった。
  1. 2024年01月23日 04:42 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する1

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる6”で AXI DMA を正常に動作させるためには AXI4-Stream インターフェースの tlast が必要ということが分かった。よって、”Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する1”で実装した median_hlsst_RGB24 に tlast を追加する。

tlast の実装方法について、いろいろと検討した。
ap_uint<24> tdata と ap_uint<1> tlast の構造体の hls stream を作って、tdata と tlast のポートが出れば良かったのだが、出なかったのでボツにした。
こんな感じだ。

typedef struct AXIS_STREAM_FORMAT {
    ap_uint<24> tdata;
    ap_uint<1> tlast;
} AXIS_STREAM;

int median_hlsst_RGB24(hls::stream<ap_uint<24> >& ins,
        hls::stream<AXIS_STREAM >& outs,
         int32_t row_size, int32_t col_size){


結局、出力の hls stream を 24 ビットから 25 ビットにして、最上位の 1 ビットを tlast にすることにした。
修正した median_hlsst_RGB24.cpp を示す。

// median_hlsst_RGB24.cpp
// 2024/01/09 by marsee
// 2024/01/21 : outs の 25 ビット目に tlast を割り当てた

// bmp_header.h
// BMP ファイルフォーマットから引用させて頂きました
// http://www.kk.iij4u.or.jp/~kondo/bmp/
//
// 2017/05/04 : takseiさんのご指摘によりintX_tを使った宣言に変更。takseiさんありがとうございました
//              変数の型のサイズの違いによってLinuxの64ビット版では動作しなかったためです
//              http://marsee101.blog19.fc2.com/blog-entry-3354.html#comment2808
//

#include <stdio.h>
#include <stdint.h>

// BITMAPFILEHEADER 14bytes
typedef struct tagBITMAPFILEHEADER {
    uint16_t bfType;
    uint32_t bfSize;
    uint16_t bfReserved1;
    uint16_t bfReserved2;
    uint32_t bfOffBits;
} BITMAPFILEHEADER;

// BITMAPINFOHEADER 40bytes
typedef struct tagBITMAPINFOHEADER{
    uint32_t biSize;
    int32_t biWidth;
    int32_t biHeight;
    uint16_t biPlanes;
    uint16_t biBitCount;
    uint32_t biCompression;
    uint32_t biSizeImage;
    int32_t biXPixPerMeter;
    int32_t biYPixPerMeter;
    uint32_t biClrUsed;
    uint32_t biClrImporant;
} BITMAPINFOHEADER;

typedef struct BMP24bitsFORMAT {
    uint8_t blue;
    uint8_t green;
    uint8_t red;
} BMP24FORMAT;

// medain_axis_RGB24.cpp
// 2024/01/09 by marsee
// 2024/01/21 : outs の 25 ビット目に tlast を割り当てた

#include <cstdint>
#include <stdint.h>
#include <ap_int.h>
#include <hls_stream.h>

constexpr int size = 3;

struct pix_st{
    uint32_t pix;
    uint32_t index;
};

const char BMP_FILE_NAME[] = "test2.bmp";
const char MEDIAN_FILE_NAME[] = "median.bmp";

void median_fil(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result);
void pixel_sort(pix_st *y);
ap_uint<32> conv_rbg2y(ap_uint<32> rbg);

int median_hlsst_RGB24(hls::stream<ap_uint<24> >& ins,
        hls::stream<ap_uint<25> >& outs,
         int32_t row_size, int32_t col_size){
    ap_uint<25> madianat;
    ap_uint<24> pix;
    ap_uint<24> median;
    ap_uint<24> val;

    ap_int<32> line_buf[2][1920];
    ap_int<32> pix_mat[size][size];

    LOOP_Y: for(int y=0; y<row_size; y++){
        LOOP_X: for(int x=0; x<col_size; x++){
            pix = ins.read(); // AXI4-Stream からの入力

            LOOP_PIX_MAT_K: for(int k=0; k<3; k++){
                LOOP_PIX_MAT_M: for(int m=0; m<2; m++){
                    pix_mat[k][m] = pix_mat[k][m+1];
                }
            }
            pix_mat[0][2] = line_buf[0][x];
            pix_mat[1][2] = line_buf[1][x];
            ap_int<32> y_val = pix;
            pix_mat[2][2] = y_val;

            line_buf[0][x] = line_buf[1][x];    // 行の入れ替え
            line_buf[1][x] = y_val;

            median_fil(pix_mat, val);
            median = val;
            if(x<2 || y<2)
                median = 0;

            madianat = (ap_uint<25>)median;
            if(y==(row_size-1) && x==(col_size-1))
                madianat |= 0x1000000; // tlast を加えた

            outs.write(madianat);
        }
    }
    return(0);
}

// median filter
//
// x0y0 x1y0 x2y0
// x0y1 x1y1 x2y1
// x0y2 x1y2 x2y2
//
void median_fil(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result){
    pix_st pixst[size*size];
    uint32_t index;

    for(int i=0; i<size*size; i++){
        pixst[i].pix = (uint32_t)conv_rbg2y(pix_mat[i/size][i%size]);
        pixst[i].index = i;
    }

    pixel_sort(pixst);
    
    index = pixst[4].index; // 中央値
    result = (ap_uint<24>)pix_mat[index/size][index%size];
}

// pixel_sort()
// bubble sort
// ”メジアン(中央値)、範囲(レンジ)、ヒストグラムを求める”参照
// https://cgengo.sakura.ne.jp/arg04.html
void pixel_sort(pix_st *y){
#pragma HLS ARRAY_PARTITION variable=y dim=1 complete
    pix_st tmp;

    for(int i=1; i<size*size; i++){
        for(int j=0; j<size*size-i; j++){
            if(y[j].pix < y[j+1].pix){
                tmp = y[j];
                y[j] = y[j+1];
                y[j+1] = tmp;
            }
        }
    }
}

// RBGからYへの変換
// RBGのフォーマットは、{R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
ap_uint<32> conv_rbg2y(ap_uint<32> rbg){
    ap_uint<32> r, g, b, y_f;
    ap_uint<32> y;

    b = rbg & 0xff;
    g = (rbg>>8) & 0xff;
    r = (rbg>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

int main(){
    hls::stream<ap_uint<24>> ins;
    hls::stream<ap_uint<25>> outs;
    BITMAPFILEHEADER bmpfhr; // BMPファイルのファイルヘッダ(for Read)
    BITMAPINFOHEADER bmpihr; // BMPファイルのINFOヘッダ(for Read)
    FILE *fbmpr, *fbmpw, *fbmpwf;
    uint32_t *rd_bmp, *hw_median;
    uint32_t blue, green, red;
    uint32_t pix, val;
    uint32_t tlast;

    if ((fbmpr = fopen(BMP_FILE_NAME, "rb")) == NULL){ // BMP ファイル をオープン
        fprintf(stderr, "Can't open %s by binary read mode\n", BMP_FILE_NAME);
        exit(1);
    }
    // bmpヘッダの読み出し
    fread(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpr);

    // ピクセルを入れるメモリをアロケートする
    if ((rd_bmp =(uint32_t *)malloc(sizeof(uint32_t) * (bmpihr.biWidth * bmpihr.biHeight))) == NULL){
        fprintf(stderr, "Can't allocate rd_bmp memory\n");
        exit(1);
    }
    if ((hw_median =(uint32_t *)malloc(sizeof(uint32_t) * (bmpihr.biWidth * bmpihr.biHeight))) == NULL){
        fprintf(stderr, "Can't allocate hw_median memory\n");
        exit(1);
    }

    // rd_bmp にBMPのピクセルを代入。その際に、行を逆転する必要がある
    for (int y=0; y<bmpihr.biHeight; y++){
        for (int x=0; x<bmpihr.biWidth; x++){
            blue = fgetc(fbmpr);
            green = fgetc(fbmpr);
            red = fgetc(fbmpr);
            rd_bmp[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] = (blue & 0xff) | ((green & 0xff)<<8) | ((red & 0xff)<<16);
        }
    }
    fclose(fbmpr);
        
    // ins に入力データを用意する
    for(int j=0; j < bmpihr.biHeight; j++){
        for(int i=0; i < bmpihr.biWidth; i++){
            pix = (uint32_t)rd_bmp[(j*bmpihr.biWidth)+i];
            ins.write(pix);
        }
    }
    
    median_hlsst_RGB24(ins, outs, bmpihr.biHeight, bmpihr.biWidth); // メディアン・フィルタ
    
    // メディアン・フィルタ処理後の値をhw_medianバッファに代入
    for (int y=0; y<bmpihr.biHeight; y++){ // 結果の画像サイズはx-2, y-2
        for (int x=0; x<bmpihr.biWidth; x++){
            val = (uint32_t)outs.read();
            if(val >= 0x1000000)
                tlast = 1;
            else
                tlast = 0;
            val &= 0xffffff;
            hw_median[y*bmpihr.biWidth+x] = val;
        }
    }
    
    // 元画像の出力結果を temp_org.bmp へ出力する
    if ((fbmpw=fopen(MEDIAN_FILE_NAME, "wb")) == NULL){
        fprintf(stderr, "Can't open %s by binary write mode\n", MEDIAN_FILE_NAME);
        exit(1);
    }
    // BMPファイルヘッダの書き込み
    fwrite(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpw);

    // RGB データの書き込み、逆順にする
    for (int y=0; y<bmpihr.biHeight; y++){
        for (int x=0; x<bmpihr.biWidth; x++){
            blue = hw_median[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] & 0xff;
            green = (hw_median[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] >> 8) & 0xff;
            red = (hw_median[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x]>>16) & 0xff;

            fputc(blue, fbmpw);
            fputc(green, fbmpw);
            fputc(red, fbmpw);
        }
    }
    fclose(fbmpw);
    free(rd_bmp);
    free(hw_median);
    
    return(0);
}


median_hlsst_RGB24.cpp を g++ コンパイラでコンパイルした。
g++ -o median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include median_hlsst_RGB24.cpp

median_hlsst_RGB24 実行形式ファイルが生成された。

ノイズ入りの test2.bmp ファイルを用意した。
bambu_186_240110.jpg

median_hlsst_RGB24 を実行した。
./median_hlsst_RGB24

median.bmp ファイルが生成された。
median.bmp を見ると、ノイズが除去されているのが分かった。
bambu_189_240110.jpg
  1. 2024年01月22日 04:42 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる6

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる5”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、bit ファイルと hwh ファイルを ZUBoard 1CG の PYNQ Linux の Jupyter Notebook 上にアップロードして動作を確認したが、dma.recvchannel.wait() でエラーになった。今回は、ILA ダッシュボードで波形を観測したところ、問題なく各モジュールが動作していたので、そ~ベル・フィルタの出力画像を確認したところ、問題なく画像が表示された。多分、Bambu で作成したメディアン・フィルタ IP からTLAST が出力されないのが問題のようだ?

ILA ダッシュボードで median_hlsst_RGB24_0 の outs_write の立ち上がりでトリガを掛けた。
bambu_250_240121.png

問題なく、トランザクションが行われているようだ。

次に、sobel_axis_RGB24_0 の TVALID でトリガを掛けた。
bambu_251_240121.png

こちらも問題なく、トランザクションが行われているようだ。

ここまで問題なかったので、axi_dma_0 の S2MM の波形を観察する。
axi_dma_0 の S2MM の WVALID でトリガを掛けた。
bambu_252_240121.png
bambu_253_240121.png
bambu_254_240121.png

う〜ん。良さそうだ。。。

ここまで動作しているとなると、最後の TLAST が axi_dma_0 に入力されないという不具合だと思うので、ソーベル・フィルタ出力は正常に出力されているはずだ。
Jupyter Notebook の plt.imshow() のところに、sobel_image = Image.fromarray(out_buffer) を追加して、実行してみると、ソーベル・フィルタ画像が表示できた。
bambu_255_240121.jpg

つまり、予想通り、最後の TLAST が axi_dma_0 に入力されないという不具合だったようだ。
  1. 2024年01月21日 05:07 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる5

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる4”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、System ILA を追加するのを忘れていたので、System ILA を追加して、もう一度、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。今回は、前回作成した bit ファイルと hwh ファイルを ZUBoard 1CG の PYNQ Linux の Jupyter Notebook 上にアップロードして動作を確認したが、dma.recvchannel.wait() でエラーになった。

ZUBoard 1CG で PYNQ Linux を起動して、ホスト・パソコンの Chrome ブラウザで PYNQ Linux の Jupyter Notebook を表示した。
bambu_median ディレクトリを作成し、bit ファイルと hwh ファイルをアップロードした。
bambu_median_wrapper.bit を bambu_median.bit に名前を変更した。
ノイズ付きの画像ファイル test2.jpg を他のディレクトリからコピーした。

bambu_median.ipynb ファイルを作成した。
Python コードを示す。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from pynq import allocate, Overlay

bambu_median = Overlay("./bambu_median.bit")

dma = bambu_median.axi_dma_0
median_reg = bambu_median.median_reg_0
sobel = bambu_median.sobel_axis_RGB24_0

image_path = "./test2.jpg"
original_image = Image.open(image_path)

canvas = plt.gcf()
size = canvas.get_size_inches()
canvas.set_size_inches(size*2)

width, height = original_image.size
print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(original_image)

in_buffer = allocate(shape=(height, width, 3), 
                           dtype=np.uint8, cacheable=1)
out_buffer = allocate(shape=(height, width, 3), 
                            dtype=np.uint8, cacheable=1)
                            
def run_kernel():
    dma.sendchannel.transfer(in_buffer)
    dma.recvchannel.transfer(out_buffer)
    median_reg.register_map.start_p = 1
    median_reg.write(0x00,0x01) # start
    median_reg.register_map.start_p = 0
    median_reg.write(0x00,0x01) # start
    sobel.write(0x00,0x01) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()

print(height)
print(width)

median_reg.register_map.rows = height
median_reg.register_map.cols = width
median_reg.register_map.start_p = 0

sobel.register_map.row_size = height
sobel.register_map.col_size = width
#sobel.register_map.function_r = 2 # ORG_IMGwAxiDma
sobel.register_map.function_r = 3 # SOBELwAxiDma

run_kernel()
sobel_image = Image.fromarray(out_buffer)

print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(sobel_image)

del in_buffer
del out_buffer


bambu_median ディレクトリを示す。
bambu_246_240120.png

bambu_median.ipynb を実行した。
bambu_247_240120.png
bambu_248_240120.jpg
bambu_249_240120.png

dma.recvchannel.wait() で”RuntimeError: DMA channel not started”だった。
  1. 2024年01月20日 19:03 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる4

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる3”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、HDL ラッパー・ファイルを生成し、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。今回は、System ILA を追加するのを忘れていたので、System ILA を追加して、もう一度、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。

回路にデバッグのための System ILA を追加する。
axi_dma_0 の M_AXI_MM2S, M_AXI_S2MM の AXI4 インターフェースと、median_hlsst_RGB24_0 の clock, reset 以外の信号、sobel_axis_RGB24_0 の outs にDebug を指定して、System ILA を追加した。
bambu_243_240119.png

Address Editor を示す。
bambu_244_240119.png

論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、成功した。
Project Summary を示す。
bambu_245_240119.png

前回から、リソース使用量が増えている。

HDL/2023.2/zub1cg/bambu_median/bambu_median.gen/sources_1/bd/bambu_median/hw_handoff ディレクトリに bambu_median.hwh が再度、生成された。

HDL/2023.2/zub1cg/bambu_median/bambu_median.runs/impl_1 ディレクトリに bambu_median_wrapper.bit がさいs度、生成された。
  1. 2024年01月19日 05:09 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる3

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる2”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、bambu_median ブロック・デザインを完成させた。今回は、HDL ラッパー・ファイルを生成し、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。

Vivado の Sources ウインドウのタブをクリックし、Sources ウインドウに移った。
bambu_median_i ブロック・デザインを右クリックし、右クリックメニューから Create HDL Wrapper... を選択し、HDL ラッパー・ファイルの bambu_medain_wrapper.v を生成した。
bambu_237_240117.png

現在、median_hlsst_RGB24.v がトップに設定されているので、bambu_medain_wrapper.v をトップに設定する必要がある。
bambu_medain_wrapper.v を右クリックし、右クリックメニューから Set as Top を選択した。
bambu_medain_wrapper.v がトップになった。
bambu_238_240117.png

これで、論理合成を行うことができる。
Vivado の Flow Navigator の PROGRAM AND DEBUG -> Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行った。
しかし、長い時間、論理合成を行っていたが、エラーになった。
原因を追求したところ、IP Catalog に間違って不正な IP が入っていたので、それを削除した。
bambu_239_240117.png

もう一度、論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、成功した。
Project Summary を示す。
bambu_240_240117.png

HDL/2023.2/zub1cg/bambu_median/bambu_median.gen/sources_1/bd/bambu_median/hw_handoff ディレクトリに bambu_median.hwh が生成された。
bambu_242_240117.png

HDL/2023.2/zub1cg/bambu_median/bambu_median.runs/impl_1 ディレクトリに bambu_median_wrapper.bit が生成された。
bambu_241_240117.png
  1. 2024年01月18日 04:22 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる2

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる1”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、Vivado 2023.2 で ZUBoard 1CG 用の bambu_median プロジェクトを作成し、ブロック・デザインを作成する前の準備を行って、bambu_median ブロック・デザインを作成し、median_hlsst_RGB24.v をブロック・デザインに追加した。今回は、bambu_median ブロック・デザインを完成させた。

bambu_median ブロック・デザインを完成させた。
bambu_230_240117.png

zynq_ultra_ps_e_0 の設定を変更した。
PS-PL Interfaces -> Master Interface の AXI HPM1 FPD のチェックを外して、AXI HPM0 FPD のみとした。
Slave Interface の AXI HPC0 FPD のチェックを入れた。
bambu_231_240117.png

axi_dma_0 の設定を変更した。
Enable Scatter Gather Engine のチェックを外した。
Width of Buffer Length Register (8 - 26) を 26 bits に変更した。
bambu_232_240117.png

axis_dwidth_converter_0 の設定を変更した。
Slave Interface TDATA Width (bytes) を 4 バイトに設定した。
Master Interface TDATA Width (bytes) を 3 バイトに設定した。
bambu_233_240117.png

axis_subset_converter_0 の設定を変更した。
Slave Interface Signal Properties の TDATA Width (bytes) を 3 バイトに設定した。
Master Interface Signal Properties の TDATA Width (bytes) を 3 バイトに設定した。
TDATA Remap String に tdata[7:0], tdata[15:8], tdata[23:16] を設定した。
bambu_234_240117.png

axis_subset_converter_1 の設定を変更した。
Slave Interface Signal Properties の TDATA Width (bytes) を 3 バイトに設定した。
Master Interface Signal Properties の TDATA Width (bytes) を 3 バイトに設定した。
TDATA Remap String に tdata[7:0], tdata[15:8], tdata[23:16] を設定した。
bambu_235_240117.png

axis_dwidth_converter_0 の設定を変更した。
Slave Interface TDATA Width (bytes) を 3 バイトに設定した。
Master Interface TDATA Width (bytes) を 4 バイトに設定した。
bambu_236_240117.png
  1. 2024年01月17日 05:14 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる1

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたい。
Vivado 2023.2 で ZUBoard 1CG 用の bambu_median プロジェクトを作成し、Bambu で高位合成した median_hlsst_RGB24 を使った bambu_median ブロック・デザインを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行ってビット・ファイルを作成する。
今回は、Vivado 2023.2 で ZUBoard 1CG 用の bambu_median プロジェクトを作成し、ブロック・デザインを作成する前の準備を行って、bambu_median ブロック・デザインを作成し、median_hlsst_RGB24.v をブロック・デザインに追加した。

Vivado 2023.2 で ZUBoard 1CG 用の bambu_median プロジェクトを作成した。
bambu_225_240115.png

以前の”RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.2 で作成する3”のソースコードの”RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2022.1 で作成する2”で作成した sobel_axis_RGB24 IP を bambu_median ディレクトリにコピーした。

bambu_median ディレクトリの下に median_reg ディレクトリを作成し、”Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する3”で作成した median_reg IP を コピーした。

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する2”で作成したメディアン・フィルタの Verilog HDL ファイルの median_hlsst_RGB24.v を bambu_median ディレクトリの下にコピーした。
bambu_226_240115.png

sobel_axis_RGB24 IP と median_reg IP を IP Catalog に登録する。
Vivado の Flow Navigtor から PROJECT MANAGER -> IP Catalog をクリックする。
IP Catalog ウインドウが開く。
IP のところで、右クリックし、右クリックメニューから Add Repository... を選択し、ファイルのダイアログから sobel_axis_RGB24, median_reg を選択する。
obel_axis_RGB24, median_reg が IP として IP Catalog に登録された。
bambu_227_240115.png

これでブロック・デザインを作成する準備が整った。
Vivado の Flow Navigtor から IP INTEGRATOR -> Create Block Design をクリックし、bambu_median ブロック・デザインを作成した。
bambu_228_240115.png

File メニューから Add Sources... を選択し、median_hlsst_RGB24.v をプロジェクトに追加した。
Sources ウインドウの Desgin Sources に追加された median_hlsst_RGB24.v を bambu_median ブロック・デザインの Diagram ウインドウにドラック & ドロップして、追加した。
bambu_229_240115.png
  1. 2024年01月16日 04:40 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する3

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する2”の続き。

Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したいということで、前回は、median_reg.cpp と median_reg_tb.cpp を貼って、C シミュレーションと C コードの合成を行った。今回は、C/RTL 協調シミュレーションと Package, Implementation を行った。

C/RTL 協調シミュレーションを行う。
左の VITIS COMPONENT ウインドウの median_reg -> Settings -> hls_config.cfg をクリックし、C/RTL Cosimulation の trace_level を all に設定した。
bambu_218_240115.png

C/RTL 協調シミュレーションが終了した。
bambu_219_240115.png

FLOW ウインドウの C/RTL COSIMULATION -> REPORTS -> Cosimulation をクリックして、レポートを表示した。
bambu_220_240115.png

レイテンシは 1 クロックだった。

C/RTL 協調シミュレーションの波形を確認する。
FLOW ウインドウの C/RTL COSIMULATION -> REPORTS -> Wave Viewer をクリックした。
bambu_221_240115.png

なお、s_axi_control_WDATA と col_size, row_size 信号は十進数に変換してある。

FLOW -> PACKAGE -> Run をクリックして、Package を行った。
Summary を示す。
bambu_222_240115.png

median_reg/median_reg/hls/impl/ip ディレクトリに xilinx_com_hls_median_reg_1_0.zip が生成された。

hls_config.cfg をクリックし、Implementation の flow はデフォルトで Run full implementation (RTL synthesis, place and routte) に設定されていた。これで問題無い。
FLOW -> IMPLEMENTATION -> Run をクリックした。
Implementation が終了し、成功した。
bambu_223_240115.png

FLOW -> IMPLEMENTATION -> Place and Route をクリックした。
bambu_224_240115.png

CP achieved post-implementation の値は、1.529 ns で全く問題ない。
  1. 2024年01月15日 04:33 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する2

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する1”の続き。

Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したいということで、前回は、Vitis 2023.2 で ZUBoard 1CG 用の HLS Development プロジェクトの median_reg プロジェクトを作成した。今回は、median_reg.cpp と median_reg_tb.cpp を貼って、C シミュレーションと C コードの合成を行った。

まずは、median_reg.cpp を示す。

// median_reg.cpp
// 2024/01/13 by marsee

#include <cstdint>
#include <stdint.h>
#include <ap_int.h>

void median_reg(int32_t rows, int32_t cols, int32_t &row_size, int32_t &col_size,
    ap_uint<1> start_p, ap_uint<1> &start_port){
#pragma HLS INTERFACE mode=ap_none port=start_port register
#pragma HLS INTERFACE mode=s_axilite port=start_p
#pragma HLS INTERFACE mode=s_axilite port=return
#pragma HLS INTERFACE mode=ap_none port=col_size register
#pragma HLS INTERFACE mode=ap_none port=row_size register
#pragma HLS INTERFACE mode=s_axilite port=cols
#pragma HLS INTERFACE mode=s_axilite port=rows
    row_size = rows;
    col_size = cols;
    start_port = start_p;                  
}


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

// median_reg_tb.cpp
// 2024/01/13 by marsee

#include <stdio.h>
#include <stdint.h>
#include <ap_int.h>

void median_reg(int32_t rows, int32_t cols, int32_t &row_size, int32_t &col_size,
    ap_uint<1> start_p, ap_uint<1> &start_port);

int main(){
    int32_t rows, cols;
    int32_t row_size, col_size;
    ap_uint<1> start_p, start_port;

    rows = 600;
    cols = 800;
    start_p = 1;

    median_reg(rows, cols, row_size, col_size, start_p, start_port);
    printf("rows_size = %d, col_size = %d, start_port = %d\n"
        , row_size, col_size, start_port);

    return(0);
}


C シミュレーションを行った。
”rows_size = 600, col_size = 800, start_port = 1”が表示された。
bambu_212_240113.png

C コードの合成を行う前に、合成するトップの関数を指定した。
Vitis Unified IDE 2023.2 で、左の VITIS COMPONENTS の median_reg -> Settings -> hls_config.cfg をクリックした。
C Synthesis sources をクリックし、top に median_reg を設定した。
bambu_213_240114.png

FLOW の C SYNTHESIS -> Run をクリックして、C コードの合成を行って成功した。
bambu_214_240114.png

FLOW の C SYNTHESIS -> REPORTS -> Synthesis を表示した。
rows, cols, start_p の各レジスタが実装された。
bambu_215_240114.png

Vitis Unified IDE 2023.2 で、左の VITIS COMPONENTS の median_reg -> Output -> syn -> verilog に median_reg.v と median_reg_control_s_axi.v が生成されていた。
median_reg.v には、row_size, col_size, start_port の出力ポートが実装されている。
median_reg.v を示す。
bambu_216_240114.png

median_reg_control_s_axi.v には、0x10 番地に rows レジスタが、0x18 番地に cols レジスタが、そして、0x20 番地に start_p レジスタが実装されている。
bambu_217_240114.png
  1. 2024年01月14日 05:03 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する1

Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したい。というのも、Bambu では画像の縦、横のピクセル数の設定を入力ポートでしか設定できなようだからだ。つまり、プロセッサから自由に画像サイズを設定したいということで、Vitis HLS 2023.2 で作成することにした。

使用するボードは ZUBoard 1CG とする。PYNQ を使用して、回路の動作を確認する予定だ。
久しぶりに Vitis 2023.2 の HLS Development を使用するので、丁寧にプロジェクトを作っていこう。

まずは Vitis 2023.2 を起動した。
HLS Development の Create Component をクリックして、HLS のプロジェクトを作成する。
bambu_203_240113.png

Name and Location 画面
component name に median_reg を入力した。
bambu_204_240113.png

Configuration File 画面
デフォルトのままとした。
bambu_205_240113.png

Source File 画面
デフォルトのままとした。
bambu_206_240113.png

Part 画面
図のように設定し、xczu1cg-sbva484-1-e を選択した。
bambu_207_240113.png

Edit Settings 画面
clock に 10ns 、clock_uncertainty に 27% を入力した。clock_uncertainty に値を入力しないとプロジェクト作成時にバグるので、設定すること。
bambu_208_240113.png

Summary 画面
Finish ボタンをクリックした。
bambu_209_240113.png

median_reg プロジェクトが生成された。
bambu_210_240113.png
  1. 2024年01月13日 16:35 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する3

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する2”の続き。

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成してみようということで、前回は、median_hlsst_RGB24.cpp を Bambu で高位合成して、median_hlsst_RGB24.v を生成した。今回は、前回、シミュレーションができなかったので、Cocotb でシミュレーションを行った。

前回、シミュレーションができなかったので、Cocotb でシミュレーションを行う。
Python のテストベンチは OpenCV を使用して、80 x 60 ピクセルの test2.jpg をメモリにロードし、それにメディアン・フィルタを掛けて median.jpg ファイルに出力する。
test2.jpg はノイズの入った画像となっている。
PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリを作成し、移動して、作業を行った。

まずは、Makefile から示す。

# Makefile
# 2024/01/11 by marsee

SIM ?= icarus

VERILOG_SOURCES = $(shell pwd)/median_hlsst_RGB24.v
TOPLEVEL = median_hlsst_RGB24
MODULE = test_median

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


テストベンチの test_median.py を示す。

# test_median.py
# 2024/01/11 by marsee

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

import cv2
import numpy as np

@cocotb.test()
async def test_median(dut):
    img = cv2.imread('test2.jpg')
    img2 = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
    
    dut.row_size.value = img.shape[0]
    dut.col_size.value = img.shape[1]
    
    dut.reset.value = 0 # Reset
    dut.start_port.value = 0

    clock = Clock(dut.clock, 10, units="ns")  # Create a 10ns period clock on port clk
    cocotb.start_soon(clock.start())  # Start the clock

    await Timer(21, units='ns')

    dut.reset.value = 1 # Normal Operation
    dut.ins_empty_n.value = 1
    dut.outs_full_n.value = 1

    for i in range(3):
        await RisingEdge(dut.clock)
    await Timer(1, units='ns')
    
    dut.start_port.value = 1
    for row in range(img.shape[0]):
        for col in range(img.shape[1]):
            pixel = int(img[row, col, 0]) + int((img[row, col, 1] << 8)) + int((img[row, col, 2] << 16)) # RGB
            dut.ins_dout.value = pixel
            if i == 1:
                dut.start_port = 0
            await RisingEdge(dut.clock)
            await Timer(1, units='ns')
            while dut.ins_read.value == 0:
                await RisingEdge(dut.clock)
                await Timer(1, units='ns')
            #print("row = {0}, col = {1}".format(row, col))
            img2[row, col, 2] = (int(dut.outs_din.value) / 65536) % 256
            img2[row, col, 1] = (int(dut.outs_din.value) / 256) % 256
            img2[row, col, 0] = int(dut.outs_din.value) % 256
    
    for i in range(100):
        await RisingEdge(dut.clock)
        await Timer(1, units='ns')
    
    cv2.imwrite('median.jpg', img2)


前回生成された median_hlsst_RGB24.v を PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリにコピーした。
シミュレーション時に VCD ファイルを出力するため、median_hlsst_RGB24.v の endmodule の前に以下の文を追加した。

// the "macro" to dump signals
`ifdef COCOTB_SIM
initial begin
  $dumpfile ("median_hlsst_RGB24.vcd");
  $dumpvars (0, median_hlsst_RGB24);
  #1;
end
`endif


bambu_195_240111.png

ノイズ入 80 x 60 ピクセルの test2.jpg を加えた現在の PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリを示す。
bambu_194_240111.png

PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリに行って、make を実行し、シミュレーションを行った。
bambu_196_240111.png

bambu_197_240111.png

成功した。
ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb' に入ります
/usr/bin/iverilog -o sim_build/sim.vvp -D COCOTB_SIM=1 -s median_hlsst_RGB24 -f sim_build/cmds.f -g2012   /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb/median_hlsst_RGB24.v
rm -f results.xml
MODULE=test_median TESTCASE= TOPLEVEL=median_hlsst_RGB24 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 11.0 (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 1704914826
     0.00ns INFO     cocotb.regression                  Found test test_median.test_median
     0.00ns INFO     cocotb.regression                  running test_median (1/1)
VCD info: dumpfile median_hlsst_RGB24.vcd opened for output.
674111.00ns INFO     cocotb.regression                  test_median passed
674111.00ns INFO     cocotb.regression                  **************************************************************************************
                                                        ** TEST                          STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        **************************************************************************************
                                                        ** test_median.test_median        PASS      674111.00          68.94       9777.69  **
                                                        **************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0             674111.00          79.22       8509.74  **
                                                        **************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb' から出ます


シミュレーション後の PandA-bambu-2023.1/examples/median_hlsst_RGB24/cocotb ディレクトリを示す。
bambu_202_240111.png

median.jpg が生成されていた。
median.jpg を元画像の test2.jpg と比較してみよう。
bambu_199_240111.png

ノイズは除去されているようだ。

median_hlsst_RGB24.vcd ファイルが生成されたので、GTKWave で確認してみた。
bambu_200_240111.png

拡大する。
bambu_201_240111.png

1 ピクセルの処理に 14 クロック掛かっているようだ。遅い。。。
  1. 2024年01月12日 05:07 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する2

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する1”の続き。

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成してみようということで、前回は、C++ ソースコードの median_hlsst_RGB24.cpp を示して、g++ コンパイラでコンパイルし動作を確認した。今回は、median_hlsst_RGB24.cpp を Bambu で高位合成して、median_hlsst_RGB24.v を生成した。

median_hlsst_RGB24.cpp を Bambu で高位合成した。
bambu median_hlsst_RGB24.cpp --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1
bambu_190_240111.png

bambu_191_240111.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24$ bambu median_hlsst_RGB24.cpp --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1
 ==  Bambu executed with: /tmp/.mount_bambumuXWS6/usr/bin/bambu --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1 median_hlsst_RGB24.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z18median_hlsst_RGB24R10ac_channelI6ac_intILi24ELb0EEES3_ii
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 24
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 24
      Alignment : 8
  Analyzed function _Z18median_hlsst_RGB24R10ac_channelI6ac_intILi24ELb0EEES3_ii

  Functions to be synthesized:
    median_hlsst_RGB24


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function median_hlsst_RGB24:
    Number of complex operations: 26
    Number of complex operations: 26
  Time to perform module allocation: 0.38 seconds


  Scheduling Information of function median_hlsst_RGB24:
    Number of control steps: 21
    Minimum slack: 0.16582799699998785
    Estimated max frequency (MHz): 101.686242593168
  Time to perform scheduling: 0.14 seconds


  State Transition Graph Information of function median_hlsst_RGB24:
    Number of states: 21
    Done port is registered
  Time to perform creation of STG: 0.07 seconds


  Easy binding information for function median_hlsst_RGB24:
    Bound operations:168/842
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function median_hlsst_RGB24:
    Number of storage values inserted: 115
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.01 seconds
  Weight computation completed in 0.02 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 111 registers(LB:48)
  Time to perform register binding: 0.00 seconds


  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 111 registers(LB:48)
  Time to perform register binding: 0.01 seconds

  Clique covering computation completed in 0.01 seconds

  Module binding information for function median_hlsst_RGB24:
    Number of modules instantiated: 826
    Number of performance conflicts: 2485
    Estimated resources area (no Muxes and address logic): 9694
    Estimated area of MUX21: 349
    Total estimated area: 10043
    Estimated number of DSPs: 0
  Time to perform module binding: 0.05 seconds


  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 111 registers(LB:48)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function median_hlsst_RGB24:
    Number of allocated multiplexers (2-to-1 equivalent): 24
  Time to perform interconnection binding: 0.02 seconds

  Total number of flip-flops in function median_hlsst_RGB24: 2328
error -> Value of ins is missing in test vector

Please report bugs to <panda-info@polimi.it>


PandA-bambu-2023.1/examples/median_hlsst_RGB24 ディレクトリの様子を示す。
bambu_192_240111.png

median_hlsst_RGB24.v が生成されている。
bambu_193_240111.png

median_hlsst_RGB24 モジュールの入力ポート、出力ポートを示す。

  // IN
  input clock;
  input reset;
  input start_port;
  input [23:0] ins_dout;
  input [31:0] row_size;
  input [31:0] col_size;
  input ins_empty_n;
  input outs_full_n;
  // OUT
  output done_port;
  output [31:0] return_port;
  output ins_read;
  output [23:0] outs_din;
  output outs_write;


PandA-bambu-2023.1/examples/median_hlsst_RGB24/HLS_output/simulation ディレクトリは空で、VCD ファイルが生成されていなかった。
  1. 2024年01月11日 03:42 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する1

Bambu で hls stream インターフェースのメディアン・フィルタを高位合成してみよう。今回は、C++ ソースコードの median_hlsst_RGB24.cpp を示して、g++ コンパイラでコンパイルし、動作を確認した。

PandA-bambu-2023.1/examples ディレクトリに median_hlsst_RGB24 ディレクトリを作成した。
PandA-bambu-2023.1/examples/median_hlsst_RGB24 ディレクトリに行った。

median_hlsst_RGB24.cpp を作成した。
Bambu の hls stream インターフェースで入力と出力を行う。今回は、簡単化のため、画像をスルーで出力するモードは省いてある。
main() 関数を持っていて、そのままコンパイルが可能だ。
median_hlsst_RGB24.cpp を示す。

// median_hlsst_RGB24.cpp
// 2024/01/09 by marsee

// bmp_header.h
// BMP ファイルフォーマットから引用させて頂きました
// http://www.kk.iij4u.or.jp/~kondo/bmp/
//
// 2017/05/04 : takseiさんのご指摘によりintX_tを使った宣言に変更。takseiさんありがとうございました
//              変数の型のサイズの違いによってLinuxの64ビット版では動作しなかったためです
//              http://marsee101.blog19.fc2.com/blog-entry-3354.html#comment2808
//

#include <stdio.h>
#include <stdint.h>

// BITMAPFILEHEADER 14bytes
typedef struct tagBITMAPFILEHEADER {
    uint16_t bfType;
    uint32_t bfSize;
    uint16_t bfReserved1;
    uint16_t bfReserved2;
    uint32_t bfOffBits;
} BITMAPFILEHEADER;

// BITMAPINFOHEADER 40bytes
typedef struct tagBITMAPINFOHEADER{
    uint32_t biSize;
    int32_t biWidth;
    int32_t biHeight;
    uint16_t biPlanes;
    uint16_t biBitCount;
    uint32_t biCompression;
    uint32_t biSizeImage;
    int32_t biXPixPerMeter;
    int32_t biYPixPerMeter;
    uint32_t biClrUsed;
    uint32_t biClrImporant;
} BITMAPINFOHEADER;

typedef struct BMP24bitsFORMAT {
    uint8_t blue;
    uint8_t green;
    uint8_t red;
} BMP24FORMAT;

// medain_axis_RGB24.cpp
// 2024/01/09 by marsee
//

#include <cstdint>
#include <stdint.h>
#include <ap_int.h>
#include <hls_stream.h>

constexpr int size = 3;

struct pix_st{
    uint32_t pix;
    uint32_t index;
};

const char BMP_FILE_NAME[] = "test2.bmp";
const char MEDIAN_FILE_NAME[] = "median.bmp";

void median_fil(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result);
void pixel_sort(pix_st *y);
ap_uint<32> conv_rbg2y(ap_uint<32> rbg);

int median_hlsst_RGB24(hls::stream<ap_uint<24> >& ins,
        hls::stream<ap_uint<24> >& outs,
         int32_t row_size, int32_t col_size){
    ap_uint<24> pix;
    ap_uint<24> median;
    ap_uint<24> val;

    ap_int<32> line_buf[2][1920];
    ap_int<32> pix_mat[size][size];

    LOOP_Y: for(int y=0; y<row_size; y++){
        LOOP_X: for(int x=0; x<col_size; x++){
            pix = ins.read(); // AXI4-Stream からの入力

            LOOP_PIX_MAT_K: for(int k=0; k<3; k++){
                LOOP_PIX_MAT_M: for(int m=0; m<2; m++){
                    pix_mat[k][m] = pix_mat[k][m+1];
                }
            }
            pix_mat[0][2] = line_buf[0][x];
            pix_mat[1][2] = line_buf[1][x];
            ap_int<32> y_val = pix;
            pix_mat[2][2] = y_val;

            line_buf[0][x] = line_buf[1][x];    // 行の入れ替え
            line_buf[1][x] = y_val;

            median_fil(pix_mat, val);
            median = val;
            if(x<2 || y<2)
                median = 0;

            outs.write(median);
        }
    }
    return(0);
}

// median filter
//
// x0y0 x1y0 x2y0
// x0y1 x1y1 x2y1
// x0y2 x1y2 x2y2
//
void median_fil(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result){
    pix_st pixst[size*size];
    uint32_t index;

    for(int i=0; i<size*size; i++){
        pixst[i].pix = (uint32_t)conv_rbg2y(pix_mat[i/size][i%size]);
        pixst[i].index = i;
    }

    pixel_sort(pixst);
    
    index = pixst[4].index; // 中央値
    result = (ap_uint<24>)pix_mat[index/size][index%size];
}

// pixel_sort()
// bubble sort
// ”メジアン(中央値)、範囲(レンジ)、ヒストグラムを求める”参照
// https://cgengo.sakura.ne.jp/arg04.html
void pixel_sort(pix_st *y){
#pragma HLS ARRAY_PARTITION variable=y dim=1 complete
    pix_st tmp;

    for(int i=1; i<size*size; i++){
        for(int j=0; j<size*size-i; j++){
            if(y[j].pix < y[j+1].pix){
                tmp = y[j];
                y[j] = y[j+1];
                y[j+1] = tmp;
            }
        }
    }
}

// RBGからYへの変換
// RBGのフォーマットは、{R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
ap_uint<32> conv_rbg2y(ap_uint<32> rbg){
    ap_uint<32> r, g, b, y_f;
    ap_uint<32> y;

    b = rbg & 0xff;
    g = (rbg>>8) & 0xff;
    r = (rbg>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

int main(){
    hls::stream<ap_uint<24>> ins, outs;
    BITMAPFILEHEADER bmpfhr; // BMPファイルのファイルヘッダ(for Read)
    BITMAPINFOHEADER bmpihr; // BMPファイルのINFOヘッダ(for Read)
    FILE *fbmpr, *fbmpw, *fbmpwf;
    uint32_t *rd_bmp, *hw_median;
    uint32_t blue, green, red;
    uint32_t pix, val;

    if ((fbmpr = fopen(BMP_FILE_NAME, "rb")) == NULL){ // BMP ファイル をオープン
        fprintf(stderr, "Can't open %s by binary read mode\n", BMP_FILE_NAME);
        exit(1);
    }
    // bmpヘッダの読み出し
    fread(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpr);

    // ピクセルを入れるメモリをアロケートする
    if ((rd_bmp =(uint32_t *)malloc(sizeof(uint32_t) * (bmpihr.biWidth * bmpihr.biHeight))) == NULL){
        fprintf(stderr, "Can't allocate rd_bmp memory\n");
        exit(1);
    }
    if ((hw_median =(uint32_t *)malloc(sizeof(uint32_t) * (bmpihr.biWidth * bmpihr.biHeight))) == NULL){
        fprintf(stderr, "Can't allocate hw_median memory\n");
        exit(1);
    }

    // rd_bmp にBMPのピクセルを代入。その際に、行を逆転する必要がある
    for (int y=0; y<bmpihr.biHeight; y++){
        for (int x=0; x<bmpihr.biWidth; x++){
            blue = fgetc(fbmpr);
            green = fgetc(fbmpr);
            red = fgetc(fbmpr);
            rd_bmp[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] = (blue & 0xff) | ((green & 0xff)<<8) | ((red & 0xff)<<16);
        }
    }
    fclose(fbmpr);
        
    // ins に入力データを用意する
    for(int j=0; j < bmpihr.biHeight; j++){
        for(int i=0; i < bmpihr.biWidth; i++){
            pix = (uint32_t)rd_bmp[(j*bmpihr.biWidth)+i];
            ins.write((ap_uint<24>)pix);
        }
    }
    
    median_hlsst_RGB24(ins, outs, bmpihr.biHeight, bmpihr.biWidth); // メディアン・フィルタ
    
    // メディアン・フィルタ処理後の値をhw_medianバッファに代入
    for (int y=0; y<bmpihr.biHeight; y++){ // 結果の画像サイズはx-2, y-2
        for (int x=0; x<bmpihr.biWidth; x++){
            val = (uint32_t)outs.read();
            hw_median[y*bmpihr.biWidth+x] = val;
        }
    }
    
    // 元画像の出力結果を temp_org.bmp へ出力する
    if ((fbmpw=fopen(MEDIAN_FILE_NAME, "wb")) == NULL){
        fprintf(stderr, "Can't open %s by binary write mode\n", MEDIAN_FILE_NAME);
        exit(1);
    }
    // BMPファイルヘッダの書き込み
    fwrite(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpw);

    // RGB データの書き込み、逆順にする
    for (int y=0; y<bmpihr.biHeight; y++){
        for (int x=0; x<bmpihr.biWidth; x++){
            blue = hw_median[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] & 0xff;
            green = (hw_median[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] >> 8) & 0xff;
            red = (hw_median[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x]>>16) & 0xff;

            fputc(blue, fbmpw);
            fputc(green, fbmpw);
            fputc(red, fbmpw);
        }
    }
    fclose(fbmpw);
    free(rd_bmp);
    free(hw_median);
    
    return(0);
}


median_hlsst_RGB24.cpp を g++ コンパイラでコンパイルした。
g++ -o median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include median_hlsst_RGB24.cpp
bambu_185_240110.png

median_hlsst_RGB24 実行形式ファイルが生成された。

ノイズ入りの test2.bmp ファイルを用意した。
bambu_186_240110.jpg

median_hlsst_RGB24 を実行した。
./median_hlsst_RGB24
bambu_187_240110.png

median.bmp ファイルが生成された。
bambu_188_240110.png

median.bmp を見ると、ノイズが除去されているのが分かる。
bambu_189_240110.jpg
  1. 2024年01月10日 03:50 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の乗算コード(mult_axim.cpp)を高位合成する3

Bambu で自作の乗算コード(mult_axim.cpp)を高位合成する2”の続き。

前回は、AXI4 Master インターフェースの乗算をいろいろな最適化オプションで試してみた。コンパイラは Clang だった。今回は、コンパイラに GCC を使って、いろいろな最適化オプションを試した。

コンパイラに I386_GCC49 を使用して、Bambu で高位合成を行った。
bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_GCC49 --registered-inputs=no
bambu_175_240109.png

bambu_176_240109.png

シミュレーションは 122 クロックで終了した。

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_axim$ bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_GCC49 --registered-inputs=no
 ==  Bambu executed with: /tmp/.mount_bambu2lkBJI/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_GCC49 --registered-inputs=no mult_axim.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z4multPiS_S_
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
  Analyzed function _Z4multPiS_S_

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 32
    ADDRESS bus bitsize: 5
    SIZE bus bitsize: 6
    Code has LOADs or STOREs with unaligned accesses
    Internally allocated memory (no private memories): 0
    Internally allocated memory: 0
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function mult:
    Number of complex operations: 4
    Number of complex operations: 4
  Time to perform module allocation: 0.01 seconds


  Scheduling Information of function mult:
    Number of control steps: 7
    Minimum slack: 1.0553999979999997
    Estimated max frequency (MHz): 111.79929787541103
  Time to perform scheduling: 0.00 seconds


  State Transition Graph Information of function mult:
    Number of states: 7
    Done port is registered
  Time to perform creation of STG: 0.01 seconds


  Easy binding information for function mult:
    Bound operations:14/22
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function mult:
    Number of storage values inserted: 9
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.00 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 8 registers(LB:7)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function mult:
    Number of modules instantiated: 21
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 150
    Estimated area of MUX21: 104
    Total estimated area: 254
    Estimated number of DSPs: 3
  Time to perform module binding: 0.00 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 8 registers(LB:7)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function mult:
    Number of allocated multiplexers (2-to-1 equivalent): 7
  Time to perform interconnection binding: 0.00 seconds

  Total number of flip-flops in function mult: 225
Icarus Verilog Preprocessor version 11.0 (stable) ()

Copyright (c) 1999-2020 Stephen Williams (steve@icarus.com)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Using language generation: IEEE1800-2012,no-specify,xtypes,icarus-misc
PARSING INPUT
LOCATING TOP-LEVEL MODULES
   mult_tb_top
 ... done, 0 seconds.
ELABORATING DESIGN
 ... done, 0 seconds.
RUNNING FUNCTORS
 -F cprop ...
 ... Iteration detected 3 optimizations.
 ... Iteration detected 0 optimizations.
 ... Look for dangling constants
 ... done
 -F nodangle ...
 ... scan for dangling signal and event nodes. (scomplete=F, ecomplete=F)
 ... 1 iterations deleted 157 dangling signals and 0 events.
 ... scan for dangling signal and event nodes. (scomplete=T, ecomplete=F)
 ... 2 iterations deleted 157 dangling signals and 20 events.
 ... done
CALCULATING ISLANDS
 ... done, 0.02 seconds.
CODE GENERATION
 ... invoking target_design
 ... done, 0 seconds.
STATISTICS
lex_string: add_count=2477 hit_count=13391
Icarus Verilog version 11.0 (stable) ()

Copyright 1998-2020 Stephen Williams

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

translate: /usr/lib/x86_64-linux-gnu/ivl/ivlpp  -v -L -F"/tmp/ivrlg24740ff" -f"/tmp/ivrlg4740ff" -p"/tmp/ivrli4740ff" | /usr/lib/x86_64-linux-gnu/ivl/ivl -v -C"/tmp/ivrlh4740ff" -C"/usr/lib/x86_64-linux-gnu/ivl/vvp.conf" -- -
VCD info: dumpfile /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_axim/HLS_output//simulation/test.vcd opened for output.
VCD warning: $dumpvars: Unsupported argument type (vpiPackage)
Start reading vector           1's values from input file.

Reading of vector values from input file completed. Simulation started.
Simulation ended after                  122 cycles.

Simulation FAILED

error -> Simulation not correct!

Please report bugs to <panda-info@polimi.it>


examples/mult/mult_axim/HLS_output/simulation/test.vcd ファイルが生成された。
GTKWave で test.vcd を確認する。
なお、データは Decimal にしてある。
bambu_177_240109.png
bambu_178_240109.png

AXI4 Master の Read と Write が交互になっている。
Write と Write 間は 12 クロックだった。

次に最適化オプションの -O0 を追加した。
bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_GCC49 --registered-inputs=no -O0
bambu_179_240109.png

シミュレーションは 123 クロックで終了した。
GTKWave で test.vcd を確認する。
なお、データは Decimal にしてある。
bambu_180_240109.png
bambu_181_240109.png

Write と Write 間は最適化オプション無しと同じ 12 クロックだった。
最初に出てくるデータのレイテンシだけ増加したのだと思う。

-O1, -O2 は最適化オプション無しと同じだった。

-O3 の最適化オプションを追加して、Bambu で高位合成を行った。
bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_GCC49 --registered-inputs=no -O3
bambu_182_240109.png

シミュレーションは 111 クロックで終了した。
GTKWave で test.vcd を確認する。
なお、データは Decimal にしてある。
bambu_183_240109.png

bambu_184_240109.png

AXI4 Master の Read と Write が交互になっている。
Write と Write 間は 11 クロックだった。
GCC では、Read を全部行ってから、Write を行うことは無いようだ。

-O4, -O5 は -O3 と同様の結果だった。
  1. 2024年01月09日 04:03 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の乗算コード(mult_axim.cpp)を高位合成する2

Bambu で自作の乗算コード(mult_axim.cpp)を高位合成する1”の続き。

今回は、Bambu では AXI4-Master インターフェースの Verilog HDL コードを出力できるので、いつもの乗算コードで試してみた。今回は、AXI4 Master インターフェースの乗算をいろいろな最適化オプションで試してみた。

最適化オプション -O0 を付加して、Bambu で高位合成を行った。
bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_CLANG13 --registered-inputs=no -O0
bambu_165_240108.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_axim$ bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_CLANG13 --registered-inputs=no -O0
 ==  Bambu executed with: /tmp/.mount_bambu7pTfUq/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_CLANG13 --registered-inputs=no -O0 mult_axim.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z4multPiS_S_
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
  Analyzed function _Z4multPiS_S_

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 32
    ADDRESS bus bitsize: 5
    SIZE bus bitsize: 6
    Code has LOADs or STOREs with unaligned accesses
    Internally allocated memory (no private memories): 0
    Internally allocated memory: 0
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function mult:
    Number of complex operations: 4
    Number of complex operations: 4
  Time to perform module allocation: 0.01 seconds


  Scheduling Information of function mult:
    Number of control steps: 7
    Minimum slack: 1.0063999980000145
    Estimated max frequency (MHz): 111.19017965860404
  Time to perform scheduling: 0.01 seconds


  State Transition Graph Information of function mult:
    Number of states: 7
    Done port is registered
  Time to perform creation of STG: 0.00 seconds


  Easy binding information for function mult:
    Bound operations:11/19
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function mult:
    Number of storage values inserted: 9
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.00 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 8 registers(LB:7)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function mult:
    Number of modules instantiated: 18
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 148
    Estimated area of MUX21: 104
    Total estimated area: 252
    Estimated number of DSPs: 3
  Time to perform module binding: 0.00 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 8 registers(LB:7)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function mult:
    Number of allocated multiplexers (2-to-1 equivalent): 7
  Time to perform interconnection binding: 0.00 seconds

  Total number of flip-flops in function mult: 225
Icarus Verilog Preprocessor version 11.0 (stable) ()

Copyright (c) 1999-2020 Stephen Williams (steve@icarus.com)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Using language generation: IEEE1800-2012,no-specify,xtypes,icarus-misc
PARSING INPUT
LOCATING TOP-LEVEL MODULES
   mult_tb_top
 ... done, 0 seconds.
ELABORATING DESIGN
 ... done, 0.01 seconds.
RUNNING FUNCTORS
 -F cprop ...
 ... Iteration detected 3 optimizations.
 ... Iteration detected 0 optimizations.
 ... Look for dangling constants
 ... done
 -F nodangle ...
 ... scan for dangling signal and event nodes. (scomplete=F, ecomplete=F)
 ... 1 iterations deleted 154 dangling signals and 0 events.
 ... scan for dangling signal and event nodes. (scomplete=T, ecomplete=F)
 ... 2 iterations deleted 154 dangling signals and 20 events.
 ... done
CALCULATING ISLANDS
 ... done, 0 seconds.
CODE GENERATION
 ... invoking target_design
 ... done, 0 seconds.
STATISTICS
lex_string: add_count=2475 hit_count=13086
Icarus Verilog version 11.0 (stable) ()

Copyright 1998-2020 Stephen Williams

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

translate: /usr/lib/x86_64-linux-gnu/ivl/ivlpp  -v -L -F"/tmp/ivrlg2f8b434a" -f"/tmp/ivrlgf8b434a" -p"/tmp/ivrlif8b434a" | /usr/lib/x86_64-linux-gnu/ivl/ivl -v -C"/tmp/ivrlhf8b434a" -C"/usr/lib/x86_64-linux-gnu/ivl/vvp.conf" -- -
VCD info: dumpfile /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_axim/HLS_output//simulation/test.vcd opened for output.
VCD warning: $dumpvars: Unsupported argument type (vpiPackage)
Start reading vector           1's values from input file.

Reading of vector values from input file completed. Simulation started.
Simulation ended after                  122 cycles.

Simulation FAILED

error -> Simulation not correct!

Please report bugs to <panda-info@polimi.it>


examples/mult/mult_axim/HLS_output/simulation/test.vcd ファイルが生成された。
GTKWave で test.vcd を確認する。
なお、データは Decimal にしてある。
bambu_166_240108.png
bambu_167_240108.png

AXI4 Master の Read と Write が交互になっている。
Write と Write 間は 12 クロックだった。
Write の値が見えなかったので、拡大した。値的には問題ないようだ。
bambu_168_240108.png

最適化オプション -O1 は -O0 と同じだった。
最適化オプション -O2, -O3, -O4, -O5 は最適化オプション無しの前回と同じ結果だった。

  1. 2024年01月08日 04:45 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の乗算コード(mult_axim.cpp)を高位合成する1

Bambu では AXI4-Master インターフェースの Verilog HDL コードを出力できるので、いつもの乗算コードで試してみよう。

examples/mult ディレクトリに mult_axim ディレクトリを作成した。
examples/mult/mult_axim ディレクトリで作業を行う。
examples/mult/mult_axim ディレクトリに mult_axim.cpp と test.xml を作成した。

mult_axim.cpp を示す。

#define ARRAY_SIZE  10

#pragma HLS_interface in_x m_axi direct bundle = gmem0
#pragma HLS_interface in_y m_axi direct bundle = gmem1
#pragma HLS_interface out_z m_axi direct bundle = gmem0

void mult(int *in_x, int *in_y, int *out_z){
    int i;
    
    for(i=0; i<ARRAY_SIZE; i++){
#pragma HLS PIPELINE II=1
        out_z[i] = in_x[i] * in_y[i];
    }
}


シミュレーション用テストベンチの test.xml を示す。

<?xml version="1.0"?>
<function>
  <testbench in_x="{0,1,2,3,4,5,6,7,8,9}" in_y="{1,2,3,4,5,6,7,8,9,10}" out_z="{0,2,6,12,20,30,56,72,90}" />
</function>


Bambu で高位合成を行った。
bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_CLANG13 --registered-inputs=no
bambu_157_240107.png

bambu_158_240107.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_axim$ bambu mult_axim.cpp --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_CLANG13 --registered-inputs=no
 ==  Bambu executed with: /tmp/.mount_bambuFrhZwV/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --generate-interface=INFER --simulator=ICARUS --simulate --generate-vcd --compiler=I386_CLANG13 --registered-inputs=no mult_axim.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z4multPiS_S_
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : m_axi
      Bitwidth  : 32
      Alignment : 4
  Analyzed function _Z4multPiS_S_

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 32
    ADDRESS bus bitsize: 5
    SIZE bus bitsize: 6
    Code has LOADs or STOREs with unaligned accesses
    Internally allocated memory (no private memories): 0
    Internally allocated memory: 0
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function mult:
    Number of complex operations: 40
    Number of complex operations: 40
  Time to perform module allocation: 0.04 seconds


  Scheduling Information of function mult:
    Number of control steps: 23
    Minimum slack: 1.0063999990000003
    Estimated max frequency (MHz): 111.19017967096713
  Time to perform scheduling: 0.01 seconds


  State Transition Graph Information of function mult:
    Number of states: 41
    Done port is registered
  Time to perform creation of STG: 0.00 seconds


  Easy binding information for function mult:
    Bound operations:13/80
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function mult:
    Number of storage values inserted: 57
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.00 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 39 registers(LB:30)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function mult:
    Number of modules instantiated: 52
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 639
    Estimated area of MUX21: 457.16666666666663
    Total estimated area: 1096.1666666666665
    Estimated number of DSPs: 30
  Time to perform module binding: 0.01 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 39 registers(LB:30)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function mult:
    Number of allocated multiplexers (2-to-1 equivalent): 39
  Time to perform interconnection binding: 0.01 seconds

  Total number of flip-flops in function mult: 1248
Icarus Verilog Preprocessor version 11.0 (stable) ()

Copyright (c) 1999-2020 Stephen Williams (steve@icarus.com)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Using language generation: IEEE1800-2012,no-specify,xtypes,icarus-misc
PARSING INPUT
LOCATING TOP-LEVEL MODULES
   mult_tb_top
 ... done, 0 seconds.
ELABORATING DESIGN
 ... done, 0.02 seconds.
RUNNING FUNCTORS
 -F cprop ...
 ... Iteration detected 28 optimizations.
 ... Iteration detected 0 optimizations.
 ... Look for dangling constants
 ... done
 -F nodangle ...
 ... scan for dangling signal and event nodes. (scomplete=F, ecomplete=F)
 ... 1 iterations deleted 402 dangling signals and 0 events.
 ... scan for dangling signal and event nodes. (scomplete=T, ecomplete=F)
 ... 2 iterations deleted 402 dangling signals and 69 events.
 ... done
CALCULATING ISLANDS
 ... done, 0 seconds.
CODE GENERATION
 ... invoking target_design
 ... done, 0.01 seconds.
STATISTICS
lex_string: add_count=3312 hit_count=24088
Icarus Verilog version 11.0 (stable) ()

Copyright 1998-2020 Stephen Williams

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

translate: /usr/lib/x86_64-linux-gnu/ivl/ivlpp  -v -L -F"/tmp/ivrlg238130525" -f"/tmp/ivrlg38130525" -p"/tmp/ivrli38130525" | /usr/lib/x86_64-linux-gnu/ivl/ivl -v -C"/tmp/ivrlh38130525" -C"/usr/lib/x86_64-linux-gnu/ivl/vvp.conf" -- -
VCD info: dumpfile /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_axim/HLS_output//simulation/test.vcd opened for output.
VCD warning: $dumpvars: Unsupported argument type (vpiPackage)
Start reading vector           1's values from input file.

Reading of vector values from input file completed. Simulation started.
Simulation ended after                  111 cycles.

Simulation FAILED

error -> Simulation not correct!

Please report bugs to <panda-info@polimi.it>


examples/mult/mult_axim ディレクトリを示す。
bambu_162_240107.png

mult.v が生成された。
mult.v を確認すると、AXI4 インターフェースの gmem0 と gmem1 が生成されていた。
bambu_163_240107.png

入力ポートと出力ポートを示す。

  // IN
  input clock;
  input reset;
  input start_port;
  input [31:0] in_x;
  input [31:0] in_y;
  input [31:0] out_z;
  input m_axi_gmem0_AWREADY;
  input m_axi_gmem0_WREADY;
  input [0:0] m_axi_gmem0_BID;
  input [1:0] m_axi_gmem0_BRESP;
  input [0:0] m_axi_gmem0_BUSER;
  input m_axi_gmem0_BVALID;
  input m_axi_gmem0_ARREADY;
  input [0:0] m_axi_gmem0_RID;
  input [31:0] m_axi_gmem0_RDATA;
  input [1:0] m_axi_gmem0_RRESP;
  input m_axi_gmem0_RLAST;
  input [0:0] m_axi_gmem0_RUSER;
  input m_axi_gmem0_RVALID;
  input m_axi_gmem1_AWREADY;
  input m_axi_gmem1_WREADY;
  input [0:0] m_axi_gmem1_BID;
  input [1:0] m_axi_gmem1_BRESP;
  input [0:0] m_axi_gmem1_BUSER;
  input m_axi_gmem1_BVALID;
  input m_axi_gmem1_ARREADY;
  input [0:0] m_axi_gmem1_RID;
  input [31:0] m_axi_gmem1_RDATA;
  input [1:0] m_axi_gmem1_RRESP;
  input m_axi_gmem1_RLAST;
  input [0:0] m_axi_gmem1_RUSER;
  input m_axi_gmem1_RVALID;
  // OUT
  output done_port;
  output [0:0] m_axi_gmem0_AWID;
  output [31:0] m_axi_gmem0_AWADDR;
  output [7:0] m_axi_gmem0_AWLEN;
  output [2:0] m_axi_gmem0_AWSIZE;
  output [1:0] m_axi_gmem0_AWBURST;
  output [0:0] m_axi_gmem0_AWLOCK;
  output [3:0] m_axi_gmem0_AWCACHE;
  output [2:0] m_axi_gmem0_AWPROT;
  output [3:0] m_axi_gmem0_AWQOS;
  output [3:0] m_axi_gmem0_AWREGION;
  output [0:0] m_axi_gmem0_AWUSER;
  output m_axi_gmem0_AWVALID;
  output [0:0] m_axi_gmem0_WID;
  output [31:0] m_axi_gmem0_WDATA;
  output [3:0] m_axi_gmem0_WSTRB;
  output m_axi_gmem0_WLAST;
  output [0:0] m_axi_gmem0_WUSER;
  output m_axi_gmem0_WVALID;
  output m_axi_gmem0_BREADY;
  output [0:0] m_axi_gmem0_ARID;
  output [31:0] m_axi_gmem0_ARADDR;
  output [7:0] m_axi_gmem0_ARLEN;
  output [2:0] m_axi_gmem0_ARSIZE;
  output [1:0] m_axi_gmem0_ARBURST;
  output [0:0] m_axi_gmem0_ARLOCK;
  output [3:0] m_axi_gmem0_ARCACHE;
  output [2:0] m_axi_gmem0_ARPROT;
  output [3:0] m_axi_gmem0_ARQOS;
  output [3:0] m_axi_gmem0_ARREGION;
  output [0:0] m_axi_gmem0_ARUSER;
  output m_axi_gmem0_ARVALID;
  output m_axi_gmem0_RREADY;
  output [0:0] m_axi_gmem1_AWID;
  output [31:0] m_axi_gmem1_AWADDR;
  output [7:0] m_axi_gmem1_AWLEN;
  output [2:0] m_axi_gmem1_AWSIZE;
  output [1:0] m_axi_gmem1_AWBURST;
  output [0:0] m_axi_gmem1_AWLOCK;
  output [3:0] m_axi_gmem1_AWCACHE;
  output [2:0] m_axi_gmem1_AWPROT;
  output [3:0] m_axi_gmem1_AWQOS;
  output [3:0] m_axi_gmem1_AWREGION;
  output [0:0] m_axi_gmem1_AWUSER;
  output m_axi_gmem1_AWVALID;
  output [0:0] m_axi_gmem1_WID;
  output [31:0] m_axi_gmem1_WDATA;
  output [3:0] m_axi_gmem1_WSTRB;
  output m_axi_gmem1_WLAST;
  output [0:0] m_axi_gmem1_WUSER;
  output m_axi_gmem1_WVALID;
  output m_axi_gmem1_BREADY;
  output [0:0] m_axi_gmem1_ARID;
  output [31:0] m_axi_gmem1_ARADDR;
  output [7:0] m_axi_gmem1_ARLEN;
  output [2:0] m_axi_gmem1_ARSIZE;
  output [1:0] m_axi_gmem1_ARBURST;
  output [0:0] m_axi_gmem1_ARLOCK;
  output [3:0] m_axi_gmem1_ARCACHE;
  output [2:0] m_axi_gmem1_ARPROT;
  output [3:0] m_axi_gmem1_ARQOS;
  output [3:0] m_axi_gmem1_ARREGION;
  output [0:0] m_axi_gmem1_ARUSER;
  output m_axi_gmem1_ARVALID;
  output m_axi_gmem1_RREADY;


examples/mult/mult_axim/HLS_output/simulation/test.vcd ファイルが生成された。
GTKWave で test.vcd を確認する。
なお、データは Decimal にしてある。
bambu_159_240107.png
bambu_160_240107.png

gmem0 の AXI4 Write のデータが見えないので、拡大した。
bambu_161_240107.png

maxi_gmem0_WDATA には、ちゃんと乗算結果が出力されている。
だが、AXI4 インターフェースの Read には、6 クロック、Write には 5 クロック掛かっていた。しかもRead と Write はオーバーラップしていないので、スループットは期待できない。
  1. 2024年01月07日 04:34 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の2乗コード(square_hls_stream.cpp)を高位合成する2

Bambu で自作の2乗コード(square_hls_stream.cpp)を高位合成する1”の続き。

前回は、2 乗のソースコード(square_hls_stream.cpp)を作ってみたところ、Bambu でシミュレーションが成功したが、出力値は期待値と違っていた。今回は、最適化オプションを変えて Bambu で高位合成を行ったところ、-O0, -O1 は同じ結果で、正しい値が出力されたが、1 出力に 9 クロック必要だった。-O2, -O3, -O4, -O5 は前回と同じ結果だった。

-O0 オプションを追加して、Bambu を起動して、高位合成を行った。
bambu square_hls_stream.cpp --top-fname=square -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -O0
bambu_154_240106.png

bambu_155_240106.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/square_hls_stream$ bambu square_hls_stream.cpp --top-fname=square -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -O0
 ==  Bambu executed with: /tmp/.mount_bambuWULnUu/usr/bin/bambu --top-fname=square -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -O0 square_hls_stream.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z6squareR10ac_channelI6ac_intILi32ELb1EEES3_
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
  Analyzed function _Z6squareR10ac_channelI6ac_intILi32ELb1EEES3_

  Functions to be synthesized:
    square


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 64
    Internally allocated memory: 64
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 64
    Internally allocated memory: 64
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function square:
    Number of complex operations: 7
    Number of complex operations: 7
  Time to perform module allocation: 0.02 seconds


  Scheduling Information of function square:
    Number of control steps: 13
    Minimum slack: 1.0553999979999926
    Estimated max frequency (MHz): 111.79929787541093
  Time to perform scheduling: 0.00 seconds


  State Transition Graph Information of function square:
    Number of states: 13
    Done port is registered
  Time to perform creation of STG: 0.00 seconds


  Easy binding information for function square:
    Bound operations:26/30
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function square:
    Number of storage values inserted: 11
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.00 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function square:
    Register allocation algorithm obtains a sub-optimal result: 10 registers(LB:7)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function square:
    Number of modules instantiated: 30
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 893
    Estimated area of MUX21: 136
    Total estimated area: 1029
    Estimated number of DSPs: 3
  Time to perform module binding: 0.00 seconds


  Register binding information for function square:
    Register allocation algorithm obtains a sub-optimal result: 10 registers(LB:7)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function square:
    Number of allocated multiplexers (2-to-1 equivalent): 4
  Time to perform interconnection binding: 0.00 seconds

  Total number of flip-flops in function square: 251
  Total cycles             : 92 cycles
  Number of executions     : 1
  Average execution        : 92 cycles


examples/mult/square_hls_stream/HLS_output/simulation/test.vcd が生成されているので、GTKWave で波形を確認した。
bambu_156_240106.png

出力の out_z_din は正しい値が出力されているが、1 個の出力に 9 クロック必要だった。

-O1 は -O0 と同じ結果だった。

-O2, -O3, -O4, -O5 は前回と同じ結果で、n_x2_dout はバーストで 10 個の値を入力しているが、出力の out_z_din は、64 と 81 のみだった。バグっているようだ。
  1. 2024年01月06日 03:55 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の2乗コード(square_hls_stream.cpp)を高位合成する1

mult_hls_stream.cpp は Bambu のシミュレーションがエラーになってしまった。これは不便なので、試しに 2 乗のソースコード(square_hls_stream.cpp)を作ってみたところ、Bambu でシミュレーションが成功したが、出力値は期待値と違っていた。

examples/mult ディレクトリの下に square_hls_stream ディレクトリを作成し、そのディレクトリの下で作業を行った。

square_hls_stream.cpp を示す。

#include "hls_stream.h"
#include "ap_int.h"
void square(hls::stream<ap_int<32>>& in_x2, hls::stream<ap_int<32>>& out_z){
    int i;
    ap_int<32> x2;
    
    for(i=0; i<10; i++){
        x2 = in_x2.read();
        out_z.write(x2 * x2);
    }
}


テストベンチの代わりの test.xml を示す。

<?xml version="1.0"?>
<function>
  <testbench in_x2="{0,1,2,3,4,5,6,7,8,9}" out_z="{0,1,4,9,16,25,36,49,64,81}" />
</function>


Bambu を起動して、高位合成を行った。
bambu square_hls_stream.cpp --top-fname=square -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no
bambu_151_240105.png

bambu_152_240105.png

ログを示す。

base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/square_hls_stream$ bambu square_hls_stream.cpp --top-fname=square -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no
 ==  Bambu executed with: /tmp/.mount_bambunCZ3MX/usr/bin/bambu --top-fname=square -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no square_hls_stream.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z6squareR10ac_channelI6ac_intILi32ELb1EEES3_
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
  Analyzed function _Z6squareR10ac_channelI6ac_intILi32ELb1EEES3_

  Functions to be synthesized:
    square


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 64
    Internally allocated memory: 64
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 64
    Internally allocated memory: 64
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function square:
    Number of complex operations: 70
    Number of complex operations: 70
  Time to perform module allocation: 0.05 seconds


  Scheduling Information of function square:
    Number of control steps: 73
    Minimum slack: 1.0553999979999926
    Estimated max frequency (MHz): 111.79929787541093
  Time to perform scheduling: 0.02 seconds


  State Transition Graph Information of function square:
    Number of states: 91
    Done port is registered
  Time to perform creation of STG: 0.03 seconds


  Easy binding information for function square:
    Bound operations:57/167
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function square:
    Number of storage values inserted: 62
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.00 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function square:
    Register allocation algorithm obtains a sub-optimal result: 44 registers(LB:23)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.01 seconds

  Module binding information for function square:
    Number of modules instantiated: 113
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 1521
    Estimated area of MUX21: 580
    Total estimated area: 2101
    Estimated number of DSPs: 30
  Time to perform module binding: 0.02 seconds


  Register binding information for function square:
    Register allocation algorithm obtains a sub-optimal result: 44 registers(LB:23)
  Time to perform register binding: 0.01 seconds


  Connection Binding Information for function square:
    Number of allocated multiplexers (2-to-1 equivalent): 37
  Time to perform interconnection binding: 0.00 seconds

  Total number of flip-flops in function square: 911
Icarus Verilog Preprocessor version 11.0 (stable) ()

Copyright (c) 1999-2020 Stephen Williams (steve@icarus.com)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Using language generation: IEEE1800-2012,no-specify,xtypes,icarus-misc
PARSING INPUT
LOCATING TOP-LEVEL MODULES
   square_tb_top
 ... done, 0.01 seconds.
ELABORATING DESIGN
 ... done, 0.03 seconds.
RUNNING FUNCTORS
 -F cprop ...
 ... Iteration detected 8 optimizations.
 ... Iteration detected 0 optimizations.
 ... Look for dangling constants
 ... done
 -F nodangle ...
 ... scan for dangling signal and event nodes. (scomplete=F, ecomplete=F)
 ... 1 iterations deleted 373 dangling signals and 0 events.
 ... scan for dangling signal and event nodes. (scomplete=T, ecomplete=F)
 ... 2 iterations deleted 373 dangling signals and 77 events.
 ... done
CALCULATING ISLANDS
 ... done, 0 seconds.
CODE GENERATION
 ... invoking target_design
 ... done, 0.01 seconds.
STATISTICS
lex_string: add_count=2580 hit_count=28894
Icarus Verilog version 11.0 (stable) ()

Copyright 1998-2020 Stephen Williams

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

translate: /usr/lib/x86_64-linux-gnu/ivl/ivlpp  -v -L -F"/tmp/ivrlg24fbbd013" -f"/tmp/ivrlg4fbbd013" -p"/tmp/ivrli4fbbd013" | /usr/lib/x86_64-linux-gnu/ivl/ivl -v -C"/tmp/ivrlh4fbbd013" -C"/usr/lib/x86_64-linux-gnu/ivl/vvp.conf" -- -
VCD info: dumpfile /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/square_hls_stream/HLS_output//simulation/test.vcd opened for output.
VCD warning: $dumpvars: Unsupported argument type (vpiPackage)
Start reading vector           1's values from input file.

Reading of vector values from input file completed. Simulation started.
 out_z_din =         64   expected =          0 

 out_z_din =         81   expected =          1 

 out_z_din =         81   expected =          4 

 out_z_din =         81   expected =          9 

 out_z_din =         81   expected =         16 

 out_z_din =         81   expected =         25 

 out_z_din =         81   expected =         36 

 out_z_din =         81   expected =         49 

 out_z_din =         81   expected =         64 

 out_z_din =         81   expected =         81 

Simulation ended after                   72 cycles.

Simulation FAILED

error -> Simulation not correct!

Please report bugs to <panda-info@polimi.it>


出力された値が 2 乗した値とは異なってしまっているようだ。

examples/mult/square_hls_stream/HLS_output/simulation/test.vcd が生成されているので、GTKWave で波形を確認した。
bambu_153_240105.png

in_x2_dout はバーストで 10 個の値を入力しているが、出力の out_z_din は、64 と 81 のみだった。バグっているようだ。
  1. 2024年01月05日 05:26 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の乗算コード(mult_hls_stream.cpp)を高位合成する3

Bambu で自作の乗算コード(mult_hls_stream.cpp)を高位合成する2”の続き。

前回は、Bambu で高位合成された mult.v を Cocotb を使用して、シミュレーションを行った。今回は、Bambu のコマンドに -O5 最適化オプションを追加して、高位合成を行った。Cocotb でシミュレーションを行ったが、FAIL した。test_mult.py のアサーションをコメントアウトした。

examples/mult/hls_stream ディレクトリに行って、-O5 最適化オプションを追加した以下のコマンドを実行した。
bambu mult_hls_stream.cpp --top-fname=mult -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -O5
bambu_145_240104.png

bambu_146_240104.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream$ bambu mult_hls_stream.cpp --top-fname=mult -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -O5
 ==  Bambu executed with: /tmp/.mount_bambunpJoeO/usr/bin/bambu --top-fname=mult -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -O5 mult_hls_stream.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z4multR10ac_channelI6ac_intILi32ELb1EEES3_S3_
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
  Analyzed function _Z4multR10ac_channelI6ac_intILi32ELb1EEES3_S3_

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 96
    Internally allocated memory: 96
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 96
    Internally allocated memory: 96
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function mult:
    Number of complex operations: 100
    Number of complex operations: 100
  Time to perform module allocation: 0.07 seconds


  Scheduling Information of function mult:
    Number of control steps: 73
    Minimum slack: 1.0553999979999926
    Estimated max frequency (MHz): 111.79929787541093
  Time to perform scheduling: 0.04 seconds


  State Transition Graph Information of function mult:
    Number of states: 91
    Done port is registered
  Time to perform creation of STG: 0.04 seconds


  Easy binding information for function mult:
    Bound operations:89/259
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function mult:
    Number of storage values inserted: 93
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.00 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 66 registers(LB:35)
  Time to perform register binding: 0.01 seconds

  Clique covering computation completed in 0.02 seconds

  Module binding information for function mult:
    Number of modules instantiated: 178
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 2421
    Estimated area of MUX21: 853
    Total estimated area: 3274
    Estimated number of DSPs: 30
  Time to perform module binding: 0.02 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 66 registers(LB:35)
  Time to perform register binding: 0.01 seconds


  Connection Binding Information for function mult:
    Number of allocated multiplexers (2-to-1 equivalent): 54
  Time to perform interconnection binding: 0.01 seconds

  Total number of flip-flops in function mult: 1372
/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/panda-temp/shell_script_20: line 4: 180559 Aborted                 (core dumped) ( /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/HLS_output//simulation/test ) > /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/panda-temp/shell_output_20 2>&1
error -> Error in generating the expected test results

Please report bugs to <panda-info@polimi.it>


mult.v が生成された。

mult.v を examples/mult/hls_stream/cocotb ディレクトリの mult.v と入れ替えた。
mult.v の endmodule の前に以下の Verilog HDL コードを追加した。

// the "macro" to dump signals
`ifdef COCOTB_SIM
initial begin
  $dumpfile ("mult.vcd");
  $dumpvars (0, mult);
  #1;
end
`endif


make コマンドを実行して、Cocotb でシミュレーションを行った。
bambu_147_240104.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb' に入ります
/usr/bin/iverilog -o sim_build/sim.vvp -D COCOTB_SIM=1 -s mult -f sim_build/cmds.f -g2012   /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb/mult.v
rm -f results.xml
MODULE=test_mult TESTCASE= TOPLEVEL=mult 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 11.0 (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 1704311000
     0.00ns INFO     cocotb.regression                  Found test test_mult.test_mult
     0.00ns INFO     cocotb.regression                  running test_mult (1/1)
VCD info: dumpfile mult.vcd opened for output.
   261.00ns INFO     cocotb.regression                  test_mult failed
                                                        Traceback (most recent call last):
                                                          File "/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb/test_mult.py", line 39, in test_mult
                                                            assert dut.out_z_din.value == i*(i+1), "Invalid value for multiplication {}".format(i*(i+1))
                                                        AssertionError: Invalid value for multiplication 2
                                                        assert 00000000000000000000000000000000 == (1 * (1 + 1))
                                                         +  where 00000000000000000000000000000000 = ModifiableObject(mult.out_z_din).value
                                                         +    where ModifiableObject(mult.out_z_din) = HierarchyObject(mult).out_z_din
   261.00ns INFO     cocotb.regression                  **************************************************************************************
                                                        ** TEST                          STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        **************************************************************************************
                                                        ** test_mult.test_mult            FAIL         261.00           0.02      14177.34  **
                                                        **************************************************************************************
                                                        ** TESTS=1 PASS=0 FAIL=1 SKIP=0                261.00           0.24       1084.82  **
                                                        **************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb' から出ます


test_mult.py の 39 行目のアサーションをコメントアウトした。
bambu_148_240104.png

もう一度、make コマンドを実行して、Cocotb でシミュレーションを行った。
今度は PASS した。
bambu_149_240104.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb' に入ります
rm -f results.xml
MODULE=test_mult TESTCASE= TOPLEVEL=mult 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 11.0 (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 1704312203
     0.00ns INFO     cocotb.regression                  Found test test_mult.test_mult
     0.00ns INFO     cocotb.regression                  running test_mult (1/1)
VCD info: dumpfile mult.vcd opened for output.
   841.00ns INFO     cocotb.regression                  test_mult passed
   841.00ns INFO     cocotb.regression                  **************************************************************************************
                                                        ** TEST                          STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        **************************************************************************************
                                                        ** test_mult.test_mult            PASS         841.00           0.04      23545.92  **
                                                        **************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0                841.00           0.26       3224.54  **
                                                        **************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb' から出ます



mult.vcd が生成された。
mult.vcd を GTKWave で表示した。
bambu_150_240104.png

バグっているようだ。
in_x_read と in_y_read が 10 クロック間 1 になっているが、その間の in_x_dout のデータは 0 で、in_y_dout のデータは 1 だった。
out_z_din の出力もずっと 0 のままだった。
  1. 2024年01月04日 05:13 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の乗算コード(mult_hls_stream.cpp)を高位合成する2

Bambu で自作の乗算コード(mult_hls_stream.cpp)を高位合成する1”の続き。

前回は、Bambu では、hls_stream と ap_int が使用できる。hls_stream を使用して、乗算のコード(mult_hls_stream.cpp)を高位合成した。しかし、シミュレーションがエラーになってしまった。今回は、Bambu で高位合成された mult.v を Cocotb を使用して、シミュレーションを行った。

Cocotb はテストベンチに Python を使用するシミュレータだ。
examples/mult/hls_stream ディレクトリの下に cocotb ディレクトリを作成した。
cocotb ディレクトリの下に、Makefile、test_mult.py を作成した。
Makefile を示す。

# Makefile
# 2024/01/03 by marsee

SIM ?= icarus

VERILOG_SOURCES = $(shell pwd)/mult.v
TOPLEVEL = mult
MODULE = test_mult

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


test_mult.py を示す。

# test_mult.py
# 2024/01/03 by marsee

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

@cocotb.test()
async def test_mult(dut):
    dut.reset.value = 0 # Reset
    dut.start_port.value = 0

    clock = Clock(dut.clock, 10, units="ns")  # Create a 10ns period clock on port clk
    cocotb.start_soon(clock.start())  # Start the clock

    await Timer(21, units='ns')

    dut.reset.value = 1 # Normal Operation
    dut.in_x_empty_n.value = 1;
    dut.in_y_empty_n.value = 1;
    dut.out_z_full_n.value = 1;

    for i in range(3):
        await RisingEdge(dut.clock)
    await Timer(1, units='ns')
    
    dut.start_port.value = 1
    for i in range(10):
        dut.in_x_dout.value = i
        dut.in_y_dout.value = i+1
        if i == 1:
            dut.start_port.value = 0
        await RisingEdge(dut.clock)
        await Timer(1, units='ns')
        while dut.out_z_write.value == 0:
            await RisingEdge(dut.clock)
            await Timer(1, units='ns')
        assert dut.out_z_din.value == i*(i+1), "Invalid value for multiplication {}".format(i*(i+1))

    for i in range(10):
        await RisingEdge(dut.clock)
        await Timer(1, units='ns')


examples/mult/hls_stream ディレクトリの mult.v を cocotb ディレクトリにコピーした。
bambu_141_240103.png

mult.v の endmodule の前に以下の Verilog HDL コードを追加した。VCD ファイルを生成するコードとなっている。

// the "macro" to dump signals
`ifdef COCOTB_SIM
initial begin
  $dumpfile ("mult.vcd");
  $dumpvars (0, mult);
  #1;
end
`endif


bambu_142_240103.png

examples/mult/hls_stream/cocotb ディレクトリに行って、make を実行した。
make
bambu_143_240103.png

bambu_144_240103.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb' に入ります
rm -f results.xml
MODULE=test_mult TESTCASE= TOPLEVEL=mult 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 11.0 (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 1704225560
     0.00ns INFO     cocotb.regression                  Found test test_mult.test_mult
     0.00ns INFO     cocotb.regression                  running test_mult (1/1)
VCD info: dumpfile mult.vcd opened for output.
  1041.00ns INFO     cocotb.regression                  test_mult passed
  1041.00ns INFO     cocotb.regression                  **************************************************************************************
                                                        ** TEST                          STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        **************************************************************************************
                                                        ** test_mult.test_mult            PASS        1041.00           0.03      32153.43  **
                                                        **************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0               1041.00           0.25       4125.91  **
                                                        **************************************************************************************
                                                        
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/cocotb' から出ます


mult.vcd が生成された。
mult.vcd を GTKWave で表示した。
bambu_145_240103.png

9 クロックごとに乗算結果が出力されている。
なお、ハイライトした信号は Decimal 表示にしてある。
  1. 2024年01月03日 05:06 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の乗算コード(mult_hls_stream.cpp)を高位合成する1

Bambu で自作の乗算コード (mult_array.c) を高位合成する3”の続き。

Bambu では、hls_stream と ap_int が使用できる。hls_stream を使用して、乗算のコード(mult_hls_stream.cpp)を高位合成した。

hls_stream と ap_int を使用した mult_hls_stream.cpp を示す。
なお、hls::stream<int>& in_x と書くとエラーになってしまったと思う。

#include "hls_stream.h"
#include "ap_int.h"

void mult(hls::stream<ap_int<32>>& in_x, hls::stream<ap_int<32>>& in_y,  hls::stream<ap_int<32>>& out_z){
    int i;
    
    for(i=0; i<10; i++){
        out_z.write(in_x.read() * in_y.read());
    }
}


Bambu で mult_hls_stream.cpp を高位合成した。
今回は、hls_stream.h や ap_int.h のインクルード・ファイルの場所をコンパイラに伝える必要がある。それに、GCC ではコンパイルエラーになったので、I386_CLANG13 コンパイラを使用している。
bambu mult_hls_stream.cpp --top-fname=mult -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no
bambu_134_240102.png

bambu_135_240102.png

シミュレーションでエラーになってしまった。
ログを示す。

examples/mult/hls_stream$ bambu mult_hls_stream.cpp --top-fname=mult -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no
 ==  Bambu executed with: /tmp/.mount_bambuOeDt8d/usr/bin/bambu --top-fname=mult -I/media/masaaki/Ubntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no mult_hls_stream.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z4multR10ac_channelI6ac_intILi32ELb1EEES3_S3_
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 32
      Alignment : 8
  Analyzed function _Z4multR10ac_channelI6ac_intILi32ELb1EEES3_S3_

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 96
    Internally allocated memory: 96
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 7
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 96
    Internally allocated memory: 96
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function mult:
    Number of complex operations: 10
    Number of complex operations: 10
  Time to perform module allocation: 0.01 seconds


  Scheduling Information of function mult:
    Number of control steps: 13
    Minimum slack: 1.0553999979999926
    Estimated max frequency (MHz): 111.79929787541093
  Time to perform scheduling: 0.01 seconds


  State Transition Graph Information of function mult:
    Number of states: 13
    Done port is registered
  Time to perform creation of STG: 0.01 seconds


  Easy binding information for function mult:
    Bound operations:30/42
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function mult:
    Number of storage values inserted: 15
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.00 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 14 registers(LB:10)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function mult:
    Number of modules instantiated: 42
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 1320
    Estimated area of MUX21: 204
    Total estimated area: 1524
    Estimated number of DSPs: 3
  Time to perform module binding: 0.00 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 14 registers(LB:10)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function mult:
    Number of allocated multiplexers (2-to-1 equivalent): 5
  Time to perform interconnection binding: 0.00 seconds

  Total number of flip-flops in function mult: 361
/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/panda-temp/shell_script_20: line 4: 145531 Aborted                 (core dumped) ( /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/HLS_output//simulation/test ) > /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/hls_stream/panda-temp/shell_output_20 2>&1
error -> Error in generating the expected test results

Please report bugs to <panda-info@polimi.it>


examples/mult/hls_stream ディレクトリの様子を示す。
bambu_136_240102.png

mult.v が生成された。
mult モジュールを示す。
bambu_137_240102.png

mult モジュールの入力ポート、出力ポートの定義部分を示す。

// IN
input clock;
input reset;
input start_port;
input [31:0] in_x_dout;
input [31:0] in_y_dout;
input in_x_empty_n;
input in_y_empty_n;
input out_z_full_n;
// OUT
output done_port;
output in_x_read;
output in_y_read;
output [31:0] out_z_din;
output out_z_write;


入力ポートの制御信号は、***_empty_n と ***_read が使用されている。
出力ポートの制御信号は、***_full_n と ***_write が使用されている。

今回は、Bamub の高位合成時に、"--print-dot "オプションで、Graphviz の .dot ファイルを HLS_output/dot ディレクトリに出力した。call_graph.dot と call_graph_final.dot が出力された。
dot コマンドで .dot ファイルを SVG ファイルに変換した。
dot -Tsvg call_graph.dot -o call_graph.svg
dot -Tsvg call_graph_final.dot -o call_graph_final.svg


call_graph.svg と call_graph_final.svg が生成された。
bambu_138_240102.png

call_graph.svg を示す。
bambu_139_240102.png

call_graph_final.svg を示す。
bambu_140_240102.png
  1. 2024年01月02日 04:25 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu で自作の乗算コード (mult_array.c) を高位合成する3

Bambu で自作の乗算コード (mult_array.c) を高位合成する2”の続き。

C ソースコードの関数の引数を配列にした 10 連続乗算処理関数を Bambu で高位合成を行った。前回は、同じソースコードで最適化オプションによる違いを確認した。今回は、コンパイラを I386_CLANG13 に変更して、最適化オプションによる違いを確認した。

最初にコンパイラを I386_CLANG13 に変更して、Bambu で高位合成を行った。
bambu mult_array.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER --compiler=I386_CLANG13
bambu_130_240101.png

bambu_131_240101.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_array$ bambu mult_array.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER --compiler=I386_CLANG13
 ==  Bambu executed with: /tmp/.mount_bambugZQGWg/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER --compiler=I386_CLANG13 mult_array.c 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function mult
    Interface specification:
      Protocol  : array
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : array
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : array
      Bitwidth  : 32
      Alignment : 4
  Analyzed function mult

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 32
    ADDRESS bus bitsize: 5
    SIZE bus bitsize: 6
    Code has LOADs or STOREs with unaligned accesses
    Internally allocated memory (no private memories): 0
    Internally allocated memory: 0
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function mult:
    Number of complex operations: 30
    Number of complex operations: 30
  Time to perform module allocation: 0.05 seconds


  Scheduling Information of function mult:
    Number of control steps: 10
    Minimum slack: 1.0063999990000039
    Estimated max frequency (MHz): 111.19017967096717
  Time to perform scheduling: 0.01 seconds


  State Transition Graph Information of function mult:
    Number of states: 8
    Minimum number of cycles: 8
    Maximum number of cycles 8
    Done port is registered
  Time to perform creation of STG: 0.00 seconds


  Easy binding information for function mult:
    Bound operations:13/80
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function mult:
    Number of storage values inserted: 55
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.00 seconds
  Weight computation completed in 0.01 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 39 registers(LB:25)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function mult:
    Number of modules instantiated: 56
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 639
    Estimated area of MUX21: 544
    Total estimated area: 1183
    Estimated number of DSPs: 30
  Time to perform module binding: 0.01 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 39 registers(LB:25)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function mult:
    Number of allocated multiplexers (2-to-1 equivalent): 32
  Time to perform interconnection binding: 0.00 seconds

  Total number of flip-flops in function mult: 1248
  Total cycles             : 8 cycles
  Number of executions     : 1
  Average execution        : 8 cycles


実行時間が 8 サイクルは変じゃないだろうか?

GTKWave で波形を確認した。
なお、バスはすべて Decimal 表示されている。
bambu_132_240101.png

これは驚いた。。。
このメモリインターフェースにはポートが 2 個あるが、0 の方で偶数アドレス、1 の方で奇数アドレスのデータ転送を行って辻褄があっている。。。しかも 1 クロックごとにバースト転送が行われている。
これって、メモリインターフェースが 2 ポートなのは、in_x, in_y の 2 個の入力があるからなのだろうか?

-O0 オプションを付けて、Bambu で高位合成を行った。
bambu mult_array.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER --compiler=I386_CLANG13 -O0

結果の一部を示す。

  Module binding information for function mult:
    Number of modules instantiated: 19
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 148
    Estimated area of MUX21: 0
    Total estimated area: 148
    Estimated number of DSPs: 3
  Time to perform module binding: 0.00 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains a sub-optimal result: 6 registers(LB:5)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function mult:
    Number of allocated multiplexers (2-to-1 equivalent): 1
  Time to perform interconnection binding: 0.00 seconds

  Total number of flip-flops in function mult: 161
  Total cycles             : 42 cycles
  Number of executions     : 1
  Average execution        : 42 cycles


Total estimated area は 148 だった。最適化オプション無しの Total estimated area は 1183 だったから、約 0.125 倍になっている。
一方、サイクル数は 8 サイクルから 42 サイクルに伸びた。

GTKWave で波形を確認した。
bambu_133_240101.png

1 回のデータ転送ごとに 4 クロック必要だ。

-O1 の最適化オプションを付けてみたところ、-O0 と同じ結果だった。
-O2, -O3, -O4, -O5 は最適化オプション無しと同じ結果だった。
  1. 2024年01月01日 05:35 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0
»