Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

俺様SoCではなく、俺様FPGAは作れるのか?

@Vengineerの戯言 : Twitter SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

はじめに

このブログで、かなり前に、Arm Cortex-A53入りFPGAを使って俺様SoCを作ろう、的なことを書きました。 そのブログを検索してみたら、なんと、2010.10.17と、10年以上も前でした。

vengineer.hatenablog.com

俺様SoCでは、FPGAの中に、Arm Cortex-A53とComputer Systemを組み込んだもの。

今回は、FPGAそのものを開発するという俺様FPGAのお話。。。俺様FPGAって、なんだー。

俺様FPGAとは?

俺様FPGAとは、FPGAそのものを開発するというもの。え、FPGAって自分で開発できるの?と思うでしょうが、実はできるんです。 ただし、Siliconにするにはお金がかかるのでシミュレーションまでしか無償ではできませんが。。。

どうやって、作ればいいのか?

オープンソースFPGA開発ツール、SymbiFlow

最近、FPGAベンダーの開発ツールではなく、オープンソースFPGA開発ツールを使って、FPGAのbitstreamが生成できるようになりました。その代表が、SymbiFlow です。

symbiflow.github.io

このSymbiFlowは、FrontendのSynthesisのYosysとBackendのFPGA tools (nextpnrとVerilog to Routing)で構成されています。

bitstream が生成できるのは、

  • Project IceStorm : Lattice iCE40
  • Project X-Ray : Xilinx 7-Series
  • Project Trellis : Lattice ECP5
  • QuickLogic : EOS S3/QLFK4N8

の4種類です。あたしは、Lattice 専用のツールだと思っていましたが、Xilinx 7-Series (Zynqも)やQuickLogicもサポートしていたですね。

Project Icestorm, Project Trellis, QuickLogic に関しては、DSP や Hard Block もサポートしているようです。

サポートしているボードは、

  • Digilent Arty A7-35T (XC7A35T)
  • Digilent Basys 3 Artix-7 (XC7A35T)
  • QuickFeather Develpment Kit (EOS-S3)
  • Digilent Zybo Z7 (XC7Z2010)
  • Alphamax NeTV2 (XC7A35T)
  • ECP5-5G Versa (LFE5UM5G-45F)
  • UL3S :(LFE5U-12F/25F/45F/85F)
  • TinyFPGA Ex (LFE5U-85F/LFE5UM5G-85F)
  • iCE40-HX8K Breakout Board (ICE40HX8K-B-EVN)
  • iCEblink40LP1K Evaluation Kit (ICE40LP1K-BLNK-EVN
  • iCEstick Evaluation Kit (ICE40HX1K-STICK-EVN
  • Digilent Nexsys Video Artix-7 FPGA (XC7A200T-1SBG484C)
  • DPControl iCEVision Board (iCE40UP5K)

です。結構ありますね。

俺様FPGAを作るには、

俺様FPGAを作るには、SymbiFlow Architecture Definitions に書いてある内容に従う必要があります。

特に、Development Practices に書いてある Strucure の

  • Directories
  • Files
  • Names
  • Notes

のルールを守って、俺様FPGAを定義する必要があります。また、Verilog to Routing Notes についても守る必要があります。

iCE40についてみてみる

Project IceStorm の Lattice iCE40 の SymbiFlow Architecture Definitions を見てみましょう! SymbiFlow の symbiflow-arch-defs の ice40 にあります。

  • cells
  • device
  • docs
  • primitives
  • tiles
  • tests
  • utils
  • yosys

があります。devices の下には、

  • layouts
  • tile-routing-virt
  • top-routing-virt

があります。layouts/N4k ディレクトリには、

  • CMakeLists.txt
  • ntemplate.N4k.fixed_layout.xml

があります。CMakeLists.txt は、

add_file_target(FILE ntemplate.N4k.fixed_layout.xml)
n_template(
  NAME N4k.fixed_layout.xml
  PREFIXES lp;hx
  SRCS ntemplate.N4k.fixed_layout.xml
)

になっています。ntemplate.N4k.fixed_layout.xml ファイルは、下記のようになっていて、16 x 20 のレイアウトになっているっぽいです。

<!-- set: ai sw=1 ts=1 sta et -->
<fixed_layout name="{N}4K" width="16" height="20">
 <!-- FIXME -->
</fixed_layout>

primitives の下には、

  • mux2
  • mux4
  • sb_carry
  • sb_ff
  • sbio
  • sb_lut
  • sb_ram

があります。mux2 を見てみたら、下記のような CMakeLists.txt だけでした。

mux_gen(
  NAME ice_mux2
  INPUTS LT,FF
  MUX_NAME ICE_MUX2
  SPLIT_INPUTS 1
  TYPE logic
  WIDTH 2
)

上記の mux_gen は、common/cmake/gen.cmake の中で定義されていました。

まとめ

オープンソースFPGA開発ツール SymbiFlow では、Lattice/Xilinx/QuickLogic のFPGAをサポートしていることはわかりました。 Latticeの iCE40 の Symbiflow Architecture Definitions のファイルをちょこっと覗いてみました。

このことから、俺様FPGAを作ることはできそうです。

どのような俺様FPGAを作ればいいのかを考えないと。。。