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

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

FPGAの部屋

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

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

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

C ソースコードの関数宣言時の引数をポインタから配列に変更した。Bambu で高位合成を行ったところ、メモリ・インターフェースが実装された。シミュレーションでは、10 個の乗算が実行されていた。こっちの C ソースコードの方が使えそうだ。今回は、同じソースコードで最適化オプションによる違いを確認してみよう。

最初に前回の Bambu の実行コマンドを示す。
bambu mult_array.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER
コンパイラは GCC で、-O1 辺りではないだろうか?
実行後のクロック・サイクル数は 42 サイクルとなっている。つまり、1 個の乗算に 4 クロック掛かっている。

次に、最適化オプションを -O5 にしてみよう。
bambu mult_array.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER -O5
ログを示す。

(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 -O5
 ==  Bambu executed with: /tmp/.mount_bambuMZ2rXA/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER -O5 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.03 seconds


  Scheduling Information of function mult:
    Number of control steps: 33
    Minimum slack: 1.5599999999999963
    Estimated max frequency (MHz): 118.48341232227484
  Time to perform scheduling: 0.01 seconds


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


  Easy binding information for function mult:
    Bound operations:23/90
  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: 57 registers(LB:29)
  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: 63
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 649
    Estimated area of MUX21: 412
    Total estimated area: 1061
    Estimated number of DSPs: 30
  Time to perform module binding: 0.00 seconds


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


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

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


Total estimated area: 1061 となった。前回は、150 だったので、リソースは約 7 倍に増えている。
サイクル数は 31 サイクルになって、前回の 41 サイクルよりも 10 サイクル減っている。
GTKWave で波形を確認すると、1 個の乗算のクロック数が 3 クロックになっている。前回は 4 クロックだったので、1 クロック減っている。
bambu_127_231231.png

色々と最適化オプションを変更してやってみた。
-O5, -O4, -O3 は同じ結果になった。
-O2, -O1 は前回と同じ結果になった。
-O0 の結果の一部を示す。

  Module binding information for function mult:
    Number of modules instantiated: 25
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 152
    Estimated area of MUX21: 0
    Total estimated area: 152
    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: 7 registers(LB:4)
  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: 224
  Total cycles             : 53 cycles
  Number of executions     : 1
  Average execution        : 53 cycles


Total estimated area: 152 で、Total cycles : 53 cycles となった。
GTKWave で波形を確認すると、1 個の乗算のクロック数が 5 クロックになっている。
bambu_128_231231.png
  1. 2023年12月31日 04:27 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

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

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

mult_pointer.c の Bambu による高位合成では、最初の乗算のみ出力することができて、その後の 9 個の乗算は実行されなかった。今回は、C ソースコードの関数宣言時の引数をポインタから配列に変更した。Bambu で高位合成を行ったところ、メモリ・インターフェースが実装された。シミュレーションでは、10 個の乗算が実行されていた。こっちの C ソースコードの方が使えそうだ。

examples/mult ディレクトリの下に mult_array ディレクトリを新規作成した。
mult_array ディレクトリに mult_array.c と test.xml ファイルを作成した。
なお、test.xml ファイルは”Bambu で自作の乗算コード (mult_pointer.c) を高位合成する1”のファイルをコピーした。
mult_array.c を示す。

#define ARRAY_SIZE  10

void mult(int in_x[ARRAY_SIZE], int in_y[ARRAY_SIZE], int out_z[ARRAY_SIZE]){
    int i;
    
    for(i=0; i<ARRAY_SIZE; i++){
        out_z[i] = in_x[i] * in_y[i];
    }
}


Bambu で mult_array.c を高位合成した。
bambu mult_array.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER
bambu_122_231229.png

bambu_123_231229.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
 ==  Bambu executed with: /tmp/.mount_bambutWNKDX/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER 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: 3
    Number of complex operations: 3
  Time to perform module allocation: 0.01 seconds


  Scheduling Information of function mult:
    Number of control steps: 8
    Minimum slack: 1.5600000000000034
    Estimated max frequency (MHz): 118.48341232227494
  Time to perform scheduling: 0.01 seconds


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


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


  Storage Value Information of function mult:
    Number of storage values inserted: 7
  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: 6 registers(LB:5)
  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: 22
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 150
    Estimated area of MUX21: 0
    Total estimated area: 150
    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


examples/mult/mult_array ディレクトリを示す。
bambu_124_231229.png

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

mult モジュールの入力ポートと出力ポートを示す。

  // IN
  input clock;
  input reset;
  input start_port;
  input [31:0] in_x_q0;
  input [31:0] in_x_q1;
  input [31:0] in_y_q0;
  input [31:0] in_y_q1;
  // OUT
  output done_port;
  output [3:0] in_x_address0;
  output [3:0] in_x_address1;
  output in_x_ce0;
  output in_x_ce1;
  output [3:0] in_y_address0;
  output [3:0] in_y_address1;
  output in_y_ce0;
  output in_y_ce1;
  output [3:0] out_z_address0;
  output [3:0] out_z_address1;
  output out_z_ce0;
  output out_z_ce1;
  output out_z_we0;
  output out_z_we1;
  output [31:0] out_z_d0;
  output [31:0] out_z_d1;


メモリ・インターフェースのようだ?

examples/mult/mult_array/HLS_output/simulation/test.vcd を GTKWave で表示した。
bambu_126_231229.png

in_x_q0, in_y_q0, out_z_d0 の表示は Decimal にしてある。
in_x_q0, in_y_q0 の乗算結果が out_z_d0 に表示されている。
in_x_ce0, in_y_ce0 が入力ポート in_x_q0, in_y_q0 の有効フラグで、out_z_we0 が出力ポート out_z_d0 の有効フラグのようだ。
これならば使えそうだ。。。
  1. 2023年12月30日 04:46 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

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

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

前回は、乗算 10 繰り返す mult_pointer.c を試してみよう。mult_pointer.c は関数の宣言部分の変数の型をポインタで書いてある。今回は、シミュレーションがうまく行かなかったので、Cocotb でシミュレーションを行った。結果として、最初の乗算のみ行われて、次からの乗算は行われなかった。

Cocotb を動作させるための環境を作成する。
examples/mult/mult_pointer ディレクトリに cocotb ディレクトリを新規作成した。
cocotb ディレクトリに Makefile とテストベンチの test_mult.py を作成した。
Makefile を示す。

# Makefile
# 2023/12/28 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
# 2023/12/28 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 = 0 # Reset
    dut.start_port = 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 = 1 # Normal Operation

    for i in range(3):
        await RisingEdge(dut.clock)
    await Timer(1, units='ns')
    
    dut.start_port = 1
    for i in range(10):
        dut.in_x.value = i
        dut.in_y.value = i+1
        await RisingEdge(dut.clock)
        await Timer(1, units='ns')
        dut.start_port = 0
        while dut.out_z_vld == 0:
            await RisingEdge(dut.clock)
            await Timer(1, units='ns')
        #assert dut.out_z.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/mult_pointer ディレクトリから mult.v ファイルをコピーして、以下の文を endmodule の上に追加した。

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


bambu_121_231229.png

examples/mult/mult_pointer/cocotb ディレクトリに行って、以下のコマンドを実行した。
make
bambu_117_231229.png

bambu_118_231229.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/cocotb$ make
rm -f results.xml
make -f Makefile results.xml
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/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/mult_pointer/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 1703767286
     0.00ns INFO     cocotb.regression                  Found test test_mult.test_mult
     0.00ns INFO     cocotb.regression                  running test_mult (1/1)
/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/cocotb/test_mult.py:11: DeprecationWarning: Setting values on handles using the ``dut.handle = value`` syntax is deprecated. Instead use the ``handle.value = value`` syntax
  dut.reset = 0 # Reset
/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/cocotb/test_mult.py:12: DeprecationWarning: Setting values on handles using the ``dut.handle = value`` syntax is deprecated. Instead use the ``handle.value = value`` syntax
  dut.start_port = 0
VCD info: dumpfile mult.vcd opened for output.
/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/cocotb/test_mult.py:19: DeprecationWarning: Setting values on handles using the ``dut.handle = value`` syntax is deprecated. Instead use the ``handle.value = value`` syntax
  dut.reset = 1 # Normal Operation
/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/cocotb/test_mult.py:25: DeprecationWarning: Setting values on handles using the ``dut.handle = value`` syntax is deprecated. Instead use the ``handle.value = value`` syntax
  dut.start_port = 1
/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/cocotb/test_mult.py:31: DeprecationWarning: Setting values on handles using the ``dut.handle = value`` syntax is deprecated. Instead use the ``handle.value = value`` syntax
  dut.start_port = 0
   351.00ns INFO     cocotb.regression                  test_mult passed
   351.00ns INFO     cocotb.regression                  **************************************************************************************
                                                        ** TEST                          STATUS  SIM TIME (ns)  REAL TIME (s)  RATIO (ns/s) **
                                                        **************************************************************************************
                                                        ** test_mult.test_mult            PASS         351.00           0.01      33784.76  **
                                                        **************************************************************************************
                                                        ** TESTS=1 PASS=1 FAIL=0 SKIP=0                351.00           0.24       1485.77  **
                                                        **************************************************************************************


examples/mult/mult_pointer/cocotb ディレクトリの様子を示す。
bambu_119_231229.png

mult.vcd が生成されている。
mult.vcd を GTKWave で読み込んで、波形を表示した。
bambu_120_231229.png

最初の乗算のみ out_z 出力ポートに出力されているが、その後の結果は出力されていない。
入力の in_x と in_y には、きちんと入力が入っている。
out_z_vld は 1 クロックごとに 1 になっている。

入力ポートの値は最初だけ FF にラッチして、その後は受け取らないのかな?
ちなみに、コマンドに”--registered-inputs=no”にしても、”--pipelining”にしても、同じ結果だった。
  1. 2023年12月29日 04:15 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

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

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

前回は、Bambu で乗算を高位合成して、Verilog HDL ファイルを生成できたが、結果は微妙だった。今回は、乗算 10 繰り返す mult_pointer.c を試してみよう。mult_pointer.c は関数の宣言部分の変数の型をポインタで書いてある。

examples/mult ディレクトリの下に mult_pointer ディレクトリを作成しその下に mult_pointer.c を作成した。
mult_pointer.c を示す。

#define ARRAY_SIZE  10

void mult(int *in_x, int *in_y, int *out_z){
    int i;
    
    for(i=0; i<ARRAY_SIZE; i++){
        out_z[i] = in_x[i] * in_y[i];
    }
}


テストベンチ用の test.xml ファイルを作成した。
10 バースト用なので、10 個の値を書いた。
test.xml を示す。
bambu_112_231228.png

<?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_pointer.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER
bambu_113_231228.png

bambu_114_231228.png

期待値と実際の out_z の値が違っているようだ。
ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer$ bambu mult_pointer.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER
 ==  Bambu executed with: /tmp/.mount_bambuAyln2V/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER mult_pointer.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  : none
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : none
      Bitwidth  : 32
      Alignment : 4
    Interface specification:
      Protocol  : valid
      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: 1
    Number of complex operations: 1
  Time to perform module allocation: 0.02 seconds


  Scheduling Information of function mult:
    Number of control steps: 6
    Minimum slack: 1.0553999990000034
    Estimated max frequency (MHz): 111.79929788791016
  Time to perform scheduling: 0.00 seconds


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


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


  Storage Value Information of function mult:
    Number of storage values inserted: 6
  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 an optimal result: 5 registers
  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: 22
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 150
    Estimated area of MUX21: 0
    Total estimated area: 150
    Estimated number of DSPs: 3
  Time to perform module binding: 0.00 seconds


  Register binding information for function mult:
    Register allocation algorithm obtains an optimal result: 5 registers
  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: 129
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 2 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 44 dangling signals and 0 events.
 ... scan for dangling signal and event nodes. (scomplete=T, ecomplete=F)
 ... 2 iterations deleted 44 dangling signals and 12 events.
 ... done
CALCULATING ISLANDS
 ... done, 0 seconds.
CODE GENERATION
 ... invoking target_design
 ... done, 0.01 seconds.
STATISTICS
lex_string: add_count=468 hit_count=4764
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/ivrlg2bdb796e" -f"/tmp/ivrlgbdb796e" -p"/tmp/ivrlibdb796e" | /usr/lib/x86_64-linux-gnu/ivl/ivl -v -C"/tmp/ivrlhbdb796e" -C"/usr/lib/x86_64-linux-gnu/ivl/vvp.conf" -- -
VCD info: dumpfile /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_pointer/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 =          0   expected =          0 

 out_z =          0   expected =          2 

 out_z =          0   expected =          6 

 out_z =          0   expected =         12 

 out_z =          0   expected =         20 

 out_z =          0   expected =         30 

 out_z =          0   expected =         42 

 out_z =          0   expected =         56 

 out_z =          0   expected =         72 

Simulation ended after                   22 cycles.

Simulation FAILED

error -> Simulation not correct!

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


生成された mult.v を示す。
bambu_115_231228.png

入力ポートと出力ポートは mult_basic のときと同じだ。

examples/mult/mult_pointer/HLS_output/simulation/test.vcd を GTKWave で開いた。
bambu_116_231228.png

0 x 1 のみ実行されていて、その後の値が入っていない。
やはり、シミュレータを使って、シミュレーションをしてみよう。
  1. 2023年12月28日 05:40 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

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

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

自作の簡単な乗算の C ソースコードで Bambu の高位合成を試してみようということで、前回は、ヘルプを調べたところ、”--generate-interface=INFER”オプションを作成すると、out_z 出力ポートが生成されて、良い感じの Verilog HDL ファイルが生成された。また、test.xml に入力値と出力の期待値を書いてシミュレーションを行った。今回は、乗算の Verilog HDL コードが組み合わせ回路だったので、FF を入れるためのオプションを探したところ、”--registered-inputs=yes”が見つかった。”--registered-inputs=yes”を付けて Bambu でコンパイルしたら、done_port と out_z_vld は 1 クロック遅延したが、out_z は組み合わせ回路のままだった。

レジスタを入力ポートか出力ポートに入れるオプションを確認したところ、”--registered-inputs=”が見つかった。
bambu --help コマンドを実行したときの”--registered-inputs=”の説明を引用する。

    --registered-inputs=value
        Specify if inputs are registered or not:
             auto  - inputs are registered only for proxy functions (default)
             top   - inputs and return are registered only for top and proxy functions
             yes   - all inputs are registered
             no    - none of the inputs is registered


”--registered-inputs=yes”を試してみよう。

次のコマンドで Bambu を起動した。
bambu mult_basic.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER --registered-inputs=yes
bambu_109_231227.png

bambu_110_231227.png

前回は、

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


だったが、今回は、

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


に変更になった。

全ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_basic$ bambu mult_basic.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER --registered-inputs=yes
 ==  Bambu executed with: /tmp/.mount_bambuVh00lq/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER --registered-inputs=yes mult_basic.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  : valid
      Bitwidth  : 32
      Alignment : 4
  Analyzed function mult

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 8
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 8
    ADDRESS bus bitsize: 5
    SIZE bus bitsize: 4
    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: 1
    Number of complex operations: 1
  Time to perform module allocation: 0.01 seconds


  Scheduling Information of function mult:
    Number of control steps: 3
    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: 2
    Minimum number of cycles: 2
    Maximum number of cycles 2
    Parameters are registered
    Done port is registered
  Time to perform creation of STG: 0.00 seconds


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


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


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


  Register binding information for function mult:
    Register allocation algorithm obtains an optimal result: 0 registers
  Time to perform register binding: 0.00 seconds

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


gtkwave を起動して、examples/mult/mult_basic/HLS_output/simulation/test.vcd の波形を確認した。
バス信号は値を Decimal にしてある。
bambu_111_231227.png

done_port と out_z_vld は 1 クロック遅延したが、out_z は組み合わせ回路のままだった。
バグなのか?仕様なんだろうか?すべての入力ポートにレジスタが入っていないんじゃないのかな?
まあ確かに out_z_vld が 1 クロック遅延すれば out_z の値が確定することはあるとは思うが。。。
  1. 2023年12月27日 05:00 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

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

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

Bambu のチュートリアルはやってみたので、今度は自作の簡単な乗算の C ソースコードで試してみようということで、前回は、muti_basic.c を作成し、Bambu で Verilog HDL コードに合成したところ、メモリ・インターフェースのようなポートが生成された。今回は、ヘルプを調べたところ、”--generate-interface=INFER”オプションを作成すると、out_z 出力ポートが生成されて、良い感じの Verilog HDL ファイルが生成された。また、test.xml に入力値と出力の期待値を書いてシミュレーションを行った。

bambu --help コマンドを実行して、出力ポートがまっとうに生成されるオプションを探したところ、”--generate-interface=”の”INFER”が見つかった。”--generate-interface=”の説明を引用する。

    --generate-interface=<type>
        Wrap the top level module with an external interface.
        Possible values for <type> and related interfaces:
            MINIMAL  -  minimal interface (default)
            INFER    -  top function is built with an hardware interface inferred from
                        the pragmas or from the top function signature
            WB4      -  WishBone 4 interface


また、シミュレーションの入力値と出力の期待値を書いた test.xml を用意した。
bambu_102_231226.png

?xml version="1.0"?>
<function>
  <testbench in_x="9" in_y="10" out_z="90" />
</function>


次のコマンドで Bambu を起動した。
bambu mult_basic.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER
bambu_103_231226.png

bambu_104_231226.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_basic$ bambu mult_basic.c --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER
 ==  Bambu executed with: /tmp/.mount_bambu3A4aoN/usr/bin/bambu --top-fname=mult --generate-tb=test.xml --simulator=ICARUS --simulate --generate-vcd --generate-interface=INFER mult_basic.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  : valid
      Bitwidth  : 32
      Alignment : 4
  Analyzed function mult

  Functions to be synthesized:
    mult


  Memory allocation information:
    BRAM bitsize: 8
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 8
    ADDRESS bus bitsize: 5
    SIZE bus bitsize: 4
    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: 1
    Number of complex operations: 1
  Time to perform module allocation: 0.01 seconds


  Scheduling Information of function mult:
    Number of control steps: 3
    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: 1
    Minimum number of cycles: 1
    Maximum number of cycles 1
  Time to perform creation of STG: 0.00 seconds


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


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


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


  Register binding information for function mult:
    Register allocation algorithm obtains an optimal result: 0 registers
  Time to perform register binding: 0.00 seconds

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


examples/mult/mult_basic ディレクトリを示す。
bambu_105_231226.png

mult.v ファイルが生成されているので、確認する。
bambu_106_231226.png

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

  // IN
  input clock;
  input reset;
  input start_port;
  input [31:0] in_x;
  input [31:0] in_y;
  // OUT
  output done_port;
  output [31:0] out_z;
  output out_z_vld;


out_z と out_z_vld の出力ポートが生成されている。良い感じだ。

次に、シミュレーション波形を確認する。
examples/mult/mult_basic/HLS_output/simulation ディレクトリを確認すると、test.vcd が生成されていた。
bambu_107_231226.png

gtkwave を起動して、VCD ファイルの波形を確認した。
バス信号は値を Decimal にしてある。
bambu_108_231226.png

組み合わせ回路となっているようだ。
  1. 2023年12月26日 04:02 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

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

Bambu のチュートリアルはやってみたので、今度は自作の簡単な乗算のコードを書いて、Bambu で高位合成を行って、Verilog HDL ファイルにしてみよう。

PandA-bambu-2023.1/examples ディレクトリの下に mult ディレクトリを作成し、その下に mult_basic ディレクトリを作成し、そこに移動した。

mult_basic.c ファイルを作成した。
mult_basic.c の中身を示す。Vitis HLS では定番のコードを高位合成してみよう。

// mult_basic.c
// 2023/12/25 by marsee

void mult(int in_x, int in_y, int *out_z){
    
    *out_z = in_x * in_y;
}


以下のコマンドを入力し、Bambu で高位合成を行った。
bambu mult_basic.c --top-fname=mult --simulate --simulator=ICARUS --generate-vcd
bambu_98_231225.png

bambu_99_231225.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_basic$ bambu mult_basic.c --top-fname=mult  --simulate --simulator=ICARUS --generate-vcd
 ==  Bambu executed with: /tmp/.mount_bambuSCNIvE/usr/bin/bambu --top-fname=mult --simulate --simulator=ICARUS --generate-vcd mult_basic.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

  Functions to be synthesized:
    mult


  Memory allocation information:
Warning: This function uses unknown addresses: mult
    BRAM bitsize: 16
    Spec may not exploit DATA bus width
    Spec accesses data having an address unknown at compile time
    Internal data is not externally accessible
    DATA bus bitsize: 32
    ADDRESS bus bitsize: 32
    SIZE bus bitsize: 6
    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: 2
    Number of complex operations: 2
  Time to perform module allocation: 0.01 seconds


  Scheduling Information of function mult:
    Number of control steps: 5
    Minimum slack: 1.5599999999999998
    Estimated max frequency (MHz): 118.48341232227489
  Time to perform scheduling: 0.00 seconds


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


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


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


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


  Register binding information for function mult:
    Register allocation algorithm obtains an optimal result: 1 registers
  Time to perform register binding: 0.00 seconds

  Total number of flip-flops in function mult: 32
  All registers are without enable: function pipelining may come for free
  Resources are not shared in function mult: function pipelining may come for free
Warning: XML file "/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/mult/mult_basic/test.xml" cannot be opened, creating a stub with random values
error -> Value of out_z is missing in test vector

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


エラーが出ている。

examples/mult/mult_basic ディレクトリを示す。
bambu_100_231225.png

mult.v ができているので、ファイルを開いた。
bambu_101_231225.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 [63:0] M_Rdata_ram;
  input [1:0] M_DataRdy;
  // OUT
  output done_port;
  output [1:0] Mout_oe_ram;
  output [1:0] Mout_we_ram;
  output [63:0] Mout_addr_ram;
  output [63:0] Mout_Wdata_ram;
  output [11:0] Mout_data_ram_size;

  1. 2023年12月25日 05:00 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう11(led_exampls 編6)

BAMBU TUTORIAL をやってみよう10(led_exampls 編5)”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、--simulate --simulator=VERILATOR オプションを追加して、シミュレーションを行った。今回は、”BAMBU TUTORIAL”の”5.3) Generation of the bitstream with bambu”をやってみる。

