FC2カウンター FPGAの部屋 AXI4スレーブ・バス・ファンクション・モデル(BFM)の作製2

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

FPGAの部屋

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

AXI4スレーブ・バス・ファンクション・モデル(BFM)の作製2

AXI4スレーブ・バス・ファンクション・モデル(BFM)の作製1”の続き。

ここでは、AXI4マスタIPを自作して、それを単体テストするために、AXI4スレーブIPの代わりのBFMモデルを作成している。(axi_master_BFM.vhd)

一応完成したので、cdctest_axi_master.vhd と接続してテストしてみた。
シミュレーションを行ったので、その結果を下に示す。まずはWrite Transaction。Writeデータ転送時にランダムなWaitを発生できるようにしてある (WRITE_RANDOM_WAIT=1) が、現在はWaitしない設定 (WRITE_RANDOM_WAIT=0) にしてある。
cdctest_axi_master_20_120414.png

次にRead Transactionのシミュレーション波形を下に示す。Readデータ転送時にランダムなWaitを発生できるようにしてある (READ_RANDOM_WAIT=1) が、現在はWaitしない設定 (READ_RANDOM_WAIT=0) にしてある。
cdctest_axi_master_21_120414.png

axi_master_BFM.vhdは論理合成可能でもある。試しにインプリメントしてみた。
”C_OFFSET_WIDTH : integer := 8; -- 割り当てるRAMのアドレスのビット幅”の場合だ。余り大きな領域を割り当てると論理合成に時間がかかるし、FPGAに入らなくなってしまう。Project Navigator の画面を下に示す。
cdctest_axi_master_22_120414.png

MAPリポート (axi_master_bfm_map.mrp) の一部を下に示す。

Release 13.4 Map O.87xd (nt)
Xilinx Mapping Report File for Design 'axi_master_bfm'

Design Information
------------------
Command Line   : map -intstyle ise -p xc6slx45-csg324-2 -w -logic_opt off -ol
high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off
-pr off -lc off -power off -o axi_master_bfm_map.ncd axi_master_bfm.ngd
axi_master_bfm.pcf 
Target Device  : xc6slx45
Target Package : csg324
Target Speed   : -2
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : SAT 14 APR 4:40:4 2012

Design Summary
--------------
Number of errors:      0
Number of warnings:    0
Slice Logic Utilization:
  Number of Slice Registers:                 2,121 out of  54,576    3%
    Number used as Flip Flops:               2,121
    Number used as Latches:                      0
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:                0
  Number of Slice LUTs:                      2,848 out of  27,288   10%
    Number used as logic:                    2,845 out of  27,288   10%
      Number using O6 output only:           2,817
      Number using O5 output only:               0
      Number using O5 and O6:                   28
      Number used as ROM:                        0
    Number used as Memory:                       1 out of   6,408    1%
      Number used as Dual Port RAM:              0
      Number used as Single Port RAM:            0
      Number used as Shift Register:             1
        Number using O6 output only:             1
        Number using O5 output only:             0
        Number using O5 and O6:                  0
    Number used exclusively as route-thrus:      2
      Number with same-slice register load:      2
      Number with same-slice carry load:         0
      Number with other load:                    0

Slice Logic Distribution:
  Number of occupied Slices:                   918 out of   6,822   13%
  Nummber of MUXCYs used:                       24 out of  13,644    1%
  Number of LUT Flip Flop pairs used:        2,858
    Number with an unused Flip Flop:           743 out of   2,858   25%
    Number with an unused LUT:                  10 out of   2,858    1%
    Number of fully used LUT-FF pairs:       2,105 out of   2,858   73%
    Number of unique control sets:               9
    Number of slice register sites lost
      to control set restrictions:              30 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                       126 out of     218   57%

Specific Feature Utilization:
  Number of RAMB16BWERs:                         0 out of     116    0%
  Number of RAMB8BWERs:                          0 out of     232    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       1 out of      16    6%
    Number used as BUFGs:                        1
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     376    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     376    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     376    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                            0 out of      58    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       4    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%

Average Fanout of Non-Clock Nets:                5.80

Peak Memory Usage:  305 MB
Total REAL time to MAP completion:  1 mins 7 secs 
Total CPU time to MAP completion:   1 mins 6 secs 


FPGA Editor を立ちあげてram_array の実装状況を見てみた。
cdctest_axi_master_23_120414.png

スライスのFFとして実装されている。
RAMのVHDLコードを下に示す。

constant    SLAVE_ADDR_NUMBER    : integer := 2**(C_OFFSET_WIDTH - ADD_INC_OFFSET);
type ram_array_def is array (SLAVE_ADDR_NUMBER-1 downto 0) of bit_vector(C_M_AXI_DATA_WIDTH-1 downto 0);
signal ram_array : ram_array_def;

...............

    -- RAM
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                ram_array <= (others => (others => '0'));
            else
                if cdc_we='1' then
                    for i in 0 to C_M_AXI_DATA_WIDTH/8-1 loop
                        if M_AXI_WSTRB(i)='1' then -- Byte Enable
                            ram_array(CONV_INTEGER(wr_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET)))(i*8+7 downto i*8) <= To_bitvector(M_AXI_WDATA(i*8+7 downto i*8));
                        end if;
                    end loop;
                end if;
            end if;
        end if;
    end process;
    M_AXI_RDATA <= To_stdlogicvector(ram_array(CONV_INTEGER(rd_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET))));


