Microsemi社FPGA用のCPUコア紹介

# Microsemi社FPGA用のCPUコア紹介
Qiita Advent Calender 「ハードウェア開発、CPUアーキテクチャ Advent Calendar 2016」12月24日の記事です。
http://qiita.com/advent-calendar/2016/hardware

## 1. はじめに

こんにちは、@shibatchii です。
普段はASICとかFPGAの設計をなりわいとしています。

さて、FPGAというとXilinX社やIntel(ALTERA)社やLattice社がよく知られていますが、Microsemi社もActel社を買収してFPGAをもっています。
今回はそのMicrosemi社のFPGA用CPUコアについて紹介してみます。
FPGAそのものの話はまた別の機会に紹介したいと思います。

## 2.CPUコアの種類

CPUコアはFPGAライブラリ(IP)として提供されますが種類として ”DirectCore” と "CompanionCore"とがあります。
DirectCoreはMicrosemi社が提供しているもので基本的に無料で使用できます。
CompanionCoreはIPベンダーが提供しているもので有料で使用できます。

CPUコアはどちらのライブラリにもありますが、今回は主にDirectCoreにあるCPUコアについてみてみます。
提供されているCPUコアは以下のものがあります。

**ソフトコア**

RTL、ライブラリで提供。デバイス依存度は低い

* CoreABC
* Core8051s
* RISC-V

**ハイブリッドコア**

RTL、ライブラリで提供されるが、特定のデバイスでしか使えない。

* CoreMP7
* Cortex-M1

**ハードコア**

すでにデバイスに作りこんである。

* Cortex-M3

CPUコアはFPGA開発ツールのLiberoSocをインストールすると、ライブラリ(IP)をまとめたCatalogというところにあります。
注：CoreRISC-V_AXI4とSiFiveE31Coreplexは標準では入っていません。自分でCatalogにAddする必要があります。
![catalog.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/9374b763-d714-d22f-765e-90e42e6288d2.png)

それでは各コアを見ていきましょう。

---
## 3-1.CoreABC

シンプルで低ゲートなコアです。バスはAPBです。開発言語はアセンブラのみです。
用途としては、RTLでシーケンサー作ってもいいんだけどちょこっとCPUで楽してもいいよねといったところでしょうか。