5.3) Generation of the bitstream with bambu

BAMBU TUTORIAL”では、ビットストリームを生成して、Nexys4 ボードにコンフィギュレーションするところまで書いてあるが、Nexys4 ボードを持っていないので、ビットストリームを生成するところまでやってみる。

以下のコマンドを実行した。
bambu ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml --top-fname=led_example --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v --C-no-parse=../leds_ctrl.c,../sw_ctrl.c,../btn_ctrl.c,../sevensegments_ctrl.c --clock-period=10 --device-name=xc7a100t-1csg324-VVD --evaluation=PERIOD,AREA,FREQUENCY,CLOCK_SLACK,REGISTERS,DSPS,BRAMS /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/constraints_STD.xml --backend-sdc-extensions=../Nexys4_Master.sdc
bambu_88_231224.png

bambu_89_231224.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/tutorial4$ bambu ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml --top-fname=led_example --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v --C-no-parse=../leds_ctrl.c,../sw_ctrl.c,../btn_ctrl.c,../sevensegments_ctrl.c --clock-period=10 --device-name=xc7a100t-1csg324-VVD --evaluation=PERIOD,AREA,FREQUENCY,CLOCK_SLACK,REGISTERS,DSPS,BRAMS /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/constraints_STD.xml --backend-sdc-extensions=../Nexys4_Master.sdc
 ==  Bambu executed with: /tmp/.mount_bambu7Y3BNF/usr/bin/bambu --top-fname=led_example --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v --C-no-parse=../leds_ctrl.c,../sw_ctrl.c,../btn_ctrl.c,../sevensegments_ctrl.c --clock-period=10 --device-name=xc7a100t-1csg324-VVD --evaluation=PERIOD,AREA,FREQUENCY,CLOCK_SLACK,REGISTERS,DSPS,BRAMS --backend-sdc-extensions=../Nexys4_Master.sdc ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/constraints_STD.xml 


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

********************************************************************************
                         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

  Functions to be synthesized:
    led_example


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


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


  Module allocation information for function led_example:
    Number of complex operations: 9
    Number of complex operations: 9
  Time to perform module allocation: 0.06 seconds


  Scheduling Information of function led_example:
    Number of control steps: 13
    Minimum slack: 0.26039997899991063
    Estimated max frequency (MHz): 102.67362087188845
  Time to perform scheduling: 0.06 seconds


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


  Easy binding information for function led_example:
    Bound operations:134/282
  Time to perform easy binding: 0.00 seconds


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

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

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

  Clique covering computation completed in 0.00 seconds

  Module binding information for function led_example:
    Number of modules instantiated: 279
    Number of performance conflicts: 35
    Estimated resources area (no Muxes and address logic): 4518
    Estimated area of MUX21: 69
    Total estimated area: 4587
    Estimated number of DSPs: 0
  Time to perform module binding: 0.01 seconds


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


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

  Total number of flip-flops in function led_example: 433
  Clock period             : 10
  Design minimum period    : 7.3090000000000002
  Slices                   : 112
  Luts                     : 222
  Lut FF Pairs             : 110
  Power                    : 0.106
  Frequency                : 136.81762210972772
  Design slack             : 2.6909999999999998
  Registers                : 298
  DSPs                     : 0
  BRAMs                    : 0


tutorial4 ディレクトリの内容を示す。
bambu_90_231224.png

tutorial4/HLS_output/Synthesis/vivado_flow ディレクトリに dcp ファイルが生成されている。その内の post_route.dcp を使用する。
bambu_91_231224.png

ビットストリームを生成する前に使用したオプションについて、引用する。
--clock-period=10 クロック周期を 10 ns に指定する。
--device-name=xc7a100t-1csg324-VVD Xilinx の FPGA の型番を指定する。
--evaluation=PERIOD,AREA,FREQUENCY,CLOCK_SLACK,REGISTERS,DSPS,BRAMS 結果の解析中にbambuが評価する必要があるメトリクスをリストするそうだ。レポートの最後の方にも結果がリストされているようだ。
constraints_STD.xml インスタンスる Verilog HDL ファイルとその個数の指定を行うようだ?
bambu_92_231224.png

--backend-sdc-extensions=../Nexys4_Master.sdc 制約ファイルの SDC ファイルを指定するオプション。

program_nexys4.tcl を tutorial4 にコピーして、編集するように書いてあるが、program_nexys4.tcl を見るとビットストリームの生成は2行なので、それ以降はコメントアウトした。

open_checkpoint led_example_synth/HLS_output/Synthesis/vivado_flow/post_route.dcp

open_checkpoint HLS_output/Synthesis/vivado_flow/post_route.dcp

に変更した。
bambu_94_231224.png

以下のコマンドを実行した。
vivado -mode batch -nojournal -nolog -source program_nexys4.tcl
bambu_95_231224.png

bambu_96_231224.png

ログを示す。

examples/led_example/tutorial4$ vivado -mode batch -nojournal -nolog -source program_nexys4.tcl

****** Vivado v2023.2 (64-bit)
  **** SW Build 4029153 on Fri Oct 13 20:13:54 MDT 2023
  **** IP Build 4028589 on Sat Oct 14 00:45:43 MDT 2023
  **** SharedData Build 4025554 on Tue Oct 10 17:18:54 MDT 2023
    ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
    ** Copyright 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved.

WARNING: [Runs 36-547] User Strategy 'Vivado Implementation Defaults' from file '/home/masaaki/.Xilinx/Vivado/2022.1/strategies/Vivado Implementation Defaults_3.Vivado Implementation 2022.psg' discarded because strategy with same name already parsed from '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2023.2/strategies/VDI2022.psg'
WARNING: [Runs 36-547] User Strategy 'Vivado Implementation Defaults' from file '/home/masaaki/.Xilinx/Vivado/2022.1/strategies/Vivado Implementation Defaults_4.Vivado Implementation 2022.psg' discarded because strategy with same name already parsed from '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2023.2/strategies/VDI2022.psg'
WARNING: [Runs 36-547] User Strategy 'Vivado Implementation Defaults' from file '/home/masaaki/.Xilinx/Vivado/2022.1/strategies/Vivado Implementation Defaults.Vivado Implementation 2022.psg' discarded because strategy with same name already parsed from '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2023.2/strategies/VDI2022.psg'
WARNING: [Runs 36-547] User Strategy 'Vivado Implementation Defaults' from file '/home/masaaki/.Xilinx/Vivado/2022.1/strategies/Vivado Implementation Defaults_2.Vivado Implementation 2022.psg' discarded because strategy with same name already parsed from '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2023.2/strategies/VDI2022.psg'
source program_nexys4.tcl
# open_checkpoint HLS_output/Synthesis/vivado_flow/post_route.dcp
Command: open_checkpoint HLS_output/Synthesis/vivado_flow/post_route.dcp

Starting open_checkpoint Task

Time (s): cpu = 00:00:00.03 ; elapsed = 00:00:00.03 . Memory (MB): peak = 1343.047 ; gain = 0.000 ; free physical = 21860 ; free virtual = 43928
INFO: [Device 21-403] Loading part xc7a100tcsg324-1
Netlist sorting complete. Time (s): cpu = 00:00:00 ; elapsed = 00:00:00 . Memory (MB): peak = 1677.141 ; gain = 0.000 ; free physical = 21514 ; free virtual = 43611
INFO: [Netlist 29-17] Analyzing 40 Unisim elements for replacement
INFO: [Netlist 29-28] Unisim Transformation completed in 0 CPU seconds
INFO: [Project 1-479] Netlist was created with Vivado 2018.2
INFO: [Project 1-570] Preparing netlist for logic optimization
INFO: [Constraints 18-4396] File format version for shapeDB does not match. shapeDB will be regenerated.
Read ShapeDB Complete: Time (s): cpu = 00:00:00 ; elapsed = 00:00:00 . Memory (MB): peak = 1745.922 ; gain = 0.000 ; free physical = 21414 ; free virtual = 43521
Parsing XDC File [/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/tutorial4/HLS_output/Synthesis/vivado_flow/post_route/led_example.xdc]
Finished Parsing XDC File [/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/tutorial4/HLS_output/Synthesis/vivado_flow/post_route/led_example.xdc]
Reading placement.
Reading placer database...
Reading routing.
Read Old XDEF File: Time (s): cpu = 00:00:00.04 ; elapsed = 00:00:00.05 . Memory (MB): peak = 1889.793 ; gain = 0.000 ; free physical = 21396 ; free virtual = 43503
Restored from archive | CPU: 0.040000 secs | Memory: 0.632416 MB |
Finished XDEF File Restore: Time (s): cpu = 00:00:00.04 ; elapsed = 00:00:00.05 . Memory (MB): peak = 1889.793 ; gain = 0.000 ; free physical = 21396 ; free virtual = 43503
INFO: [Opt 31-138] Pushed 0 inverter(s) to 0 load pin(s).
Netlist sorting complete. Time (s): cpu = 00:00:00 ; elapsed = 00:00:00 . Memory (MB): peak = 2227.816 ; gain = 0.000 ; free physical = 21015 ; free virtual = 43139
INFO: [Project 1-111] Unisim Transformation Summary:
No Unisim elements were transformed.

