Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RISC-V オープンソース ハードウェア 概説

msyksphinz
December 28, 2017

RISC-V オープンソース ハードウェア 概説

msyksphinz

December 28, 2017
Tweet

More Decks by msyksphinz

Other Decks in Technology

Transcript

  1. RISC-Vちょっと知ってる人のために、 簡単にトライできるオープンソースハードウェアの紹介 • 各社がRISC-Vに対応したコアを発表している中で、UCBの発表した オープンソースコアが提供されている • 手っ取り早くRISC-Vを試すためにはオープンソースデザインがお勧め。 • 最新の仕様に追従しているのでスタート地点としてはおススメ •

    オープンソース・ハードウェアについて紹介 RISC-Vに 興味がある? RISC-Vで何を試して みたい? FPGAを持っている? No そんな馬鹿な!? Yes アクセラレータを接続して、 アプリケーションをゴリゴリに最適化したい RISC-Vの仕様について勉強し、 簡単なアプリケーションを動かしてみたい ZedBoard HiFive1でアプリケーション開発 Rocket-ChipとFPGAで 動かして評価 Rocket-ChipをRTL シミュレーション スタート
  2. RISC-Vのオープンソースハードウェアは 半導体業界にとってチャンス • 最先端プロセスは巨大企業しか追従できない • IP, EDA, ウェハ製造費, パッケージ費 …

    • 中小企業は追従できず、アイデアはあってもチャンス減 • なるべく自社の「売りの部分」に時間を掛けたい • それ以外の部分(制御コア, 外部I/F)などはなるべく時間を掛けたくない • CPUというSoCの中心部の、実装コストを最小化させる • CPU以外にもチップ内で注力したい部分はたくさんあるはず。 • だったら、CPUはアリモノで早く作って、 「本当に価値のあるところ」に注力したい • 共通の制御コアはRISC-Vでさっさと終わらせよう! • 無料、性能は商用コアに引けを取らない。 ソフトウェアスタックもある程度揃っている。 という選択肢について考えてみてください。
  3. GitHub上に”RISC-V”のすべてが公開されている • コンパイラ・オペレーティングシステム • GCC 7.1でRISC-VがMainstreamに取り込まれた • LLVM/ClangのRISC-Vサポートが lowRISCプロジェクトにより進行中 •

    Linuxカーネルは最新のVersion 4.15に対応済み • 各種LinuxディストリビューションがRISC-Vのサポート進行中 • ハードウェアとしては、SiFiveのU54-MC(64bitマルチコアRISC-V SoC)がLinuxをサポート • Linuxだけでなく、BSDもRISC-V対応が進む • 多くのプログラミング言語がRISC-Vへのポートを進めている • 非公式プロジェクトも多いが • C/C++, Go, Rust, Ocaml, Java, Pascal… • GNUライブラリ (Glibc, NewLibなど)もRISC-V移植済み • ※ 筆者もMicroPythonのRISC-V移植を試行 • ISSで動作するところまで確認した。 ※ https://riscv.org/software-status に詳しくまとめられている
  4. RISC-V 開発環境 • 命令セットシミュレータ・エミュレータ • UCB Official Spike Simulator /

    Gem5 • QEMU • Angel (JavaScript RISC-V simulator!) • RISCVEMU : QEMU開発者がRISC-V専用 シミュレータを作ってしまった! • SiFiveの提供するFreedom Studio • Eclipseベース • Linux, Mac, Windows対応 • RISC-VボードHiFive1 • Arduino IDEから制御可能 • もちろんただのCPUなのでC/C++のプログラムも実行できる • Freedom-E-SDK • CUIでのプログラム開発。HiFive, Freedom SoC PlatFormに対応 freedom-e-sdk bsp openocd riscv-gnu-toolchain software demo_gpio dhrystone welcome local_interrupt led_fade
  5. オープンソース RISC-Vコア Rocket-Core, BOOM SoC環境 Rocket-Chip Generator, Freedom SoC •

    UCBの開発したRISC-V Implementation • Single Issueの5段パイプライン “Rocket-Core” • 2-way/4-wayのOoOコア “BOOMv1”, “BOOMv2” • Rocket-Core, BOOM実装環境 Rocket-Chip Generator • Rocket-CoreやBOOMを内蔵してRTLSim, FPGAで評価することができる。 • SiFive社の開発したSoC環境 Freedom SoC Environment • SiFiveのサポートあり、GitHubからダウンロードできる無料版もある。 • Rocket-Chip Generatorよりも使えるI/Oが揃っている。 無料 ソースコード公開 最新仕様に追従 開発が活発 Rocket-Chip Generator Rocket-Core BOOMv1 BOOMv2 Freedom SoC E31 Core Complex E51 Core Complex U54-MC Core Complex Chiselで記述さ れている
  6. Rocket-Chipの実装言語 “Chisel” • Scalaをベースとしたハードウェア記述言語 • Rocket Chipはすべて”Chisel”で実装してある • 最終的にはVerilogに変換される •

    Chiselを使うことにより、合成用言語Verilogと分離する • Chisel→FIRRTL(中間言語)と変換することで、 VHDLなども出せる(一応) • 検証で有利 • Verilogシミュレータを走らせなくても Chisel(≒Scala)で検証パタンを書ける→高速 FIRRTL FPGA Verilog C++ Simulator FIRRTL ASIC Verilog
  7. Rocket-Chip Generator, Freedom SoCの構成方法 • 高いポータビリティ • Chisel(Scala拡張)によるモジュールの切り離し、コンフィグレーションの 構成変更が容易 •

    Xilinx ZYNQ FPGA, Arty, Virtex Ultrascaleなどに対応した構成を作成可能 Xilinx ARTY FPGA E300 Freedom SoC E3 Coreplex RV32E/IMACN ROM Debug AON UART SPIFlash SPI GPIO PWM I2C I-Cache 4kB D-Cache 16kB Custom Coprocessor Xilinx ZYNQ FPGA Rocket-Chip Generator RV64GC ROM Debug I-Cache 4kB D-Cache 16kB Custom Coprocessor AXI2TileLink ARM DRAM I/O class DefaultConfig extends Config( new WithNBigCores(1) ++ new BaseConfig) class TinyConfig extends Config( new WithNMemoryChannels(0) ++ new WithIncoherentTiles ++ new With1TinyCore ++ new BaseConfig) Chiselを使って、Rocketの 構成を簡単に変更できる
  8. Chiselを使って お手軽にオリジナルRISC-Vコアを作成 class WithNBigCores(n: Int) extends Config((site, here, up) =>

    { case RocketTilesKey => { val big = RocketTileParams( core = RocketCoreParams(mulDiv = Some(MulDivParams( mulUnroll = 8, mulEarlyOut = true, divEarlyOut = true))), dcache = Some(DCacheParams( rowBits = site(SystemBusKey).beatBits, nMSHRs = 0, blockBytes = site(CacheBlockBytes))), icache = Some(ICacheParams( ... } }) class With1TinyCore extends Config((site, here, up) => { case XLen => 32 case RocketTilesKey => List(RocketTileParams( core = RocketCoreParams( useVM = false, fpu = None, mulDiv = Some(MulDivParams(mulUnroll = 8))), btb = None, dcache = Some(DCacheParams( rowBits = site(SystemBusKey).beatBits, nSets = 256, // 16Kb scratchpad nWays = 1, nTLBEntries = 4, nMSHRs = 0, blockBytes = site(CacheBlockBytes), scratch = Some(0x80000000L))), … blockBytes = site(CacheBlockBytes))))) }) class TinyConfig extends Config( new WithNMemoryChannels(0) ++ new WithIncoherentTiles ++ new With1TinyCore ++ new BaseConfig) Chiselを使って、コアの部品を簡単に着脱・ カスタマイズできる。 ベースのコンフィグレーションに対して、 カスタマイズを行っていく。 VM Support メインパイプライン FPU DIV I-cache 構成 D-cache 構成 I/F
  9. FPGAでの実行環境が用意されている • ZedBoard向けに論理合成→インプリメント • UCBのfpga-zynqリポジトリが便利 • https://github.com/ucb-bar/fpga-zynq • FPGAでのRTLSim高速化なら MIDASの方が良い?

    • (https://github.com/ucb-bar/midas-top-release) • インプリメントの手順は非常に単純 • cd zedboard; make • 合成後binファイル (.bin) • FSBL, U-Boot, BOOT.binなどZynqの起動に必要なもの • PS部(ARM)で動作させるPeta-Linuxのビルド • RISC-Vで動作させるLinuxのビルド • 全部自動でやってくれる! • このフレームワークはRISC-Vだけで 使うのはもったいない • SDカードに書き込むファイル群が ディレクトリにまとめて生成させるので、SDカードにコピーする だけ fpga-zynq rocket-chip zedboard zynq zc706 sub-repo 合成ディレクトリ 合成ディレクトリ 合成ディレクトリ
  10. Rocket-Chip Generatorの RTLシミュレーション・FPGAインテグレーション • RTLシミュレーション環境 • VCS/Verilator対応 • ChsielのデザインをVerilogに変換し、シミュレーション実行 •

    FPGAで合成して評価する場合 • SRAMの置き換えなどに注意すること • ASIC向け : rocket-chipのリポジトリでは emulator/generated-src/*.behav_srams.v • FPGA向け : Behavior SRAMをBlockRAMに正しく置き換えること • 生成したVerilogの中で配列の部分を抽出して、 モデルとして生成させることも出来る Verilog 0 10000 20000 30000 40000 50000 0 20000 40000 60000 80000 100000 120000 140000 Rocket Default Rocket Small Freedom-E300 BOOM v1 BOOM v2 RISC-V Design 合成結果 Vivado v.2016.2 ZYNQ 7z020-clg484 Total LUT FF FPGA Design RTL Simulation RTLシミュレーション実行の様子
  11. RISC-Vの備えるアクセラレータインタフェースについて • RoCC (Rocket Custom Coprocessor) • Rocket Coreとダイレクトに接続 (L1DC,

    External MemoryIFに接続) • RISC-Vのカスタム命令の仕様と直結 CMD RESP RESP CMD Rocket Core L1 D-cache Accelerator CMD RESP External ここを自作すること で、オリジナル命令 を作成できる custom0 rd, rs1, rs2 ・rd, rs1, rs2のレジスタアドレス情報 ・rs1, rs2 のレジスタデータ ・デコード情報など
  12. Rocket-Chipのカスタマイズ例: Dot Product Acceleratorを作ってRocket Coreに接続 2つの行列のアドレスと長さを指定して、 自動的にデータをフェッチ+MAD処理をするアクセラレータ RoCC I/F は64bitなので、uint32_tを2つフェッチして2-waySIMDで計算した

    × = 2-way SIMDで 要素2つ分計算 実装はgithubに公開してあります。 https://github.com/msyksphinz/rocket-chip/tree/feature/matrix32 ハードウェアを使って、メモリのフェッ チ処理とデータの演算処理をオーバラッ プさせることで高速化を狙う CMD RESP RESP CMD Rocket Core L1 D-cache Accelerator CMD RESP External H_addr MAD V_addr Chiselで記述
  13. Rocket-Chipのカスタマイズ例:性能評価  ZedBoardで動作させた  SW: ソフトウェアで実行  HW1: ハードウェアで実行 

    行列積を「行」「列」の順番で実行  HW2: ハードウェアで実行  行列積を「列」「行」の順番で実行  行列のサイズが大きくなると、8倍以上の性能向上 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 2 x 2 x 2 4 x 4 x 4 8 x 8 x 8 16 x16 x16 18 x24 x28 性能比率 行列サイズ ソフトウェア実行を1とした場合の、 ハードウェア実行の性能向上率 SW/SW HW1/SW HW2/SW SW HW1 HW2 2 x 2 x 2 233 119 139 4 x 4 x 4 1094 325 310 8 x 8 x 8 7299 1287 1296 16 x16 x16 58610 8258 7122 18 x24 x28 172256 19581 19565 SW/SW HW1/SW HW2/SW 2 x 2 x 2 1.0 1.958 1.676 4 x 4 x 4 1.0 3.366 3.529 8 x 8 x 8 1.0 5.671 5.632 16 x16 x16 1.0 7.097 8.229 18 x24 x28 1.0 8.797 8.804 ソフトウェア実行を1とした場合 のハードウェア実行の性能向上率 Dot Product Acceleratorを使った 行列積サイクル数 Acceleratorを使って 8倍高速化
  14. まとめ: RISC-V オープンソースデザインは 弱い者の味方 • オープンソースのデザインでRISC-Vをトライ • お金が無くてもRISC-Vを試行できる • ハードウェア・ソフトウェアのRISC-V対応は着実に

    進んでいる。 • いろんな手段が用意されている • FPGAボードを使う : カスタムデザインでゴリゴリに最適化 • 評価ボードを買う : 簡単にアプリケーション評価可能 • まずは資料を探してみよう • https://riscv.org/specifications/ (RISC-Vの仕様書一覧) • https://www.sifive.com (SiFiveのWebSite) • https://github.com/freechipsproject/rocket-chip (Rocket Chip) • https://github.com/sifive/freedom-e-sdk (Freedom SDK) • http://msyksphinz.hatenablog.com (発表者のブログ)