### 構成
以下のように数ブロックにわかれています。
![CoreABC_diag.jpg](https://qiita-image-store.s3.amazonaws.com/0/105578/95dc60da-9489-d555-5cb8-995358399141.jpeg)

### コア設定画面
LiberoSOCでのコア設定画面は以下のようになっていて、小さい割には結構設定条件が多く使わない命令を削ったりもできます。
プログラムはProgramuタブで記述します。つまり、CPU生成したときにプログラムもすでに入っているということができます。
![coreABCset.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/96e29199-9aa4-0009-769d-bd8177fc2d58.png)

### ブロック
実際に生成するとこのようになります。
abc_0がコアです。APB3のバスが出ていることがわかります。
![abc_core.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/43213353-c053-a13c-0070-d70a1ecdc29b.png)


---
## 3-2.Core8051s
8051はもともとインテルの8bitコントローラICです。歴史はかなり古く30年位前からありました。一般にはあまり知られていませんが昔の組み込み制御とかにはよく使われていました。
8051でのレガシー資産があってボードが廃盤になけどプログラムにはあまり手を入れずに作り替えたいといった用途がありそうです。
※Core8051(sが付かないもあるのですがEvaluationとなっていて、Microsemiに申請しないと出してもらえないようです。)

Core8051sではCore8051に比べかなり機能が軽量化されています。
UART,Timer,GPIOが無いとか。重い命令(Mul,Div等)は選択制になっているとか。アドレス領域が限定されているとか。
また、バスがAPBバスになっているのも特徴です。

### 構成
HPにはこの図しかありません。詳細はマニュアル見てねということでしょう。情報はWeb検索すれば沢山でてきそうですし。
![8051_block.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/f3204b94-dfa2-107b-4820-48f5be738c10.png)

### コア設定画面
コアとして確定しているのであまり変更できる項目はありません。APBバス設定があるのがなんとも。
![i8051_setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/7e2b4c71-8c2f-d38f-9144-517329518079.png)

### ブロック
ウオッチドック、割り込み、デバッグif、外部メモリif、APB3バス等ありますね。
![i8051_block.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/2b6d3221-ef14-490a-25b5-372957373d5b.png)

---
## 3-3.RISC-V
RISC-V Foundationのページによると RISC-V：フリー・オープンRISC命令セット・アーキテクチャ ということで、私は最近見始めたのでまだよくわかっていません。<(_ _)>
詳細はハードウェア開発、CPUアーキテクチャ Advent Calendar 2016のmsyksphinzさんの記事やRISC-V Foundationのページを参照してください。

命令セットアーキテクチャは規定されているけど、それをどうハードウェアで実現するかはベンダーとかユーザーにゆだねられている感じです。
MicrosemiもIGLOO2,SmartFusion2シリーズにインプリできるIPをリリースしたとの情報がありましたので見てみます。


### 構成
RV32IMなので32bitコアですね。AXIバスとAHBバスが出ています。
下方にあるCoreAHBtoAPB、あCore16550UARTはMicrosemiのDirectCoreIPです。
バスをAHBにすることによって元々持っている各種IPを利用できるようにしているのですね。
メモリについては帯域がいるのでAXIバスになっていると。
![risc5_arch.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/23ae023f-fc64-8713-ceef-8dd67f539c73.png)

### コア設定画面
RISC-Vは標準ではCatalog内に入っていません。
MicorsemiのRISC-VのページからGitHubに飛んでダウンロードしCatalogにAddする必要があります。
で、設定画面ですが、これだけしか設定できません。もうすこしいろいろ設定できるかなと思ってたのですが。
![risc5_setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/9d69bfa1-486b-f50e-43e0-98bffd45e236.png)

### ブロック
入っていたコアを置いてみました。ベースのコアがSiFiveE31Coreplex_0でラッパーをかけたのがCORERISCV_AXI4_0のようです。
COREJTAGDEBUG_0は命令のロードやデバッグをするためのインターフェースです。
AXI_GLUE_LOGIC_0はメモリに接続するためのブリッジのようなもののようです。

![risc5_block.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/6cccacee-0e9f-2317-3d58-ce94be19b5aa.png)

私の持っているボードに対応したデザインもあって、動かしてみようとしたのですがLinuxにLiberoSocを入れ、GitHubから開発ツールをダウンロードインストールしないといけないのですが、インストールやコンパイルで不足ライブラリとかエラーとか難問にぶちあたりまだうまく動かせてきません。

---
## 3-3.CoreMP7,Coretex-M1

### 概要
この2つのコアはちょっと特殊なので簡単な紹介だけにしておきます。
上のほうでハイブリッドコアと書きましたが、これは特定の対応済のコアでしか動作しません。
ソフト的に構成とかある程度コンフィグレーションできるけどハードウェアに依存している部分があるよということだと思います。

#### CoreMP7
Fusionシリーズの一部、ProASIC3シリーズのM7A3P1000とM7AFS600しか対応していませんでした(過去形)。
ARM7TDMI-S互換、ARMv4T RISCアーキテクチャ、32bitインストラクションセットです。
現在対応デバイスも無く、ユーザーガイドからも削除されています。

#### Coretex-M1
Proasic3,Fusion,IGLOOシリーズで動作します。
ARMv6-M アーキテクチャ、ARM7 と ARM9 Thumb 命令、3-stage32-bitパイプライン、AHB-Lite インターフェースとなっています。
こちらはまだ対応デバイスはあるようです。しかしM1*とついたデバイスでしが動作しません。
インプリするとそれなりにロジックを消費するようです。


---
## 3-4.Cortex-M3
SmartFusion,SmartFusion2にはCoretex-M3がハードウェアとして搭載されています。

CPUP搭載FPGAというとCortex-A9を搭載したXilinX社のZynqやIntel社のSoCFPGAがよく知られています。強力なCPUとロジックで大量のデータでもどんどん処理するよという感じです。

SmartFusion,SmartFusion2はどちらかというとコントローラーとしての用途で、低消費電力でコンパクトな方向のようです。
ARMv7-Mアーキテクチャ、32bitバス、AHBインターフェースとなっています。
コア設定も非常に細かく、必要で無い機能はOFFにして省エネにしようというのがわかります。

ソフトウェア開発環境についても最後に少し紹介しておきますね。

以下、Smartfusion2で見ていきましょう。

### 構成
ペリフェラルが多く用意されています。SPI,UART,I2C,Timer、CAN,WDT,RTC,FMC,DDRコントローラ等々。
バスはAPB,AHB(FPGAファブリック),AXI(主にメモリ用)とフル装備ですね。
![Smartfusion2_arch.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/0f16ae91-9617-f5f0-8003-ae3d99895f0e.png)

### コア設定画面
いままで説明してきたコアと比べて非常に多くの設定があります。
構成の手順も
　a) 構成図をまず出して、必要なものをチェックし設定する方法 (SmartFusionの時からあった Create a microsontoroller(MSS) based design)
  b) 機能を順次選択設定していく方法 (新しく装備された方法 Create a system builder based design)