INFO: [Project 1-604] Checkpoint was created with Vivado v2018.2 (64-bit) build 2258646
open_checkpoint: Time (s): cpu = 00:00:14 ; elapsed = 00:00:20 . Memory (MB): peak = 2227.852 ; gain = 884.805 ; free physical = 21015 ; free virtual = 43139
# write_bitstream -force final_bistream.bit
Command: write_bitstream -force final_bistream.bit
Attempting to get a license for feature 'Implementation' and/or device 'xc7a100t'
INFO: [Common 17-349] Got license for feature 'Implementation' and/or device 'xc7a100t'
Running DRC as a precondition to command write_bitstream
INFO: [IP_Flow 19-234] Refreshing IP repositories
INFO: [IP_Flow 19-1704] No user IP repositories specified
INFO: [IP_Flow 19-2313] Loaded Vivado IP repository '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vivado/2023.2/data/ip'.
INFO: [DRC 23-27] Running DRC with 4 threads
INFO: [Vivado 12-3199] DRC finished with 0 Errors
INFO: [Vivado 12-3200] Please refer to the DRC report (report_drc) for more information.
INFO: [Designutils 20-2272] Running write_bitstream with 4 threads.
Loading data files...
Loading site data...
Loading route data...
Processing options...
Creating bitmap...
Creating bitstream...
Writing bitstream ./final_bistream.bit...
INFO: [Vivado 12-1842] Bitgen Completed Successfully.
INFO: [Project 1-1876] WebTalk data collection is mandatory when using a ULT device. To see the specific WebTalk data collected for your design, open the usage_statistics_webtalk.html or usage_statistics_webtalk.xml file in the implementation directory.
INFO: [Common 17-83] Releasing license: Implementation
11 Infos, 0 Warnings, 0 Critical Warnings and 0 Errors encountered.
write_bitstream completed successfully
write_bitstream: Time (s): cpu = 00:00:11 ; elapsed = 00:00:18 . Memory (MB): peak = 2641.770 ; gain = 413.918 ; free physical = 20574 ; free virtual = 42716
INFO: [Common 17-206] Exiting Vivado at Sun Dec 24 09:01:45 2023...


final_bistream.bit が生成された。
bambu_97_231224.png
  1. 2023年12月24日 09:10 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう10(led_exampls 編5)

BAMBU TUTORIAL をやってみよう9(led_exampls 編4)”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、Verilog HDL の各モジュールを指定した Bambu のコンパイルを行った。今回は、--simulate --simulator=VERILATOR オプションを追加して、シミュレーションを行った。

5.2) Simulation with hand-written HDL modules
シミュレーションを行うコマンドは”--simulate”で、シミュレータを”-simulator=YOUR_FAVORITE_SIMULATOR”で指定し、シミュレーションを行う際には Bambu がテストベンチを自動生成する。
シミュレーションを行うには、 btn_ctrl、leds_ctrl、sevensegments_ctrl、sw_ctrl の 4 個のモジュールの C ソースコードが必要なので、次のコマンドで C ソースコードを”--C-no-parse=”オプションで指定して、Bambu のコンパイルを行う。

新たに tutorial3 ディレクトリを作成し、tutorial3 ディレクトリに行って、以下のコマンドを実行した。
bambu ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml --top-fname=led_example --simulate --simulator=VERILATOR --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v --C-no-parse=../leds_ctrl.c,../sw_ctrl.c,../btn_ctrl.c,../sevensegments_ctrl.c
bambu_79_231222.png

bambu_80_231222.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/tutorial3$ bambu ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml --top-fname=led_example --simulate --simulator=VERILATOR --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v --C-no-parse=../leds_ctrl.c,../sw_ctrl.c,../btn_ctrl.c,../sevensegments_ctrl.c
 ==  Bambu executed with: /tmp/.mount_bambuqgeYLr/usr/bin/bambu --top-fname=led_example --simulate --simulator=VERILATOR --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v --C-no-parse=../leds_ctrl.c,../sw_ctrl.c,../btn_ctrl.c,../sevensegments_ctrl.c ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml 


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

********************************************************************************
                         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

  Functions to be synthesized:
    led_example


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


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


  Module allocation information for function led_example:
    Number of complex operations: 9
    Number of complex operations: 9
  Time to perform module allocation: 0.06 seconds


  Scheduling Information of function led_example:
    Number of control steps: 13
    Minimum slack: 0.10259997299990542
    Estimated max frequency (MHz): 101.03663560854379
  Time to perform scheduling: 0.05 seconds


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


  Easy binding information for function led_example:
    Bound operations:134/282
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function led_example:
    Number of storage values inserted: 42
  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 led_example:
    Register allocation algorithm obtains a sub-optimal result: 38 registers(LB:18)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function led_example:
    Number of modules instantiated: 279
    Number of performance conflicts: 35
    Estimated resources area (no Muxes and address logic): 4522
    Estimated area of MUX21: 69
    Total estimated area: 4591
    Estimated number of DSPs: 0
  Time to perform module binding: 0.00 seconds


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


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

  Total number of flip-flops in function led_example: 446
Warning: XML file "/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/tutorial3/test.xml" cannot be opened, creating a stub with random values
Warning: Simulation completed but it is not possible to determine if it is correct!
  Total cycles             : 20 cycles
  Number of executions     : 1
  Average execution        : 20 cycles


ログにシミュレーション結果が表示されている。

tutorial3 ディレクトリを示す。
bambu_81_231222.png

tutorial3/HLS_output ディレクトリの下に Synthesis, simulation, verilator_beh ディレクトリが生成された。
simulation ディレクトリには、C++ と Verilog HDL のテストベンチ・ファイルが生成された。
bambu_82_231222.png

”--C-no-parse=”オプションで指定された C コードのファイルは HLS には使用されないそうだ。

Verilog HDL と C 言語のコードが同一で無いために Verilog HDL でのシミュレーションと C 言語でのシミュレーションが同一にならない現象が発生するようだ。

例えば、btn_ctrl.c は常に 1 を返すが、btn_ctrl.v はボタン・スイッチの値を out1 に出力するので、同じ動作じゃない。
btn_ctrl.h と btn_ctrl.c を引用する。
bambu_84_231222.png

bambu_83_231222.png

次に、”--generate-vcd”オプションを追加して、VCD ファイルを生成した。
bambu ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml --top-fname=led_example --simulate --simulator=VERILATOR --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v --C-no-parse=../leds_ctrl.c,../sw_ctrl.c,../btn_ctrl.c,../sevensegments_ctrl.c --generate-vcd
bambu_85_231222.png

tutorial3/HLS_output/simulation ディレクトリに test.vcd が生成された。
bambu_86_231222.png

GTKWAVE で test.vcd の波形を表示した。
bambu_87_231222.png

start_port と done_port には 1 のパルスがあるが、他のポートは 0 のままだった。
  1. 2023年12月23日 04:24 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう9(led_exampls 編4)

Bambu のVerilog HDL モジュールと C 関数を関連付ける定義ファイルの IPs.xml の解説を引用した”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、”BAMBU TUTORIAL”に書かれている IPs.xml の仕様を勉強した。今回は、Verilog HDL の各モジュールを指定した Bambu のコンパイルを行った。

今までは、led_example.c のみ指定して Bambu のコンパイルをしてきたが、他に btn_ctrl、leds_ctrl、sevensegments_ctrl、sw_ctrl の 4 個のモジュールがある。その 4 個のモジュールの C ソースコードのファイルの関数の中身はほとんど空で Verilog HDL ファイルが実態なので、”--file-input-data”オプションを使用して、Verilog HDL ファイルを指定する。

tutorial2 ディレクトリを新規作成し、tutorial2 ディレクトリに行って、コマンドを実行した。
bambu ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml --top-fname=led_example --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v
bambu_75_231222.png

bambu_76_231222.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/tutorial2$ bambu ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml --top-fname=led_example --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v
 ==  Bambu executed with: /tmp/.mount_bambusRy60X/usr/bin/bambu --top-fname=led_example --file-input-data=../leds_ctrl.v,../sw_ctrl.v,../btn_ctrl.v,../sevensegments_ctrl.v ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml 


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

********************************************************************************
                         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

  Functions to be synthesized:
    led_example


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


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


  Module allocation information for function led_example:
    Number of complex operations: 9
    Number of complex operations: 9
  Time to perform module allocation: 0.06 seconds


  Scheduling Information of function led_example:
    Number of control steps: 13
    Minimum slack: 0.10259997299990542
    Estimated max frequency (MHz): 101.03663560854379
  Time to perform scheduling: 0.05 seconds


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


  Easy binding information for function led_example:
    Bound operations:134/282
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function led_example:
    Number of storage values inserted: 42
  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 led_example:
    Register allocation algorithm obtains a sub-optimal result: 38 registers(LB:18)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function led_example:
    Number of modules instantiated: 279
    Number of performance conflicts: 35
    Estimated resources area (no Muxes and address logic): 4522
    Estimated area of MUX21: 69
    Total estimated area: 4591
    Estimated number of DSPs: 0
  Time to perform module binding: 0.00 seconds


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


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

  Total number of flip-flops in function led_example: 446


tutorial2 ディレクトリの様子を示す。
指定した Verilog HDL ファイルをコピーしているようだ。
bambu_77_231222.png

以前のコマンドを実行した turorial ディレクトリを示す。
bambu_78_231222.png

led_example.v は tutorial ディレクトリ、tutorial2 ディレクトリ共にほとんど同じ容量だった。やはり、Verilog HDL ファイルをコピーしているかどうか?が違いのようだ。
  1. 2023年12月22日 05:09 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

Bambu のVerilog HDL モジュールと C 関数を関連付ける定義ファイルの IPs.xml の解説を引用した

BAMBU TUTORIAL をやってみよう8(led_exampls 編3)”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、IPs.xml がエラーになる原因を探ったのだが、どうやらフルパスで指定しないとエラーになるようだった。今回は、”BAMBU TUTORIAL”に書かれている IPs.xml の仕様を勉強してみよう。

BAMBU TUTORIAL”の IPs.xml の説明を Google Translate や DeepL で翻訳しながら、引用する。

led_example ディレクトリの IPs.xml には、leds_ctrl、sw_ctrl、btn_ctrl、sevensegments_ctrl の 4 個のセルがある。いずれも Verilog HDL ファイルがあるモジュールとなっている。
bambu_60_231218.png

セルの情報の説明
・ <name>module_name</name>: は Verilog HDL モジュールの名称を示す。
・ <operation operation_name="op_name" [params]/>:  セルに関連付けされた Verilog HDL モジュールの各種情報。
 * "op_name"は Verilog HDL に関連付ける C 関数を示す。今回は、Verilog HDL モジュールと同じ名前になっている。leds_ctrl など。。。
 * bounded : bounded =”0" は実行時間が不明もしくは一定で無いことを示す。bounded ="1" は実行時間が既知で一定であることを示す。
モジュールがパイプライン化されている場合
 * clock : clock="n" の n は実行サイクル数を示す。
 * initiation_time : initiation_time="k" の k はパイプラインの開始時刻を示す。
 * stage_period : stage_period="f" の f はパイプラインのステージの実行時間 (ナノ秒単位) を表す浮動小数点数。
モジュールがパイプライン化されていない場合
 * clock : clock="n" の n は実行サイクル数を示す。(1 以上)
 * execution_time : execution_time="f" の f は実行時間をナノ秒単位で表す浮動小数点数。1 のときだけ意味がある?

・ <circuit><component_o id="module_name">[body]</component_o></circuit>:  "module_name"は <name>module_name</name> に書いた Verilog HDL モジュール名を使用する。
[body] に指定するフォーマットを以下に示す。
 * <structural_type_descriptor id_type="module_name">:  Verilog HDL モジュールの名前。
 * ポートごとの仕様
  <port_o id="signal_name" dir="direction" [params]><structural_type_descriptor type="type_str" size="n"></port_o>
  "direction" は "IN" か "OUT" を指定できる。"INOUT" は使用できない。
  "signal_name" は Verilog HDL モジュールのポート名。
  "type_str" はポートの信号のタイプを示す。"BOOL", "INT", "UINT" and REAL.
  "n" はポートのビット幅を示す。type_str" が "BOOL" の場合は 1。"BOOL" 以外は、C 言語の対応する変数の型のビット幅と合わせる。
ポートを指定する順番は IPs.xml ファイルと Verilog HDL モジュールで同じ順番にする必要がある。
最初のポートはクロックポートを指定する。(クロックポートがない場合はどれでも良いのだろうか?)
クロックポートは BOOL のポートとなる。クロックポートの例を引用する。

<port_o id="clock" dir="IN" is_clock="1">
  <structural_type_descriptor type="BOOL" size="1"/>
</port_o>


2 番目に指定するポートはリセット信号となる。例を引用する。

<port_o id="reset" dir="IN">
  <structural_type_descriptor type="BOOL" size="1"/>
</port_o>


3 番目は start_port となる。例を引用する。

<port_o id="start_port" dir="IN">
  <structural_type_descriptor type="BOOL" size="1"/>
</port_o>


done_portを指定する必要な場合があるそうだ。(not bounded)
done_port の例を引用する。

<port_o id="done_port" dir="OUT">
  <structural_type_descriptor type="BOOL" size="1"/>
</port_o>


DeepL の翻訳結果をそのまま引用する。
このポートはバインドされていないモジュールに使用され、呼び出し元に対して実行が終了し、結果がリターン・ポートに準備できたことを通知します(関数のリターン・タイプがvoidでない場合)。

次に指定するのは return_port で、値を返すポートとなる。関数の型が void の場合は指定する必要は無い。
id は任意の名前、dir は "OUT"、ypeとsizeはC関数の戻り値型と一致させる。

その次は Verilog HDL のポートを続けて書くようだ。(自分の推測)
btn_ctrl の btn と out1 のポートの記述を引用する。

          <port_o id="btn" dir="IN" is_global="1" is_extern="1">
            <structural_type_descriptor type="UINT" size="4"/>
          </port_o>
          <port_o id="out1" dir="OUT">
            <structural_type_descriptor type="UINT" size="4" />
          </port_o>


・ <NP_functionality LIBRARY="module_name" VERILOG_FILE_PROVIDED="verilog_filename.v">: Verilog HDL のモジュール名とファイル名を指定する。

VHDL を使用する場合の DeepL 翻訳を引用する。

VerilogではなくVHDLで書かれた外部モジュールを使用する場合は、xmlのVERILOG_FILE_PROVIDEDをVHDL_FILE_PROVIDEDに変更し、"verilog_filename.v "を適切なVHDLファイル名に変更するだけです。

  1. 2023年12月21日 05:06 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう8(led_exampls 編3)

BAMBU TUTORIAL をやってみよう7(led_exampls 編2)”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、”BAMBU TUTORIAL”に従って、”5.1) Mapping C functions to hand-written HDL modules”の最初のコマンドを実行したところ、IPs.xml がエラーになった。色々とやってみたが、エラーが解消されなかった。諦めて、synthesize_NEXYS4.sh のシミュレータを ModelSim から Verilator に変更して、実行すると実行することができた。今回は、IPs.xml がエラーになる原因を探ったのだが、どうやらフルパスで指定しないとエラーになるようだ。

IPs.xml がエラーにならない条件を探ってみたところ、どうやらフルパスで記述すればエラーにならないようだった!
bambu ../led_example.c --top-fname=led_example /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml
bambu_71_231220.png

bambu_72_231220.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/tutorial$ bambu ../led_example.c --top-fname=led_example /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml
 ==  Bambu executed with: /tmp/.mount_bambu7njqEv/usr/bin/bambu --top-fname=led_example ../led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml 


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