process文の中でresetをかけてしまっているので分散RAMにアサインされない。
そこで分散RAMにアサインされるように、resetの記述を削除した。VHDLコードを下に示す。

constant    SLAVE_ADDR_NUMBER    : integer := 2**(C_OFFSET_WIDTH - ADD_INC_OFFSET);
type ram_array_def is array (SLAVE_ADDR_NUMBER-1 downto 0) of bit_vector(C_M_AXI_DATA_WIDTH-1 downto 0);
signal ram_array : ram_array_def := (others => (others => '0'));

...............

    -- RAM
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if cdc_we='1' then
                for i in 0 to C_M_AXI_DATA_WIDTH/8-1 loop
                    if M_AXI_WSTRB(i)='1' then -- Byte Enable
                        ram_array(CONV_INTEGER(wr_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET)))(i*8+7 downto i*8) <= To_bitvector(M_AXI_WDATA(i*8+7 downto i*8));
                    end if;
                end loop;
            end if;
        end if;
    end process;
    M_AXI_RDATA <= To_stdlogicvector(ram_array(CONV_INTEGER(rd_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET))));


これでインプリメントした時のMAPリポートの一部を下に示す。

Release 13.4 Map O.87xd (nt)
Xilinx Mapping Report File for Design 'axi_master_bfm'

Design Information
------------------
Command Line   : map -intstyle ise -p xc6slx45-csg324-2 -w -logic_opt off -ol
high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off
-pr off -lc off -power off -o axi_master_bfm_map.ncd axi_master_bfm.ngd
axi_master_bfm.pcf 
Target Device  : xc6slx45
Target Package : csg324
Target Speed   : -2
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : SAT 14 APR 5:5:44 2012

Design Summary
--------------
Number of errors:      0
Number of warnings:    0
Slice Logic Utilization:
  Number of Slice Registers:                    68 out of  54,576    1%
    Number used as Flip Flops:                  68
    Number used as Latches:                      0
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:                0
  Number of Slice LUTs:                        174 out of  27,288    1%
    Number used as logic:                      109 out of  27,288    1%
      Number using O6 output only:              86
      Number using O5 output only:               0
      Number using O5 and O6:                   23
      Number used as ROM:                        0
    Number used as Memory:                      64 out of   6,408    1%
      Number used as Dual Port RAM:             64
        Number using O6 output only:            64
        Number using O5 output only:             0
        Number using O5 and O6:                  0
      Number used as Single Port RAM:            0
      Number used as Shift Register:             0
    Number used exclusively as route-thrus:      1
      Number with same-slice register load:      1
      Number with same-slice carry load:         0
      Number with other load:                    0

Slice Logic Distribution:
  Number of occupied Slices:                    78 out of   6,822    1%
  Nummber of MUXCYs used:                       24 out of  13,644    1%
  Number of LUT Flip Flop pairs used:          183
    Number with an unused Flip Flop:           117 out of     183   63%
    Number with an unused LUT:                   9 out of     183    4%
    Number of fully used LUT-FF pairs:          57 out of     183   31%
    Number of unique control sets:              11
    Number of slice register sites lost
      to control set restrictions:              44 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                       126 out of     218   57%

Specific Feature Utilization:
  Number of RAMB16BWERs:                         0 out of     116    0%
  Number of RAMB8BWERs:                          0 out of     232    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       1 out of      16    6%
    Number used as BUFGs:                        1
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     376    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     376    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     376    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                            0 out of      58    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       4    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%

Average Fanout of Non-Clock Nets:                3.81

Peak Memory Usage:  279 MB
Total REAL time to MAP completion:  30 secs 
Total CPU time to MAP completion:   29 secs 


Number of occupied Slicesが13% から1% に劇的に減った。これは分散RAMが使用されたからだ。FPGA Editor を起動してRAMを見てみたのが下の図だ。
cdctest_axi_master_24_120414.png

SLICEMが分散RAMとしてアサインされているのがわかる。

なお、”C_OFFSET_WIDTH : integer := 15; -- 割り当てるRAMのアドレスのビット幅”の場合は、スライスが足りなくてMAPできなかった。

次に、Write Transaction。Writeデータ転送時にランダムなWaitを発生できるようにしてシミュレーションしてみた。 (WRITE_RANDOM_WAIT=1)
cdctest_axi_master_25_120414.png

3つ目以降のWrite Transaction でM_AXI_WREADY が変化してWaitしているのがわかると思う。

長くなったので、この辺で終了。axi_master_BFM.vhd のVHDLコードは次回ブログに貼る予定だ。

(追加)
なぜ、RAM をbit_vector のarray で定義したかというと、インプリメントは関係無いですが、シミュレーションでstd_logic は9値を持つので、それだけ領域を確保するのにパソコンのメモリ領域を食うと思われます。bit ならば2値なので、メモリ領域を食わないかな?と思い使いました。実際に、bit_vector で定義したほうがstd_logic で定義したよりメモリ領域を消費しないかどうか?は確認してみたことがないので、良く分かりません。知っている方がいらっしゃったら教えて下さい。
  1. 2012年04月14日 05:27 |
  2. AXI4 Master IPの作製
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/2108-751319e7
この記事にトラックバックする(FC2ブログユーザー)