と2通りあります。b)の方法ですすめてみます。画面図が多くなるので重要そうなとこのみ載せますね。

Device Features
外部メモリIF使用有無、eNVM使用有無やウオッチドック、DMA、RTC使用有無を設定できます。
![M3DEV.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/7a6e14cf-7842-8f82-151d-3ec55540ca29.png)

Memories
メモリ設定をします。メモリの種類、バス幅、競合制御方法。MemoryInitializationではバースト長やCASレイテンシなど使用するメモリに合わせてかなり細かく設定できます。
![M3MEM.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/2f507680-c80a-1e55-b5e1-4f88780b6b48.png)

Peripherals
ペリフェラルの設定ができます。
MSS PeripheralsはCPUコアに作り付けのものです。チェックボックスOn/Offで使用未使用が設定でき、Configureの歯車アイコンをクリックすると各ペリフェラルの細かい設定ができます。
Fablic Slave CoresからMSS FIC_0-MSS Master Subsystemにドラッグドロップするとファブリック(FPGA部)でつかうペリフェラルを指定、設定することができます。
![M3PER.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/f1284031-30db-6d53-3450-44ebbada48f5.png)

Clocks
クロックの設定ができます。
どこから入力するか、分周してどこへ出力するかとか、ファブリックへの分配設定や、オンチップオシレータの設定もできます。
![M3CLK.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/013d30a3-0253-03f7-6562-6de201047236.png)

Microcontroller
ウォッチドックタイマ、リアルタイムカウンタ、ペリフェラルDMA、Cortex-M3、キャッシュコントローラ、AHBバスマトリックスなどが設定できます。
図省略

SECDED
Single Error Correct / Double Error Detect の設定ができます。
EDMAC,eSRAM,EthernetRAM,USB,CAN,MDDRに対して設定できます。
図省略

Security
セキュリティの設定をします。
バスやペリフェラルがSRAMやeNVRAM,DDRへのアクセスを制限します。
![M3SEC.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/dca7836b-bcac-2472-e595-811a32fc7494.png)

Interrupts
プロセッサやペリフェラルからの割り込みを表示します。
図省略

MemoryMap
ペリフェラルやメモリのメモリマップを表示します。
図省略

それでは生成してみましょう。

### ブロック
I2CやSPIなどのペリフェラル信号が出力されています。
MAC_MMI_FABRICはEtherNetインターフェース用ですね。
もちろんAMBAマスター信号も用意されています。
![M3BLK.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/469d5ca8-230d-88cf-49e3-e9a831cd698a.png)

### ソフトウェア開発環境
ソフトウェア開発環境として Microsemi SoftConsole というのを使用します。
もちろんARMコアなので、KEIL uVision とか IAR Embedded Workbench とかも使用可能です。

SoftConsoleの画面です。Eclipsベースになっておりここでプログラムの作成やコンパイル、ローディング、実行ができます。
ブレークポイントの設定やステップ実行も可能です。
各ペリフェラルのドライバ、ライブラリも用意されているので、includeして使用することが可能です。
![SC.PNG](https://qiita-image-store.s3.amazonaws.com/0/105578/428a1628-e35c-baa7-fb1c-b6d68ca2da58.png)


---
## ４．終わりに
今回はMicrosemi社のCPUコアにスポットを当てて紹介しました。
機会があればCPUコアを使ったFPGAの設計とかも紹介したいと思います。
それでは、また。@shibatchii

---