********************************************************************************
                         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

  Functions to be synthesized:
    led_example


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


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


  Module allocation information for function led_example:
    Number of complex operations: 9
    Number of complex operations: 9
  Time to perform module allocation: 0.06 seconds


  Scheduling Information of function led_example:
    Number of control steps: 13
    Minimum slack: 0.10259997299990542
    Estimated max frequency (MHz): 101.03663560854379
  Time to perform scheduling: 0.05 seconds


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


  Easy binding information for function led_example:
    Bound operations:134/282
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function led_example:
    Number of storage values inserted: 42
  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 led_example:
    Register allocation algorithm obtains a sub-optimal result: 38 registers(LB:18)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.01 seconds

  Module binding information for function led_example:
    Number of modules instantiated: 279
    Number of performance conflicts: 35
    Estimated resources area (no Muxes and address logic): 4522
    Estimated area of MUX21: 69
    Total estimated area: 4591
    Estimated number of DSPs: 0
  Time to perform module binding: 0.01 seconds


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


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

  Total number of flip-flops in function led_example: 446


tutorial ディレクトリの様子を示す。
bambu_73_231220.png

生成された lef_example.v を確認してみよう。
bambu_74_231220.png

// IN
input clock;
input reset;
input start_port;
input [3:0] btn;
input [15:0] sw;
// OUT
output done_port;
output [15:0] leds;
output [7:0] sseg_ca;
output [7:0] sseg_an;


start_port と done_port 以外の入力ポートと出力ポートが定義されている。
C ソースコードでは、void led_example() だったので、やはり、IPs.xml が入力ポートと出力ポートを定義しているようだ。
bambu_56_231218.png
  1. 2023年12月20日 05:18 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう7(led_exampls 編2)

BAMBU TUTORIAL をやってみよう6(led_exampls 編1)”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、exmaples/led_example のファイルを解説した。今回は、”BAMBU TUTORIAL”に従って、”5.1) Mapping C functions to hand-written HDL modules”の最初のコマンドを実行したところ、IPs.xml がエラーになった。色々とやってみたが、エラーが解消されなかった。諦めて、synthesize_NEXYS4.sh のシミュレータを ModelSim から Verilator に変更して、実行すると実行することができた。

BAMBU TUTORIAL”の”5.1) Mapping C functions to hand-written HDL modules”をやってみよう。

led_example の下に tutorial ディレクトリを作成し、bambu を実行する。
mkdir tutorial
cd tutorial
bambu ../led_example.c --top-fname=led_example ../IPs.xml

エラーになった。
エラー内容は”error -> Error during technology file parsing: error -> Error in opening ../IPs.xml”だった。
bambu_61_231219.png

いろいろやってみたがエラーが解消されなかった。
そこで、led_exsample ディレクトリに行って synthesize_NEXYS4.sh を実行したところ、ModelSim が無いというエラーだった。

error -> Mentor Modelsim was not detected by Bambu. Please check --mentor-root option is correct.


synthesize_NEXYS4.sh を編集し、シミュレータを ModelSim から VERILATOR に変更した。
bambu_70_231219.png

もう一度、synthesize_NEXYS4.sh を実行したところ成功した。
./synthesize_NEXYS4.sh
bambu_62_231219.png

bambu_63_231219.png

実行ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example$ ./synthesize_NEXYS4.sh 
 ==  Bambu executed with: /tmp/.mount_bambu9RNwSA/usr/bin/bambu --top-fname=led_example --backend-sdc-extensions=/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/Nexys4_Master.sdc -O3 --device-name=xc7a100t-1csg324-VVD --clock-period=10 --C-no-parse=/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/sw_ctrl.c,/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/leds_ctrl.c,/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/btn_ctrl.c,/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/sevensegments_ctrl.c --file-input-data=/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/leds_ctrl.v,/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/sw_ctrl.v,/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/btn_ctrl.v,/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/sevensegments_ctrl.v --simulator=VERILATOR --evaluation=PERIOD,AREA,FREQUENCY,CLOCK_SLACK,REGISTERS,DSPS,BRAMS --print-dot /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/led_example.c /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/constraints_STD.xml /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/led_example/IPs.xml 


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

********************************************************************************
                         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

  Functions to be synthesized:
    led_example


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


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


  Module allocation information for function led_example:
    Number of complex operations: 9
    Number of complex operations: 9
  Time to perform module allocation: 0.06 seconds


  Scheduling Information of function led_example:
    Number of control steps: 13
    Minimum slack: 0.26039997899991063
    Estimated max frequency (MHz): 102.67362087188845
  Time to perform scheduling: 0.06 seconds


  State Transition Graph Information of function led_example:
    Number of states: 11
    Done port is registered
  Time to perform creation of STG: 0.02 seconds


  Easy binding information for function led_example:
    Bound operations:134/282
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function led_example:
    Number of storage values inserted: 41
  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 led_example:
    Register allocation algorithm obtains a sub-optimal result: 37 registers(LB:17)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function led_example:
    Number of modules instantiated: 279
    Number of performance conflicts: 35
    Estimated resources area (no Muxes and address logic): 4518
    Estimated area of MUX21: 69
    Total estimated area: 4587
    Estimated number of DSPs: 0
  Time to perform module binding: 0.01 seconds


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


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

  Total number of flip-flops in function led_example: 433
  Clock period             : 10
  Design minimum period    : 7.3090000000000002
  Slices                   : 112
  Luts                     : 222
  Lut FF Pairs             : 110
  Power                    : 0.106
  Frequency                : 136.81762210972772
  Design slack             : 2.6909999999999998
  Registers                : 298
  DSPs                     : 0
  BRAMs                    : 0


led_example_synth ディレクトリが生成されて、led_example.xpr つまり、Vivado のプロジェクト・ファイルが生成されていた。
bambu_64_231219.png
  1. 2023年12月19日 05:32 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう6(led_exampls 編1)

BAMBU TUTORIAL をやってみよう5”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、入力値を記述した test_icrc.xml を使用してシミュレーションを行った。今回は新たに exmaples/led_example をやってみよう。このサンプルでは、スイッチによって設定された 2 進数を 10 進数に変換する Digilent 社の NEXYS4 ボード用のビットストリームを生成する。今回は、サンプルのファイルを解説した。

なお、”BAMBU TUTORIAL”の文章を Chrome で日本語訳して、参照している。

exmaples/led_example をやってみよう。
led_example はスイッチによって設定された 2 進数を 10 進数に変換する Digilent 社の NEXYS4 ボード用のビットストリームを生成するそうだ。

exmaples/led_example ディレクトリを示す。
bambu_55_231218.png

C 言語のファイルと Verilog HDL ファイルが混じったディレクトリとなっている。
トップの led_example.c ファイルは実行コードが書いてある。
bambu_56_231218.png

しかし、sw_ctrl.c、btn_ctrl.c、leds_ctrl.c、sevensegments_ctrl.c の関数内には、printf() や return 関数しか書かれていないで中身がない。
sw_ctrl.c の内容を示す。
bambu_57_231218.png

ヘッダ・ファイルには関数の extern 宣言が書かれている。
sw_ctrl.h を示す。
bambu_58_231218.png

Verilog HDL ファイルもあって、各下位モジュールはこれが本体のようだ。
sw_ctrl.v を示す。
bambu_59_231218.png

C 関数の Verilog HDL モジュールへのマッピングに使用されるファイルが IPs.xml になる。
IPs.xml ファイルには、btn_ctrl、leds_ctrl、sevensegments_ctrl、sw_ctrl の入出力ピンのプロパティなどを記述してある。
IPs.xml ファイルの一部を示す。
bambu_60_231218.png

更に Nexys4 評価ボードのマスターの制約ファイルの Nexys4_Master.sdc がある。
これは、Vivado プロジェクトを生成し、制約ファイルを作成する際に必要となるんだろう?
  1. 2023年12月18日 04:41 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう5

BAMBU TUTORIAL をやってみよう4”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、Bambu のシミュレーション機能を検証した。今回は、入力値を記述した test_icrc.xml を使用してシミュレーションを行った。

examples/crc/test_icrc.xml を示す。
bambu_47_231215.png

test_icrc.xml には、2 個の <testbench .../>; の文があるが、これは、1 個ごとに XML ファイルに書いてある引数を入力して icrc() 関数をコールしている。つまり、test_icrc.xml では 2 回 icrc() 関数をコールしている。

test_icrc.xml を入力データとして、シミュレーションを行う。
bambu ../spec.c --top-fname=icrc --generate-tb=../test_icrc.xml --simulate --simulator=VERILATOR --generate-vcd
実行結果を示す。
bambu_50_231217.png

bambu_49_231217.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/crc/simulation2$ bambu ../spec.c --top-fname=icrc --generate-tb=../test_icrc.xml --simulate --simulator=VERILATOR --generate-vcd
 ==  Bambu executed with: /tmp/.mount_bambub5L8ZI/usr/bin/bambu --top-fname=icrc --generate-tb=../test_icrc.xml --simulate --simulator=VERILATOR --generate-vcd ../spec.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

  Functions to be synthesized:
    icrc


  Memory allocation information:
Warning: This function uses unknown addresses: icrc
    BRAM bitsize: 8
    Spec may not exploit DATA bus width
    Spec accesses data having an address unknown at compile time
    Internal data is not externally accessible
    DATA bus bitsize: 16
    ADDRESS bus bitsize: 32
    SIZE bus bitsize: 5
    Internally allocated memory (no private memories): 0
    Internally allocated memory: 786
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function icrc:
    Number of complex operations: 15
    Number of complex operations: 15
  Time to perform module allocation: 0.03 seconds


  Scheduling Information of function icrc:
    Number of control steps: 24
    Minimum slack: 1.073049996000017
    Estimated max frequency (MHz): 112.02034284407559
  Time to perform scheduling: 0.01 seconds


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


  Easy binding information for function icrc:
    Bound operations:138/188
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function icrc:
    Number of storage values inserted: 50
  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 icrc:
    Register allocation algorithm obtains a sub-optimal result: 41 registers(LB:27)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function icrc:
    Number of modules instantiated: 180
    Number of performance conflicts: 12
    Estimated resources area (no Muxes and address logic): 3976
    Estimated area of MUX21: 207
    Total estimated area: 4183
    Estimated number of DSPs: 0
  Time to perform module binding: 0.00 seconds


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


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

  Total number of flip-flops in function icrc: 777
  Total cycles             : 2897 cycles
  Number of executions     : 2
  Average execution        : 1448 cycles


ログの最後を見ると”Total cycles”が 2897 cycles、”Number of executions”が 2 回、”Average execution”が 1448 cycles だった。実際の実行ごとの経過クロックは、results.txt に書かれているそうだ。その内容を下に示す。

1                 2725
1                  172


最初の 1 は実行結果で 1 が成功、0 が失敗、その次が実行時のクロック数だそうだ。最初の実行に 2725 クロック掛かっているが、次の実行では、172 クロックとなっている。

コマンドのオプションに”--generate-vcd”を付加したので、VCD ファイルが生成されている。これを見てみよう。
GTKWAVE を起動して、ポートを読み込んだ。
bambu_52_231217.png

start_port と done_port が 2 パルス出ているので、2 個のトランザクションがあることが分かる。

最初の done_port の周辺を拡大してみた。
bambu_53_231217.png

2 番めの done_port の周辺を拡大してみた。
bambu_54_231217.png
  1. 2023年12月17日 09:29 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう4

BAMBU TUTORIAL をやってみよう3”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、今まで、main 関数がトップの Verilog HDL ファイルを Bambu で生成させたが、icrc 関数がトップの Verilog HDL ファイルを Bambu で生成させた。今回は、Bambu のシミュレーション機能を検証した。

BAMBU TUTORIAL”の”4) Simulation”をやってみよう。

Bambu でシミュレーションを行う。
XML ファイルが指定して無ければ、ランダムに生成された値が入力ポートに入力されるようだ。
XML ファイルには入力値とその場合の出力ポートの期待値を書いて、回路の出力とtest.xml に書かれた期待値と比較をして、違っていたらエラーを表示する。

crc ディレクトリに simulation ディレクトリを生成し、その下で、シミュレーションを行った。

Bambu のシミュレーション用コマンドを実行して、Verilator でシミュレーションを行う。
bambu ../spec.c --simulate --simulator=VERILATOR
bambu_39_231215.png

bambu_40_231215.png

全ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/crc/simulation$ bambu ../spec.c --simulate --simulator=VERILATOR
 ==  Bambu executed with: /tmp/.mount_bambuuowaQ4/usr/bin/bambu --simulate --simulator=VERILATOR ../spec.c 

Warning: Top function name was not specified: main will be set as top
Warning: Using 'main' as top function name is strongly discouraged.
Warning:    Please note that C simulation output may be truncated down to 8-bits.

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

********************************************************************************
                         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

  Functions to be synthesized:
    icrc_constprop_0
    main


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


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


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


  Scheduling Information of function icrc_constprop_0:
    Number of control steps: 11
    Minimum slack: 1.6570499950000166
    Estimated max frequency (MHz): 119.86167954988268
  Time to perform scheduling: 0.00 seconds


  State Transition Graph Information of function icrc_constprop_0:
    Number of states: 10
    Parameters are registered
    Done port is registered
  Time to perform creation of STG: 0.00 seconds


  Easy binding information for function icrc_constprop_0:
    Bound operations:74/88
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function icrc_constprop_0:
    Number of storage values inserted: 27
  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 icrc_constprop_0:
    Register allocation algorithm obtains a sub-optimal result: 22 registers(LB:15)
  Time to perform register binding: 0.01 seconds

  Clique covering computation completed in 0.01 seconds

  Module binding information for function icrc_constprop_0:
    Number of modules instantiated: 86
    Number of performance conflicts: 2
    Estimated resources area (no Muxes and address logic): 2195
    Estimated area of MUX21: 102
    Total estimated area: 2297
    Estimated number of DSPs: 0
  Time to perform module binding: 0.01 seconds


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


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

  Total number of flip-flops in function icrc_constprop_0: 274

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


  Scheduling Information of function main:
    Number of control steps: 6
    Minimum slack: 1.1102230246251565e-15
    Estimated max frequency (MHz): 100.00000000000001
  Time to perform scheduling: 0.00 seconds


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


  Easy binding information for function main:
    Bound operations:7/9
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function main:
    Number of storage values inserted: 3
  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 main:
    Register allocation algorithm obtains an optimal result: 2 registers
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function main:
    Number of modules instantiated: 8
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 2007
    Estimated area of MUX21: 102
    Total estimated area: 2109
    Estimated number of DSPs: 0
  Time to perform module binding: 0.00 seconds


  Register binding information for function main:
    Register allocation algorithm obtains an optimal result: 2 registers
  Time to perform register binding: 0.00 seconds


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

  Total number of flip-flops in function main: 32
Warning: XML file "/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/crc/simulation/test.xml" cannot be opened, creating a stub with random values
  Total cycles             : 2815 cycles
  Number of executions     : 1
  Average execution        : 2815 cycles


シミュレーションに 2815 クロックかかったようだ。

なお使用できるシミュレータだが、以下のシミュレータが使用できるそうだ。

VERILATOR
ICARUS
MODELSIM
XSIM (Vivado に付属のザイリンクス シミュレーター)
ISIM (ISE に付属のザイリンクス シミュレータ)



simulation ディレクトリの様子を示す。
bambu_41_231215.png

HLS_output ディレクトリが生成された。
HLS_output ディレクトリの下に、Synthesis ディレクトリだけではなく、simulation と verilaor_beh ディレクトリが生成された。
simulation ディレクトリを示す。
bambu_42_231215.png

simulation ディレクトリに test.xml があるが、ここに入力ポートに入力する値と出力ポートの期待値を書くことができる。
examples/onnx/02_vecmul_b/test.xml を引用する。
ここでは、3 個の引数はすべて入力だった。
bambu_47_231215.png

シミュレーションで波形が無いのが寂しいので、波形を表示してみよう。
VCD 波形を出力するオプションは”--generate-vcd”だ。これを付けてシミュレーションを行う。
bambu ../spec.c --simulate --simulator=VERILATOR --generate-vcd
bambu_43_231215.png

HLS_output/simulation ディレクトリに test.vcd ファイルが生成された。
bambu_44_231215.png

gtkwave を起動して、test.vcd を観察した。
bambu_45_231215.png

はじめに start_port が 1 になって、最後に done_port が 1 になっているのが分かる。
done_port が 1 のときの return_port の値は 0x000000000 だった。
bambu_46_231215.png
  1. 2023年12月16日 04:57 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう3

BAMBU TUTORIAL をやってみよう2”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、前々回、生成された vivado.tcl を Vivado 2023.2 で実行し、Vivado のプロジェクトを作成した。今回は、今まで、main 関数がトップの Verilog HDL ファイルを Bambu で生成させたが、icrc 関数がトップの Verilog HDL ファイルを Bambu で生成させた。

なお、”BAMBU TUTORIAL”によると、-O0, -O1, -O2, -O3, -Os オプションで最適化したり、-I オプションでインクルード・ファイルを指定したり、通常の C や C++ コンパイラのほとんどのオプションは使えるそうだ。

さて、icrc 関数がトップの Verilog HDL ファイルを Bambu で生成させる。
bambu ../spec.c --top-fname=icrc
コマンドを実行した。
bambu_30_231215.png

bambu_31_231215.png

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/crc$ bambu spec.c --top-fname=icrc
 ==  Bambu executed with: /tmp/.mount_bambu6fsdBz/usr/bin/bambu --top-fname=icrc spec.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

  Functions to be synthesized:
    icrc


  Memory allocation information:
Warning: This function uses unknown addresses: icrc
    BRAM bitsize: 8
    Spec may not exploit DATA bus width
    Spec accesses data having an address unknown at compile time
    Internal data is not externally accessible
    DATA bus bitsize: 16
    ADDRESS bus bitsize: 32
    SIZE bus bitsize: 5
    Internally allocated memory (no private memories): 0
    Internally allocated memory: 786
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function icrc:
    Number of complex operations: 15
    Number of complex operations: 15
  Time to perform module allocation: 0.03 seconds


  Scheduling Information of function icrc:
    Number of control steps: 24
    Minimum slack: 1.073049996000017
    Estimated max frequency (MHz): 112.02034284407559
  Time to perform scheduling: 0.01 seconds


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


  Easy binding information for function icrc:
    Bound operations:138/188
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function icrc:
    Number of storage values inserted: 50
  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 icrc:
    Register allocation algorithm obtains a sub-optimal result: 41 registers(LB:27)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function icrc:
    Number of modules instantiated: 180
    Number of performance conflicts: 12
    Estimated resources area (no Muxes and address logic): 3976
    Estimated area of MUX21: 207
    Total estimated area: 4183
    Estimated number of DSPs: 0
  Time to perform module binding: 0.00 seconds


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


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

  Total number of flip-flops in function icrc: 777


crc ディレクトリに icrc.v ファイルが生成された。
icrc.v の icrc モジュールを示す。
bambu_32_231215.png

ポートの宣言を貼っておく。

// Minimal interface for function: icrc
// This component has been derived from the input source code and so it does not fall under the copyright of PandA framework, but it follows the input source code copyright, and may be aggregated with components of the BAMBU/PANDA IP LIBRARY.
// Author(s): Component automatically generated by bambu
// License: THIS COMPONENT IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
`timescale 1ns / 1ps
module icrc(clock,
  reset,
  start_port,
  crc,
  lin,
  len,
  jinit,
  jrev,
  M_Rdata_ram,
  M_DataRdy,
  done_port,
  return_port,
  Mout_oe_ram,
  Mout_we_ram,
  Mout_addr_ram,
  Mout_Wdata_ram,
  Mout_data_ram_size);
  // IN
  input clock;
  input reset;
  input start_port;
  input [15:0] crc;
  input [31:0] lin;
  input [31:0] len;
  input [15:0] jinit;
  input [31:0] jrev;
  input [31:0] M_Rdata_ram;
  input [1:0] M_DataRdy;
  // OUT
  output done_port;
  output [15:0] return_port;
  output [1:0] Mout_oe_ram;
  output [1:0] Mout_we_ram;
  output [63:0] Mout_addr_ram;
  output [31:0] Mout_Wdata_ram;
  output [9:0] Mout_data_ram_size;


RAM のインターフェースが生成されているようだ?

HLS_output/Synthesis/vivado_flow_0 ディレクトリが生成された。
icrc.sdc と vivado.tcl が生成されていた。
bambu_33_231215.png

Vivado 2023.2 の TCL Console で vivado.tcl を実行した。
cd ../vivado_flow_0/
source vivado.tcl

bambu_34_231215.png

途中で、IO の数が足りないエラーになった。
bambu_35_231215.png
bambu_36_231215.png

ともかく、icrc の Vivado 2023.2 プロジェクトができた。
bambu_37_231215.png

Sources ウインドウで icrc をクリックして、icrc.v ファイルの icrc モジュールの部分の記述を確認した。
bambu_38_231215.png
  1. 2023年12月15日 03:56 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう2

BAMBU TUTORIAL をやってみよう1”の続き。

BAMBU TUTORIAL”をやってみようということで、前回は、excamples/crc ディレクトリで”bambu spec.c”コマンドを実行し、top.v の Verilog HDL ファイルを生成した。今回は、前回生成された vivado.tcl を Vivado 2023.2 で実行し、Vivado のプロジェクトを作成した。

前回、HLS_output/vivado_flow ディレクトリに vivado.tcl ファイルが生成された。この tcl ファイルを Vivado 2023.2 で実行してプロジェクトを作成する。

Vivado 2023.2 を起動した。
TCL Console で HLS_output/vivado_flow ディレクトリに行って、vivado.tcl を実行した。
cd /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/crc/HLS_output/Synthesis/vivado_flow
source vivado.tcl

bambu_23_231213.png
bambu_24_231213.png

HLS_output/vivado_flow ディレクトリに Vivado のプロジェクト・ファイルの main.xpr が生成された。
bambu_25_231213.png

Vivado 2023.2 で main.xpr を読み込んだ。
bambu_26_231213.png

Flow Navigtor から SYNTHESIS -> Run Synthesis をクリックして、論理合成を行った。
Flow Navigtor から SYNTHESIS -> Open Synthesized Design をクリックし、Synthesized Design を開いた。
bambu_27_231213.png

Schematic をクリックして、回路図を開いた。
bambu_28_231213.png

拡大した。
bambu_29_231213.png

配置制約を書いていないので、とりあえず Vivado での作業はここまで。
vivado.tcl を実行すると Vivado のプロジェクトが生成されるのが分かった。
  1. 2023年12月14日 03:26 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

BAMBU TUTORIAL をやってみよう1

フリーの高位合成ツール Bambu を使ってみよう3”で高位合成ツールの Bambu がインストールできたので、チュートリアルをやってみたい。どのチュートリアルをやるか探していたのだが、”BAMBU TUTORIAL”をやってみよう。
今回は、excamples/crc ディレクトリで”bambu spec.c”コマンドを実行した。

まずは、Bambu のバージョンを確認する。
bambu --version
bambu_13_231213.png

バージョンは”PandA 2023.1”だった。

Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main



3) Basic Usage – Generation of a Verilog design from C sources
最初のチュートリアルとして、examples/crc をやってみる。これは CRC コードの生成回路を生成するようだ。
examples/crc ディレクトリを示す。
bambu_14_231213.png

高位合成用の C ソースコードの spec.c を引用する。
bambu_15_231213.png
bambu_16_231213.png

ターミナルで examples/crc ディレクトリに移動して、高位合成を行った。
cd /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/crc
bambu spec.c

bambu_17_231213.png

メッセージを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/crc$ bambu spec.c
 ==  Bambu executed with: /tmp/.mount_bambuXmQS3c/usr/bin/bambu spec.c 

Warning: Top function name was not specified: main will be set as top
Warning: Using 'main' as top function name is strongly discouraged.
Warning:    Please note that C simulation output may be truncated down to 8-bits.

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

********************************************************************************
                         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

  Functions to be synthesized:
    icrc_constprop_0
    main


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


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


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


  Scheduling Information of function icrc_constprop_0:
    Number of control steps: 11
    Minimum slack: 1.6570499950000166
    Estimated max frequency (MHz): 119.86167954988268
  Time to perform scheduling: 0.01 seconds


  State Transition Graph Information of function icrc_constprop_0:
    Number of states: 10
    Parameters are registered
    Done port is registered
  Time to perform creation of STG: 0.00 seconds


  Easy binding information for function icrc_constprop_0:
    Bound operations:74/88
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function icrc_constprop_0:
    Number of storage values inserted: 27
  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 icrc_constprop_0:
    Register allocation algorithm obtains a sub-optimal result: 22 registers(LB:15)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function icrc_constprop_0:
    Number of modules instantiated: 86
    Number of performance conflicts: 2
    Estimated resources area (no Muxes and address logic): 2195
    Estimated area of MUX21: 102
    Total estimated area: 2297
    Estimated number of DSPs: 0
  Time to perform module binding: 0.00 seconds


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


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

  Total number of flip-flops in function icrc_constprop_0: 274

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


  Scheduling Information of function main:
    Number of control steps: 6
    Minimum slack: 1.1102230246251565e-15
    Estimated max frequency (MHz): 100.00000000000001
  Time to perform scheduling: 0.00 seconds


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


  Easy binding information for function main:
    Bound operations:7/9
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function main:
    Number of storage values inserted: 3
  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 main:
    Register allocation algorithm obtains an optimal result: 2 registers
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.00 seconds

  Module binding information for function main:
    Number of modules instantiated: 8
    Number of performance conflicts: 0
    Estimated resources area (no Muxes and address logic): 2007
    Estimated area of MUX21: 102
    Total estimated area: 2109
    Estimated number of DSPs: 0
  Time to perform module binding: 0.00 seconds


  Register binding information for function main:
    Register allocation algorithm obtains an optimal result: 2 registers
  Time to perform register binding: 0.00 seconds


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

  Total number of flip-flops in function main: 32


コマンド実行後の examples/crc ディレクトリの様子を示す。
.mem ファイルや、top.v ファイルが生成されていた。
HLS_output ディレクトリが生成されていた。
bambu_18_231213.png

top.v ファイルの一部を示す。
main がトップの Verilog HDL だ。
bambu_20_231213.png

HLS_output ディレクトリの下を見ていく。
Synthesis ディレクトリが生成されていて、その下に ucf と vivado_flow ディレクトリが生成されていた。
ucf ディレクトリと vivado_flow/input, vivado_flow/output ディレクトリは空だった。
bambu_19_231213.png

HLS_output/vivado_flow ディレクトリの main.tcl ファイルを示す。
AMD/Xilinx 社の xc7z020clg484-1 の Vivado プロジェクトを作成するスクリプトのようだ。
bambu_21_231213.png

HLS_output/vivado_flow ディレクトリの main.sdc ファイルを示す。
制約ファイルのテンプレートのようだ。
bambu_22_231213.png
  1. 2023年12月13日 04:16 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

フリーの高位合成ツール Bambu を使ってみよう3

フリーの高位合成ツール Bambu を使ってみよう2”の続き。

フリーの高位合成ツール Bambu を使ってみようということで、前回は、bambu.ipynb - Colaboratory をやってみた。今回は、Bambu を Ubuntu 22.04 のパソコンにインストールした。

Bambu のインストールは PANDA DOWNLOAD ページを参照して行った。

最初に、Latest stable release: の panda-2023.1.tar.gz ファイルをダウンロードした。
bambu_6_231211.png

PandA-bambu-2023.1.tar.gz を展開した。
bambu_7_231211.png

展開された PandA-bambu-2023.1 ディレクトリに bin ディレクトリを作成した。
bin ディレクトリ内に PandA release 2023.1 から https://release.bambuhls.eu/bambu-2023.1.AppImage をダウンロードした。
bambu_8_231211.png

ターミナルで PandA-bambu-2023.1/bin ディレクトリに移動した。
bambu-2023.1.AppImage に実行属性を付与した。
bambu-2023.1.AppImage のシンボリックリンクを作成した。
cd /media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/bin
chmod +x bambu-2023.1.AppImage
ln -s bambu-2023.1.AppImage bambu

bambu_9_231211.png

ホーム・ディレクトリの .bashrc を編集した。
以下の記述を追加した。

export PATH="$PATH:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/bin"
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6:$LD_PRELOAD


bambu_10_231211.png

LD_PRELOAD 環境変数は、Bambu を実行したときに”libstdc++.so.6: version `GLIBCXX_3.4.29' not found”エラーが出てしまうのを防ぐためだ。確か、”/lib/x86_64-linux-gnu/libstdc++.so.6: cannot allocate memory in static TLS block”を参考にさせていただいた。

.bashrc を適用する。
cd
source .bashrc


bambu をターミナルで入力すると、ヘルプ・メッセージが表示された。
これで、インストールは終了だ。
bambu
bambu_11_231211.png

bambu_12_231211.png
  1. 2023年12月12日 04:13 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

フリーの高位合成ツール Bambu を使ってみよう2

フリーの高位合成ツール Bambu を使ってみよう1”の続き。

フリーの高位合成ツール Bambu を使ってみようということで、前回は、Bambu 関連サイトへのリンクを掲載した。今回は、bambu.ipynb - Colaboratory をやってみた。

今回のブログは、全面的に bambu.ipynb - Colaboratory から引用した。

なお”--compiler=I386_CLANG13”という記述があるが、”I386_CLANG13”は無いので、”I386_CLANG16”に変更した。

bambu.ipynb - Colaboratory をブラウザからクリックすると、Google Colaboratory のサイトが開く。
bambu_5_231211.png

”ドライブにコピー”をクリックし、自分の Google Drive にコピーしてから、そのコピーを開いた。
順次、コードを実行していく。
最初は Bambu のインストールを行った。
bambu_1_231211.png
bambu_2_231211.png
bambu_3_231211.png
bambu_4_231211.png

ブログに貼ったのは最初のページだけだが、最後までやってみた。
途中でエラーになったコードもあったが、最後までできた。
次回は自分の Ubuntu 22.04 のパソコンに Bambu をインストールしてみよう。

最後に”bambu --help”の結果を貼っておく。

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

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

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

Usage:
       bambu [Options] <source_file> [<constraints_file>] [<technology_file>]

Options:

  General options:

    --help, -h
        Display this usage information.

    --version, -V
        Display the version of the program.

    --seed=<number>
        Set the seed of the random number generator (default=0).


  Output options:

    --verbosity, -v <level>
        Set the output verbosity level
        Possible values for <level>:
            0 - NONE
            1 - MINIMUM
            2 - VERBOSE
            3 - PEDANTIC
            4 - VERY PEDANTIC
        (default = 1)

    --no-clean
        Do not remove temporary files.

    --benchmark-name=<name>
        Set the name of the current benchmark for data collection.
        Mainly useful for data collection from extensive regression tests.

    --configuration-name=<name>
        Set the name of the current tool configuration for data collection.
        Mainly useful for data collection from extensive regression tests.

    --benchmark-fake-parameters
        Set the parameters string for data collection. The parameters in the
        string are not actually used, but they are used for data collection in
        extensive regression tests.

    --output-temporary-directory=<path>
        Set the directory where temporary files are saved.
        Default is 'panda-temp'

    --print-dot
        Dump to file several different graphs used in the IR of the tool.
        The graphs are saved in .dot files, in graphviz format

    --pretty-print=<file>.c
        C-based pretty print of the internal IRx

    --writer,-w<language>
        Output RTL language:
            V - Verilog (default)
            H - VHDL

    --no-mixed-design
        Avoid mixed output RTL language designs.

    --generate-tb=<file>
        Generate testbench using the given files.
        <file> must be a valid testbench XML file or a C/C++ file specifying
        a main function calling the top-level interface. (May be repeated)

    --generate-tb=elf:<exe>
        Generate testbench environment using <exe> as system simulation.
        <exe> must be an executable that dynamically loads the synthesized
        top-function symbol.

    --tb-extra-gcc-options=<string>
        Specify custom extra options to the compiler for testbench compilation only.

    --tb-arg=<arg>
        Passes <arg> to the testbench main function as an argument.
        The option may be repeated to pass multiple arguments in order.

    --tb-param-size=<param_name>:<byte_size>
        A comma-separated list of pairs representing a pointer parameter name and
        the size for the related memory space. Specifying this option will disable
        automated top-level function verification.

    --top-fname=<fun_name>
        Define the top function to be synthesized. (default=main)

    --top-rtldesign-name=<top_name>
        Define the top module name for the RTL backend.

    --inline-fname=<fun_name>[,<fun_name>]*
        Define functions to be always inlined.
        Automatic inlining is always performed using internal metrics.
        Maximum cost to allow function inlining is defined through
        --panda-parameter=inline-max-cost=<value>. (default=60)

    --file-input-data=<file_list>
        A comma-separated list of input files used by the C specification.

    --C-no-parse=<file>
        Specify a comma-separated list of C files used only during the
        co-simulation phase.


  GCC/CLANG front-end compiler options:

    --compiler=<compiler_version>
        Specify which compiler is used.
        Possible values for <compiler_version> are:
            I386_GCC49
            I386_GCC8
            I386_CLANG12
            I386_CLANG16

    -O<level>
        Enable a specific optimization level. Possible values are the usual
        optimization flags accepted by compilers, plus some others:
        -O0,-O1,-O2,-O3,-Os,-O4,-O5.

    -f<option>
        Enable or disable a GCC/CLANG optimization option. All the -f or -fno options
        are supported. In particular, -ftree-vectorize option triggers the
        high-level synthesis of vectorized operations.

    -I<path>
        Specify a path where headers are searched for.

    -W<warning>
        Specify a warning option passed to GCC/CLANG. All the -W options available in
        GCC/CLANG are supported.

    -E
        Enable preprocessing mode of GCC/CLANG.

    --std=<standard>
        Assume that the input sources are for <standard>. All
        the --std options available in GCC/CLANG are supported.
        The default value is gnu90/gnu11 for C and gnu++98/gnu++14 for C++ 
        depending on the selected frontend compiler support.

    -D<name>
        Predefine name as a macro, with definition 1.

    -D<name=definition>
        Tokenize <definition> and process as if it appeared as a #define directive.

    -U<name>
        Remove existing definition for macro <name>.

    --param <name>=<value>
        Set the amount <value> for the GCC/CLANG parameter <name> that could be used for
        some optimizations.

    -l<library>
        Search the library named <library> when linking.

    -L<dir>
        Add directory <dir> to the list of directories to be searched for -l.

    --use-raw
        Specify that input file is already a raw file and not a source file.

    -m<machine-option>
        Specify machine dependend options (currently not used).

    --Include-sysdir
        Return the system include directory used by the wrapped GCC/CLANG compiler.

    --gcc-config
        Return the GCC/CLANG configuration.

    --extra-gcc-options
        Specify custom extra options to the compiler.


  Target:

    --target-file=file, -b<file>
        Specify an XML description of the target device.

    --generate-interface=<type>
        Wrap the top level module with an external interface.
        Possible values for <type> and related interfaces:
            MINIMAL  -  minimal interface (default)
            INFER    -  top function is built with an hardware interface inferred from
                        the pragmas or from the top function signature
            WB4      -  WishBone 4 interface

    --interface-xml-filename=<filename>
        User defined interface file.

    --memory-mapped-top
        Generate a memory mapped interface for the top level function.
        The start signal and each one of function parameter are mapped to a memory address


  Scheduling:

    --parametric-list-based[=<type>]
        Perform priority list-based scheduling. This is the default scheduling algorithm
        in bambu. The optional <type> argument can be used to set options for
        list-based scheduling as follows:
            0 - Dynamic mobility (default)
            1 - Static mobility
            2 - Priority-fixed mobility

    --post-rescheduling
        Perform post rescheduling to better distribute resources.

    --speculative-sdc-scheduling,-s
        Perform scheduling by using speculative SDC.
        The speculative SDC is more conservative, in case 
        --panda-parameter=enable-conservative-sdc=1 is passed.

    --pipelining,-p
        Perform functional pipelining starting from the top function.

    --pipelining,-p=<func_name>[=<init_interval>][,<func_name>[=<init_interval>]]*
        Perform pipelining of comma separated list of specified functions with optional 
        initiation interval (default II=1).
        To pipeline softfloat operators it is possible to specify the __float_<op_name> prefix 
        or simply __float to pipeline all softfloat library.

    --fixed-scheduling=<file>
        Provide scheduling as an XML file.

    --no-chaining
        Disable chaining optimization.


  Binding:

    --register-allocation=<type>
        Set the algorithm used for register allocation. Possible values for the
        <type> argument are the following:
            WEIGHTED_TS         - use weighted clique covering algorithm by
                                  exploiting the Tseng&Siewiorek heuristics
                                  (default)
            COLORING            - use simple coloring algorithm
            WEIGHTED_COLORING   - use weighted coloring algorithm
            CHORDAL_COLORING    - use chordal coloring algorithm
            BIPARTITE_MATCHING  - use bipartite matching algorithm
            TTT_CLIQUE_COVERING - use a weighted clique covering algorithm
            UNIQUE_BINDING      - unique binding algorithm

    --module-binding=<type>
        Set the algorithm used for module binding. Possible values for the
        <type> argument are one the following:
            WEIGHTED_TS        - solve the weighted clique covering problem by
                                 exploiting the Tseng&Siewiorek heuristics
                                 (default)
            WEIGHTED_COLORING  - solve the weighted clique covering problem
                                 performing a coloring on the conflict graph
            COLORING           - solve the unweighted clique covering problem
                                 performing a coloring on the conflict graph
            TTT_FAST           - use Tomita, A. Tanaka, H. Takahashi maxima
                                 weighted cliques heuristic to solve the clique
                                 covering problem
            TTT_FAST2          - use Tomita, A. Tanaka, H. Takahashi maximal
                                 weighted cliques heuristic to incrementally
                                 solve the clique covering problem
            TTT_FULL           - use Tomita, A. Tanaka, H. Takahashi maximal
                                 weighted cliques algorithm to solve the clique
                                 covering problem
            TTT_FULL2          - use Tomita, A. Tanaka, H. Takahashi maximal
                                 weighted cliques algorithm to incrementally
                                 solve the clique covering problem
            TS                 - solve the unweighted clique covering problem
                                 by exploiting the Tseng&Siewiorek heuristic
            BIPARTITE_MATCHING - solve the weighted clique covering problem
                                 exploiting the bipartite matching approach
            UNIQUE             - use a 1-to-1 binding algorithm


    --shared-input-registers
        The module bindings and the register binding try to share more resources by 
        sharing the input registers


  Memory allocation:

    --xml-memory-allocation=<xml_file_name>
        Specify the file where the XML configuration has been defined.

    --memory-allocation-policy=<type>
        Set the policy for memory allocation. Possible values for the <type>
        argument are the following:
            ALL_BRAM           - all objects that need to be stored in memory
                                 are allocated on BRAMs (default)
            LSS                - all local variables, static variables and
                                 strings are allocated on BRAMs
            GSS                - all global variables, static variables and
                                 strings are allocated on BRAMs
            NO_BRAM            - all objects that need to be stored in memory
                                 are allocated on an external memory
            EXT_PIPELINED_BRAM - all objects that need to be stored in memory
                                 are allocated on an external pipelined memory

   --base-address=address
        Define the starting address for objects allocated externally to the top
        module.

   --initial-internal-address=address
        Define the starting address for the objects allocated internally to the
        top module.

   --channels-type=<type>
        Set the type of memory connections.
        Possible values for <type> are:
            MEM_ACC_11 - the accesses to the memory have a single direct
                         connection or a single indirect connection
            MEM_ACC_N1 - the accesses to the memory have n parallel direct
                         connections or a single indirect connection
            MEM_ACC_NN - the accesses to the memory have n parallel direct
                         connections or n parallel indirect connections (default)

   --channels-number=<n>
        Define the number of parallel direct or indirect accesses.

   --memory-ctrl-type=type
        Define which type of memory controller is used. Possible values for the
        <type> argument are the following:
            D00 - no extra delay (default)
            D10 - 1 clock cycle extra-delay for LOAD, 0 for STORE
            D11 - 1 clock cycle extra-delay for LOAD, 1 for STORE
            D21 - 2 clock cycle extra-delay for LOAD, 1 for STORE

    --memory-banks-number=<n>
        Define the number of memory banks.

    --sparse-memory[=on/off]
        Control how the memory allocation happens.
            on - allocate the data in addresses which reduce the decoding logic (default)
           off - allocate the data in a contiguous addresses.

    --do-not-use-asynchronous-memories
        Do not add asynchronous memories to the possible set of memories used
        by bambu during the memory allocation step.

    --distram-threshold=value
        Define the threshold in bitsize used to infer DISTRIBUTED/ASYNCHRONOUS RAMs (default 256).

    --serialize-memory-accesses
        Serialize the memory accesses using the GCC virtual use-def chains
        without taking into account any alias analysis information.

    --unaligned-access
        Use only memories supporting unaligned accesses.

    --aligned-access
        Assume that all accesses are aligned and so only memories supporting aligned

        accesses are used.

    --do-not-chain-memories
        When enabled LOADs and STOREs will not be chained with other
        operations.

    --rom-duplication
        Assume that read-only memories can be duplicated in case timing requires.

    --bram-high-latency=[3,4]
        Assume a 'high latency bram'-'faster clock frequency' block RAM memory
        based architectures:
        3 => LOAD(II=1,L=3) STORE(1).
        4 => LOAD(II=1,L=4) STORE(II=1,L=2).

    --mem-delay-read=value
        Define the external memory latency when LOAD are performed (default 2).

    --mem-delay-write=value
        Define the external memory latency when STORE are performed (default 1).

    --expose-globals
        All global variables can be accessed from outside the accelerator.

    --data-bus-bitsize=<bitsize>
        Set the bitsize of the external data bus.

    --addr-bus-bitsize=<bitsize>
        Set the bitsize of the external address bus.


  Evaluation of HLS results:

    --simulate
        Simulate the RTL implementation.

    --simulator=<type>
        Specify the simulator used in generated simulation scripts:
            MODELSIM - Mentor Modelsim
            XSIM - Xilinx XSim
            VERILATOR - Verilator simulator

    --verilator-parallel
        Enable multi-threaded simulation when using verilator

    --max-sim-cycles=<cycles>
        Specify the maximum number of cycles a HDL simulation may run.
        (default 200000000).

    --accept-nonzero-return
        Do not assume that application main must return 0.

    --generate-vcd
        Enable .vcd output file generation for waveform visualization (requires
        testbench generation).

    --evaluation[=type]
        Perform evaluation of the results.
        The value of 'type' selects the objectives to be evaluated
        If nothing is specified all the following are evaluated
        The 'type' argument can be a string containing any of the following
        strings, separated with commas, without spaces:
            AREA            - Area usage
            AREAxTIME       - Area x Latency product
            TIME            - Latency for the average computation
            TOTAL_TIME      - Latency for the whole computation
            CYCLES          - n. of cycles for the average computation
            TOTAL_CYCLES    - n. of cycles for the whole computation
            BRAMS           - number of BRAMs
            CLOCK_SLACK     - Slack between actual and required clock period
            DSPS            - number of DSPs
            FREQUENCY       - Maximum target frequency
            PERIOD          - Actual clock period
            REGISTERS       - number of registers


  RTL synthesis:

    --clock-name=id
        Specify the clock signal name of the top interface (default = clock).

    --reset-name=id
        Specify the reset signal name of the top interface (default = reset).

    --start-name=id
        Specify the start signal name of the top interface (default = start_port).

    --done-name=id
        Specify the done signal name of the top interface (default = done_port).

    --clock-period=value
        Specify the period of the clock signal (default = 10ns).

    --backend-script-extensions=file
        Specify a file that will be included in the backend specific synthesis
        scripts.

    --backend-sdc-extensions=file
        Specify a file that will be included in the Synopsys Design Constraints
        file (SDC).

   --parallel-backend
        when possible enable a parallel synthesis backend
    --VHDL-library=libraryname
        Specify the library in which the VHDL generated files are compiled.

    --device-name=value
        Specify the name of the device. Three different cases are foreseen:
            - Xilinx:  a comma separated string specifying device, speed grade
                       and package (e.g.,: "xc7z020,-1,clg484,VVD")
            - Altera:  a string defining the device string (e.g. EP2C70F896C6)
            - Lattice: a string defining the device string (e.g.
                       LFE5U85F8BG756C)
            - NanoXplore: a string defining the device string (e.g. nx2h540tsc))

    --power-optimization
        Enable Xilinx power based optimization (default no).

    --connect-iob
        Connect primary input and output ports to IOBs.

    --soft-float (default)
        Enable the soft-based implementation of floating-point operations.
        Bambu uses as default a faithfully rounded version of softfloat with rounding mode
        equal to round to nearest even. Subnormal numbers are disabled by default.
        Default FP formats are e8m23b-127nih and e11m52b-1023nih for single and double 
        precision floating-point types respectively.

    --flopoco
        Enable the flopoco-based implementation of floating-point operations.

    --libm-std-rounding
        Enable the use of classical libm. This library combines a customized version of 
        glibc, newlib and musl libm implementations into a single libm library synthetizable
        with bambu.
        Without this option, Bambu uses as default a faithfully rounded version of libm.

    --soft-fp
        Enable the use of soft_fp GCC library instead of bambu customized version of softfloat library.

    --max-ulp
        Define the maximal ULP (Unit in the last place, i.e., is the spacing
        between floating-point numbers) accepted.

    --fp-subnormal
        Enable the soft-based implementation of floating-point operations with
        subnormals support.

    --fp-exception-mode=<ieee|saturation|overflow>
        Set the soft-based exception handling mode:
              ieee    - IEEE754 standard exceptions (default)
           saturation - Inf is replaced with max value, Nan becomes undefined behaviour
            overflow  - Inf and Nan results in undefined behaviour

    --fp-rounding-mode=<nearest_even|truncate>
        Set the soft-based rounding handling mode:
           nearest_even - IEEE754 standard rounding mode (default)
              truncate  - No rounding is applied

    --fp-format=<func_name>*e<exp_bits>m<frac_bits>b<exp_bias><rnd_mode><exc_mode><?spec><?sign>
        Define arbitrary precision floating-point format by function (use comma separated
        list for multiple definitions). (i.e.: e8m27b-127nihs represent IEEE754 single precision FP)
           func_name - Set arbitrary floating-point format for a specific function (using
                       @ symbol here will resolve to the top function)
                       (Arbitrary floating-point format will apply to specified function
                       only, use --propagate-fp-format to extend it to called functions)
            exp_bits - Number of bits used by the exponent
           frac_bits - Number of bits used by the fractional value
            exp_bias - Bias applied to the unsigned value represented by the exponent bits
            rnd_mode - Rounding mode (exclusive option):
                          n - nearest_even: IEEE754 standard rounding mode
                          t - truncate    : no rounding is applied
            exc_mode - Exception mode (exclusive option):
                          i - ieee      : IEEE754 standard exceptions
                          a - saturation: Inf is replaced with max value, Nan becomes undefined behaviour
                          o - overflow  : Inf and Nan results in undefined behaviour
              spec   - Floating-point specialization string (multiple choice):
                          h - hidden one: IEEE754 standard representation with hidden one
                          s - subnormals: IEEE754 subnormal numbers
              sign   - Static sign representation (exclusive option):
                            - IEEE754 dynamic sign is used if omitted
                          1 - all values are considered as negative numbers
                          0 - all values are considered as positive numbers

    --fp-format=inline-math
        The "inline-math" flag may be added to fp-format option to force floating-point
        arithmetic operators always inline policy

    --fp-format=inline-conversion
        The "inline-conversion" flag may be added to fp-format option to force floating-point
        conversion operators always inline policy

    --fp-format-interface
        User-defined floating-point format is applied to top interface signature if required
        (default modifies top function body only)

    --fp-format-propagate
        Propagate user-defined floating-point format to called function when possible

    --hls-div=<method>
        Perform the high-level synthesis of integer division and modulo
        operations starting from a C library based implementation or a HDL component:
             none  - use a HDL based pipelined restoring division
             nr1   - use a C-based non-restoring division with unrolling factor equal to 1 (default)
             nr2   - use a C-based non-restoring division with unrolling factor equal to 2
             NR    - use a C-based Newton-Raphson division
             as    - use a C-based align divisor shift dividend method

    --hls-fpdiv=<method>
        Perform the high-level synthesis of floating point division 
        operations starting from a C library based implementation:
             SRT4 - use a C-based Sweeney, Robertson, Tocher floating point division with radix 4 (default)
             G    - use a C-based Goldschmidt floating point division.
             SF   - use a C-based floating point division as describe in soft-fp library
                    (it requires --soft-fp).
    --skip-pipe-parameter=<value>
        Used during the allocation of pipelined units. <value> specifies how
        many pipelined units, compliant with the clock period, will be skipped.
        (default=0).

    --reset-type=value
        Specify the type of reset:
             no    - use registers without reset (default)
             async - use registers with asynchronous reset
             sync  - use registers with synchronous reset

    --reset-level=value
        Specify if the reset is active high or low:
             low   - use registers with active low reset (default)
             high  - use registers with active high reset

    --disable-reg-init-value
        Used to remove the INIT value from registers (useful for ASIC designs)

    --registered-inputs=value
        Specify if inputs are registered or not:
             auto  - inputs are registered only for proxy functions (default)
             top   - inputs and return are registered only for top and proxy functions
             yes   - all inputs are registered
             no    - none of the inputs is registered

    --fsm-encoding=value
             auto    - it depends on the target technology. VVD prefers one encoding
                       while the other are fine with the standard binary encoding. (default)
             one-hot - one hot encoding
             binary  - binary encoding

    --cprf=value
        Clock Period Resource Fraction (default = 1.0).

    --DSP-allocation-coefficient=value
        During the allocation step the timing of the DSP-based modules is
        multiplied by value (default = 1.0).

    --DSP-margin-combinational=value
        Timing of combinational DSP-based modules is multiplied by value.
        (default = 1.0).

    --DSP-margin-pipelined=value
        Timing of pipelined DSP-based modules is multiplied by value.
        (default = 1.0).

    --mux-margins=n
        Scheduling reserves a margin corresponding to the delay of n 32 bit
        multiplexers.

    --timing-model=value
        Specify the timing model used by HLS:
             EC     - estimate timing overhead of glue logics and connections
                      between resources (default)
             SIMPLE - just consider the resource delay

    --experimental-setup=<setup>
        Specify the experimental setup. This is a shorthand to set multiple
        options with a single command.
        Available values for <setup> are the following:
             BAMBU-AREA           - this setup implies:
                                    -Os  -D'printf(fmt, ...)='
                                    --memory-allocation-policy=ALL_BRAM
                                    --DSP-allocation-coefficient=1.75
                                    --distram-threshold=256
             BAMBU-AREA-MP        - this setup implies:
                                    -Os  -D'printf(fmt, ...)='
                                    --channels-type=MEM_ACC_NN
                                    --channels-number=2
                                    --memory-allocation-policy=ALL_BRAM
                                    --DSP-allocation-coefficient=1.75
                                    --distram-threshold=256
             BAMBU-BALANCED       - this setup implies:
                                    -O2  -D'printf(fmt, ...)='
                                    --channels-type=MEM_ACC_11
                                    --memory-allocation-policy=ALL_BRAM
                                    -fgcse-after-reload  -fipa-cp-clone
                                    -ftree-partial-pre  -funswitch-loops
                                    -finline-functions  -fdisable-tree-bswap
                                    --param max-inline-insns-auto=25
                                    -fno-tree-loop-ivcanon
                                    --distram-threshold=256
             BAMBU-BALANCED-MP    - (default) this setup implies:
                                    -O2  -D'printf(fmt, ...)='
                                    --channels-type=MEM_ACC_NN
                                    --channels-number=2
                                    --memory-allocation-policy=ALL_BRAM
                                    -fgcse-after-reload  -fipa-cp-clone
                                    -ftree-partial-pre  -funswitch-loops
                                    -finline-functions  -fdisable-tree-bswap
                                    --param max-inline-insns-auto=25
                                    -fno-tree-loop-ivcanon
                                    --distram-threshold=256
             BAMBU-TASTE          - this setup concatenate the input files and
                                    passes these options to the compiler:
                                    -O2  -D'printf(fmt, ...)='
                                    --channels-type=MEM_ACC_NN
                                    --memory-allocation-policy=ALL_BRAM
                                    -fgcse-after-reload  -fipa-cp-clone
                                    -ftree-partial-pre  -funswitch-loops
                                    -finline-functions  -fdisable-tree-bswap
                                    --param max-inline-insns-auto=25
                                    -fno-tree-loop-ivcanon
                                    --distram-threshold=256
             BAMBU-PERFORMANCE    - this setup implies:
                                    -O3  -D'printf(fmt, ...)='
                                    --memory-allocation-policy=ALL_BRAM
                                    --distram-threshold=512
                                    --disable-function-proxy
             BAMBU-PERFORMANCE-MP - this setup implies:
                                    -O3  -D'printf(fmt, ...)='
                                    --channels-type=MEM_ACC_NN
                                    --channels-number=2
                                    --memory-allocation-policy=ALL_BRAM
                                    --distram-threshold=512
                                    --disable-function-proxy
             BAMBU                - this setup implies:
                                    -O0 --channels-type=MEM_ACC_11
                                    --memory-allocation-policy=LSS
                                    --distram-threshold=256
             BAMBU092             - this setup implies:
                                    -O3  -D'printf(fmt, ...)='
                                    --timing-model=SIMPLE
                                    --DSP-margin-combinational=1.3
                                    --cprf=0.9  -skip-pipe-parameter=1
                                    --channels-type=MEM_ACC_11
                                    --memory-allocation-policy=LSS
                                    --distram-threshold=256
             VVD                  - this setup implies:
                                    -O3  -D'printf(fmt, ...)='
                                    --channels-type=MEM_ACC_NN
                                    --memory-allocation-policy=ALL_BRAM
                                    --distram-threshold=256
                                    --DSP-allocation-coefficient=1.75
                                    --cprf=0.875


  Other options:

    --pragma-parse
        Perform source code parsing to extract information about pragmas.
        (default=no).

    --num-accelerators
        Set the number of physical accelerator instantiated in parallel sections. It must
        be a power of two (default=4).

    --time, -t <time>
        Set maximum execution time (in seconds) for ILP solvers. (infinite).

    --host-profiling
        Perform host-profiling.

    --disable-bitvalue-ipa
        Disable inter-procedural bitvalue analysis.

    --enable-function-proxy
        Enable function proxy. May reduce the resource usage.

    --disable-function-proxy
        Disable function proxy. May increase FSMD parallelism.

    --constraints,-C=<func_name>[=<num_resources>][,<func_name>[=<num_resources>]]*
        Perform resource sharing of functions inside the datapath,
        limiting the number of function instances to 'num_resources'.
        Functions are specified as a comma-separated list with an optional
        number of resources. (num_resources is by default equal to 1 when not specified).
        If the first character of func_name is '*', then 'num_resources'
        applies to all functions that match with 'func_name' with the first
        character removed.


  Debug options:

    --discrepancy
           Performs automated discrepancy analysis between the execution
           of the original source code and the generated HDL (currently
           supports only Verilog). If a mismatch is detected reports
           useful information to the user.
           Uninitialized variables in C are legal, but if they are used
           before initialization in HDL it is possible to obtain X values
           in simulation. This is not necessarily wrong, so these errors
           are not reported by default to avoid reporting false positives.
           If you can guarantee that in your C code there are no
           uninitialized variables and you want the X values in HDL to be
           reported use the option --discrepancy-force-uninitialized.
           Note that the discrepancy of pointers relies on ASAN to properly
           allocate objects in memory. Unfortunately, there is a well-known
           bug on ASAN (https://github.com/google/sanitizers/issues/914)
           when -fsanitize=address is passed to GCC or CLANG.
           On some compiler versions this issues has been fixed but since the
           fix has not been upstreamed the bambu option --discrepancy may not
           work. To circumvent the issue, the user may perform the discrepancy
           by adding these two options: --discrepancy --discrepancy-permissive-ptrs.

    --discrepancy-force-uninitialized
           Reports errors due to uninitialized values in HDL.
           See the option --discrepancy for details

    --discrepancy-no-load-pointers
           Assume that the data loaded from memories in HDL are never used
           to represent addresses, unless they are explicitly assigned to
           pointer variables.
           The discrepancy analysis is able to compare pointers in software
           execution and addresses in hardware. By default all the values
           loaded from memory are treated as if they could contain addresses,
           even if they are integer variables. This is due to the fact that
           C code doing this tricks is valid and actually used in embedded
           systems, but it can lead to imprecise bug reports, because only
           pointers pointing to actual data are checked by the discrepancy
           analysis.
           If you can guarantee that your code always manipulates addresses
           using pointers and never using plain int, then you can use this
           option to get more precise bug reports.

    --discrepancy-only=comma,separated,list,of,function,names
           Restricts the discrepancy analysis only to the functions whose
           name is in the list passed as argument.

    --discrepancy-permissive-ptrs
           Do not trigger hard errors on pointer variables.

    --discrepancy-hw
           Hardware Discrepancy Analysis.

    --assert-debug
        Enable assertion debugging performed by Modelsim.
        (Mentor Modelsim should be selected to use this option)


  Backend configuration:

    --mentor-visualizer
        Simulate the RTL implementation and then open Mentor Visualizer.
        (Mentor root has to be correctly set, see --mentor-root)

    --mentor-optimizer=<0|1>
        Enable or disable mentor optimizer. (default=enabled)

    --nanoxplore-bypass=<name>
        Define NanoXplore bypass when using NanoXplore. User may set NANOXPLORE_BYPASS
        variable otherwise.

    --altera-root=<path>
        Define Altera tools path. Given path is searched for Quartus.
        (default=/opt/altera:/opt/intelFPGA)

    --lattice-root=<path>
        Define Lattice tools path. Given path is searched for Diamond.
        (default=/opt/diamond:/usr/local/diamond)

    --mentor-root=<path>
        Define Mentor tools path. Given directory is searched for Modelsim and Visualizer
        (default=/opt/mentor)

    --nanoxplore-root=<path>
        Define NanoXplore tools path. Given directory is searched for NXMap.
        (default=/opt/NanoXplore)

    --xilinx-root=<path>
        Define Xilinx tools path. Given directory is searched for both ISE and Vivado
        (default=/opt/Xilinx)


  1. 2023年12月12日 03:42 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

フリーの高位合成ツール Bambu を使ってみよう1

この前 Sipeed Tang Primer 25Kが届いたが、これをコンフィギュレーションするためのソースコードを書くのにライセンスの関係から Vitis HLS は使用できない。しかし、高位合成ツールはどうしても使ってみたいということで、フリーの高位合成ツール Bambu を使ってみることにした。

Bambu のマニュアル

Bambu の Github ferrandi/PandA-bambu

Releases · ferrandi/PandA-bambu

bambu.ipynb - Colaboratory
  1. 2023年12月10日 04:54 |
  2. Bambu
  3. | トラックバック:0
  4. | コメント:0

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる6

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる5”の続き。

今まで Vitis HLS で作成したすべてのフィルタを実装したいということで、前回は、平均化フィルタを掛けた画像にラプラシアン・フィルタを掛けた。また、原画像、メディアン・フィルタ、最小値フィルタのラプラシアン・フィルタ処理結果を示した。今回は、アンシャープ・マスキング・フィルタとエッジ強調フィルタを使用した。

まずは、ノイズ入り画像にメディアン・フィルタを掛けてノイズを除去し、それをラプラシアン・フィルタに掛けた画像を示す。
i10filters_33_231208.jpg

これにアンシャープ・マスキング・フィルタを追加した。
つまり、ノイズ入り画像にメディアン・フィルタを掛けてノイズを除去し、それをアンシャープ・マスキング・フィルタでエッジ強調し、ラプラシアン・フィルタに掛けた。
アンシャープ・マスキング・フィルタのエッジ強調の値 k = 4.0 に指定した。
i10filters_38_231209.jpg

i10filters_39_231209.jpg

エッジ強調はされたが、ノイズも増えている。
これでラプラシアン・フィルタを外した。
i10filters_40_231209.jpg

少し、ノイズが見えるか?

次に、アンシャープ・マスキング・フィルタを外して、変わりにエッジ強調フィルタを入れてみる。
つまり、ノイズ入り画像にメディアン・フィルタを掛けてノイズを除去し、それをエッジ強調フィルタでエッジ強調し、ラプラシアン・フィルタに掛けた。
i10filters_41_231209.jpg

i10filters_43_231209.jpg

エッジ強調フィルタの方がアンシャープ・マスキング・フィルタの k = 4.0 よりもノイズが増えている感じがする?
ここで、ラプラシアン・フィルタを外した画像を示す。
i10filters_42_231209.jpg

やはり、アンシャープ・マスキング・フィルタの画像よりもエッジ強調フィルタの画像の方がメディアン・フィルタで除去したノイズが増えている気がする?
  1. 2023年12月09日 04:20 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる5

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる4”の続き。

今まで Vitis HLS で作成したすべてのフィルタを実装したいということで、前回は、Jupyter Notebook のファイル i10filters.ipynb を編集して、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 ディレクトリを作成し、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 の各 IP の Python コードを追加した。平均化フィルタ(average_axis_RGB24)のみをアクティブにした。今回は、平均化フィルタを掛けた画像にラプラシアン・フィルタを掛けた。また、原画像、メディアン・フィルタ、最小値フィルタのラプラシアン・フィルタ処理結果を示した。

現在は平均化フィルタを掛けてあるのだが、その画像にラプラシアン・フィルタを掛ける。
ラプラシアン・フィルタを有効にした。
i10filters_29_231208.jpg

ほとんどノイズが取れているが完全に除去できているわけではないようだ。

平均化フィルタを無効にして、ラプラシアン・フィルタを掛ける。
平均化フィルタを無効にした。
i10filters_30_231208.jpg

これで、何もフィルタが掛かっていない状態、つまり現画像のラプラシアン・フィルタ処理後の画像を示す。
i10filters_31_231208.jpg

やはりノイズがひどい。

メディアン・フィルタを有効にした画像にラプラシアン・フィルタを掛ける。
メディアン・フィルタを有効化した。
i10filters_32_231208.jpg

ラプラシアン・フィルタ処理画像を示す。
i10filters_33_231208.jpg

やはり、メディアン・フィルタで処理するときれいにノイズが除去されている。

メディアン・フィルタを無効化し、最小値フィルタを有効化して、ラプラシアン・フィルタを掛けてみよう。
メディアン・フィルタを無効化し、最小値フィルタを有効化した。
i10filters_37_231208.jpg

ラプラシアン・フィルタ処理画像を示す。
i10filters_34_231208.jpg

ノイズが大きくなっている。しかし、黒いパソコンのボディ部分はノイズが除去されている。

最小値フィルタから最大値フィルタに変更した。
i10filters_35_231208.jpg

ラプラシアン・フィルタ処理画像を示す。
i10filters_36_231208.jpg

最小値フィルタのときとノイズが似ているが、現画像で白い部分はノイズが無くなっている。最大値フィルタだからね。。。
  1. 2023年12月08日 04:47 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる4

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる3”の続き。

今まで Vitis HLS で作成したすべてのフィルタを実装したいということで、前回は、ZUBoard 1CG の Pynq Linux を起動して、Jupyter Notebook の i5filters ディレクトリのファイルを Jupyter Notebook 経由でコピーしようとしたら、 エラーになったので、ターミナルのコマンドでコピーを行った。次に i10filters_wrapper.bit と i10filters.hwh ファイルをアップロードし、i10filters_wrapper.bit は i10filters.bit に名前を変更した。今回は、Jupyter Notebook のファイル i10filters.ipynb を編集して、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 ディレクトリを作成し、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 の各 IP の Python コードを追加した。平均化フィルタ(average_axis_RGB24)のみをアクティブにした。

平均化フィルタ(average_axis_RGB24)をアクティブにした i10filters.ipynb のコードを貼っておく。
なお、使用する場合は、スペース 4 個を TAB に変換する。
(2023/12/09:追記) unsharp_masking フィルタの k の値を追加した。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
from pynq import allocate, Overlay

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

dma = i10filters.axi_dma_0
median = i10filters.median_axis_RGB24_0
sobel = i10filters.sobel_axis_RGB24_0
gaussian = i10filters.gaussian_axis_RGB24_0
color_conv = i10filters.color_converter_RGB24_0
rgb2hsv = i10filters.RGB24toHSV_0
hsvconv = i10filters.HSVConverter_0
hsv2rgb = i10filters.HSVtoRGB24_0
average = i10filters.average_axis_RGB24_0
edge_enhancement = i10filters.edge_enhancement_axi_0
laplacian = i10filters.laplacian_axis_RGB24_0
min_max = i10filters.min_max_axis_RGB24_0
unsharp_masking = i10filters.unsharp_masking_axis_0

image_path = "./test2.jpg"
#image_path = "./blue.bmp"
#image_path = "./green.bmp"
#image_path = "./red.bmp"
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), 

in_buffer[:] = np.array(original_image)

def run_kernel():
    dma.sendchannel.transfer(in_buffer)
    dma.recvchannel.transfer(out_buffer) 
    gaussian.write(0x00,0x01) # start
    median.write(0x00,0x01) # start
    average.write(0x00,0x01) # start
    min_max.write(0x00,0x01) # start
    edge_enhancement.write(0x00,0x01) # start
    unsharp_masking.write(0x00,0x01) # start
    rgb2hsv.write(0x00,0x01) # start
    hsvconv.write(0x00,0x01) #start
    hsv2rgb.write(0x00,0x01) #start
    color_conv.write(0x00,0x01) #start
    sobel.write(0x00,0x01) # start
    laplacian.write(0x00,0x01) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()

print(height)
print(width)

gaussian.register_map.row_size = height
gaussian.register_map.col_size = width
gaussian.register_map.function_r = 2 # ORG_IMGwAxiDma
#gaussian.register_map.function_r = 3 # GAUSSIANwAxiDma

median.register_map.row_size = height
median.register_map.col_size = width
median.register_map.function_r = 2 # ORG_IMGwAxiDma
#median.register_map.function_r = 3 # MEDIANwAxiDma

average.register_map.row_size = height
average.register_map.col_size = width
#average.register_map.function_r = 2 # ORG_IMGwAxiDma
average.register_map.function_r = 3 # AVERAGEwAxiDma

min_max.register_map.row_size = height
min_max.register_map.col_size = width
min_max.register_map.function_r = 3 # ORG_IMGwAxiDma
#min_max.register_map.function_r = 4 # MINwAxiDma
#min_max.register_map.function_r = 5 # MAXwAxiDma

edge_enhancement.register_map.row_size = height
edge_enhancement.register_map.col_size = width
edge_enhancement.register_map.function_r = 2 # ORG_IMGwAxiDma
#edge_enhancement.register_map.function_r = 3 # EDGE_ENHANCEMENTwAxiDma

unsharp_masking.register_map.row_size = height
unsharp_masking.register_map.col_size = width
unsharp_masking.register_map.k = 0x00000400 # k = 4.0, ap_fixed<24, 16, AP_TRN_ZERO, AP_SAT>
unsharp_masking.register_map.function_r = 2 # ORG_IMGwAxiDma
#unsharp_masking.register_map.function_r = 3 # UNSHARP_MASKINGwAxiDma

rgb2hsv.register_map.row_size = height
rgb2hsv.register_map.col_size = width
rgb2hsv.register_map.function_r = 1 # ForAXIDma

hsvconv.register_map.row_size = height
hsvconv.register_map.col_size = width
#hsvconv.register_map.function_r = 2 # ORG_IMGwAxiDma
hsvconv.register_map.function_r = 3 # HSV_CONVwAxiDma
hsvconv.register_map.h_add = 0
hsvconv.register_map.s_mult = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
hsvconv.register_map.s_add = 0
hsvconv.register_map.v_mult = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
hsvconv.register_map.v_add = 0

hsv2rgb.register_map.row_size = height
hsv2rgb.register_map.col_size = width
hsv2rgb.register_map.function_r = 1 # ForAXIDma

color_conv.register_map.row_size = height
color_conv.register_map.col_size = width
color_conv.register_map.function_r = 2 # ORG_IMGwAxiDma
#color_conv.register_map.function_r = 3 # COLOR_CONVwAxiDma
color_conv.register_map.red_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT>
color_conv.register_map.green_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
color_conv.register_map.blue_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 

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

laplacian.register_map.row_size = height
laplacian.register_map.col_size = width
laplacian.register_map.function_r = 2 # ORG_IMGwAxiDma
#laplacian.register_map.function_r = 3 # LAPLACIANwAxiDma

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


Jupyter Notebook で動作させた結果を示す。
i10filters_24_231207.jpg
i10filters_25_231207.jpg
i10filters_26_231207.jpg
i10filters_27_231207.jpg
i10filters_28_231207.jpg
  1. 2023年12月07日 04:38 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる3

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる2”の続き。

今まで Vitis HLS で作成したすべてのフィルタを実装したいということで、前回は、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 ディレクトリを作成し、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 の各 IP をブロック・デザインに追加してブロック・デザインを完成し、論理合成、インプリメンテーション、ビットストリームの生成を行って成功した。今回は、ZUBoard 1CG の Pynq Linux を起動して、Jupyter Notebook の i5filters ディレクトリのファイルを Jupyter Notebook 経由でコピーしようとしたら、 エラーになったので、ターミナルのコマンドでコピーを行った。次に i10filters_wrapper.bit と i10filters.hwh ファイルをアップロードし、i10filters_wrapper.bit は i10filters.bit に名前を変更した。

前回、作成できたビット・ファイルと hwh ファイルを見る。
i10filters/i10filters.runs/impl_1/i10filters_wrapper.bit がビット・ファイルだ。
i10filters_12_231206.png

i10filters/i10filters.gen/sources_1/bd/i10filters/hw_handoff/i10filters.hwh が hwh ファイルだ。
i10filters_11_231206.png

ZUBoard 1CG の PYNQ を起動して、Jupyter Notebook で、New -> Floder を指定して i10filters フォルダを作成した。
i10filters_13_231206.png

以前作成した i5filters ディレクトリで i5filters.ipynb と test2.jpg にチェックを入れて、Duplicate ボタンをクリックした。
i10filters_14_231206.png

Move ボタンをクリックし、i10filters ディレクトリにコピーを行う。
i10filters_15_231206.png

i10filters_16_231206.png

test2-Copy1.jpg の Move はエラーになった。
i5filters-Copy1.ipynb のみ Move できた。
i10filters_17_231206.png

i5filters-Copy1.ipynb の Rename もできなかったので、ターミナルで画像ファイルのコピーと名前の変更を行った。
cd ~/jupyter_notebooks/examples/i10filters
sudo mv i5filters-Copy1.ipynb i10filters.ipynb
sudo cp ../i5filters/test2.jpg .

i10filters_18_231206.png

i10filters_19_231206.png

Upload ボタンをクリックし、i10filters.hwh ファイルをアップロードする。
Upload ボタンをクリックし、i10filters.hwh ファイルをアップロードした。
i10filters_20_231206.png

i10filters_wrapper.bit も同様に Upload した。
i10filters_21_231206.png

i10filters_wrapper.bit を Rename しようとしたが、やはり、Jupyter Notebook 上ではエラーで名前を変更できなかった。
そこで、ターミナルで i10filters_wrapper.bit ファイルの名前を i10filters.bit に変更した。
sudo mv i10filters_wrapper.bit i10filters.bit
i10filters_22_231206.png

Jupyter Notebook の i10filters ディレクトリの現状を示す。
i10filters_23_231206.png
  1. 2023年12月06日 05:14 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる2

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる1”の続き。

今まで Vitis HLS で作成したすべてのフィルタを実装したいということで、前回は、Vivado 2023.2 で i10filters プロジェクトを作成し、i5filters プロジェクトでブロック・デザインを出力した i5filters.tcl を i10filters.tcl に改名し、少々手直したあとで、i10filters プロジェクトで動作させてブロック・デザインを作成した。今回は、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 ディレクトリを作成し、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 の各 IP をブロック・デザインに追加してブロック・デザインを完成し、論理合成、インプリメンテーション、ビットストリームの生成を行って成功した。

average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 ディレクトリを作成し、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 の各 IP を i10filters ブロック・デザインに追加した。
i10filters_7_231204.png

Address Editor 画面を示す。
i10filters_8_231204.png

Sources 画面をクリックし、i10filters_i ブロック・デザインのインスタンスを右クリックし、右クリックメニューから Create HDL Wrapper... を選択して、i10filters_wrapper.v ファイルを生成した。
i10filters_9_231204.png

Flow Navigator -> PROGRAM AND DEBUG -> Generate Bitstream をクリックし、論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。
Project Summary を示す。
i10filters_10_231204.png

DSP を 94 % 使用している。LUT も 54 % 使用している。これがフィルタの数の限界かもしれない?
  1. 2023年12月05日 04:23 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる1

ZUBoard 1CG の PYNQ v3.0.1 で自作の今まで作成してきた 10 個のフィルタを動作させよう。

ZUBoard 1CG の PYNQ v3.0.1 で自作の 5 個のフィルタを動作させる5”で 5 個のフィルタは動作させているので、次は平均化フィルタ(average_axis_RGB24)、エッジ強調フィルタ(edge_enhancement_axis_RGB24)、ラプラシアン・フィルタ(laplacian_axis_RGB24)、最小値最大値フィルタ(min_max_axis_RGB24)、アンシャープ・マスキング・フィルタ(unsharp_masking_axis_RGB24)を追加したい。今回は、Vivado 2023.2 で i10filters プロジェクトを作成し、i5filters プロジェクトでブロック・デザインを出力した i5filters.tcl を i10filters.tcl に改名し、少々手直したあとで、i10filters プロジェクトで動作させてブロック・デザインを作成した。

ZUBoard 1CG の PYNQ v3.0.1 で自作の 5 個のフィルタを動作させる2”の Vivado 2023.1 の i5filters プロジェクトで File メニューから Export -> Export Hardware... を選択して、i5filters.tcl を生成した。i5filters.tcl はブロック・デザインを生成する tcl スクリプトだ。

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

ZUBoard 1CG の PYNQ v3.0.1 で自作の 5 個のフィルタを動作させる1”の Vivado 2023.1 の i5filters プロジェクトの gaussian_axis_RGB24, median_axis_RGB24, sobel_axis_RGB24, RGB24toHSV, HSVConverter, HSV24RGB24, i5filters.tcl を i10filters プロジェクトのディレクトリにコピーした。

average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 ディレクトリを作成し、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 の各 IP をコピーした。

i5filters.tcl を i10filters.tcl に改名した。
i10filters_2_231203.png

i10filters.tcl の design_name を i10filters に変更した。
i10filters_3_231203.png

Vivado 2023.2 の Flow Navigator -> PROJECT MANAGER -> IP Catalog をクリックし、IP Catlog を表示した。
IP Catlog 内で右クリックし右クリックメニューから Add Repository を選択した。
gaussian_axis_RGB24, median_axis_RGB24, sobel_axis_RGB24, RGB24toHSV, HSVConverter, HSV24RGB24 ,average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 を選択して、IP Catlog に追加した。
i10filters_4_231203.png

IP が IP Catlog に追加された。
i10filters_5_231203.png

TCL Console タブをクリックし、次のコマンドを入力した。

cd /media/masaaki/Ubuntu_Disk/HDL/2023.2/zub1cg/i10filters/
source i10filters.tcl


i10filters ブロック・デザインが生成された。
i10filters_6_231203.png
  1. 2023年12月04日 04:32 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Sipeed Tang Primer 25Kが届いた

Aliexpress で Sipeed Tang Primer 25K をカメラ、PMOD アダプタ付きで購入したのですが、届いたら、Tang Primer 25K が入っている箱が空っぽでした。orz
Tang_Primer_25K_1_231122.jpgTang_Primer_25K_2_231122.jpg

Sipeed に空箱だったと言ったら、0.01$ つまり 2 円払ってくれということでした。後で返金するとも行ってましたが、面倒ですね。。。
2 円だと PayPal も払えないし、(110 円からの模様)コンビニ支払いもスマホの番号登録する必要があるし、カード支払いはしたくないしで八方塞がりでした。X でプリペイド・クレジットカードを教えてもらったので、Line pay で作成することにしました。
Line pay で無事にバーチャルカードを作れて、1,000 円チャージ後に 2 円支払いできたので、今日、Sipeed Tang Primer 25K が届きました。
Tang_Primer_25K_3_231122.jpg

Tang_Primer_25K_4_231122.jpg

Tang_Primer_25K_5_231122.jpgTang_Primer_25K_6_231122.jpg

IDA さんに教えてもらった Sipeed Tang Primer 25K のマニュアル・ページです。
  1. 2023年12月03日 21:29 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装する3

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装する2”の続き。

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装するということで、前回は、C シミュレーション、C コードの合成を行った。今回は、C/RTL 協調シミュレーション、Package 、Implementation を行った。

C/RTL 協調シミュレーションを行う。
VITIS COMPONETENTS -> edge_enhancement_axis_RGB24 -> Settings -> hls_config.cfg をクリックして、設定画面を表示した。
C/RTL Cosimulationldflags

-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc

を指定した。
C/RTL Cosimulation の trace_levelport にした。
C/RTL Cosimulation の wave_debug にチェックを入れた。

FLOW -> C/RTL COSIMULATION -> Run をクリックして、C/RTL 協調シミュレーションを行った。
Vivado が起動して、RTL シミュレーションを行って終了した。
zub1cg_i7filters_117_231130.png

edge_enhancement_axis_RGB24.wcfg タブをクリックし、波形を表示した。
全体波形を示す。
zub1cg_i7filters_118_231130.png

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

Cosimulation をクリックした。
レイテンシは 480013 クロックだった。問題無さそうだ。
zub1cg_i7filters_120_231130.png

Package を行う。
FLOW -> PACKAGE -> Run をクリックして、Package を行って成功した。
zub1cg_i7filters_121_231130.png

edge_enhancement_axis_RGB24/edge_enhancement_axis_RGB24/hls/impl/ip が生成されて、その中に ZIP ファイルとして、xilinx_com_hls_edge_enhancement_axis_RGB24_1_0.zip が生成された。
zub1cg_i7filters_122_231130.png

Implementation を行う。
FLOW -> IMPLEMENTATION -> Run をクリックした。
Implementation が終了し、成功した。
zub1cg_i7filters_123_231130.png

Place and Route をクリックした。
CP achieved post-implementation も 5.325 ns で問題無さそうだ。
zub1cg_i7filters_124_231130.png
  1. 2023年12月02日 04:25 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0
»