佐藤 達之
第8回

オリジナル 16 ビット・プロセッサ・コア MR16 の概要
しています．
この C-NIT に刺激された筆者が，一般的なプロセッサの機能を備えた上で，Xilinx 社製 FPGA において同クラス最小の 16ビット RISC を目指して設計したのが MR16 コアです．表 1 に筆者は以前から「FPGA 専用に設計すれば小さく，速く，扱MR16 の設計コンセプトを示します．

いやすいプロセッサ・コアを作れるはずだ」と漠然と考えていました．そんな時，参考文献（3）にある C-NIT という FPGA 向
けの 16 ビット・プロセッサを見つけました．当時の C-NIT は割り込み機能がないなどの制限がありましたが，16 ビット演算が可能なプロセッサで，SDRAM インターフェースとブロック● 回路の小規模化と高速化の両立

RAM によるキャッシュ回路を内蔵し，SpartanII デバイスの上

図 1 に MR16 のブロック図を示します．コア内部に持つレジに 380slice 未満でフィットするという驚くほど小さな回路規模

スタはブロック図の左側のアミの部分で，それ以外の部分は非で実現されていました．現在 C-NIT の公開ページは接続できな同期回路で構成されています．

い状態であり，最新版の確認はできませんが，以前に筆者が確第一の目標が回路の小型化なので，パイプラインなどの複雑認したときはコア単体で 180slice 前後の回路規模だったと記憶なステート処理は排除し，可能な限りシングル・サイクルで処理を完了させる方針をとっています．加えてロジックを意識し

表 1 MR16 の設計コンセプト
1．Xilinx 社製 FPGA に最適化した専用デザインとするが移植性は確保
する¡すべて VerilogHDL 汎用書式で記述する¡汎用レジスタに DistributedRAM をフィットさせる¡FPGA の 4 入力 LUT という単位を意識して設計をする
2．できるだけ回路を簡素化して回路規模を小さく抑える¡バス幅をすべて 16 ビット長にそろえバス・サイズ変換を省略する¡ 8 ビット・メモリ・アクセス時のビット位置変換回路はコアに内蔵しない¡パイプラインなど複雑な構造を避けて極力シングル・サイクルで処理する
3．アセンブラでもストレスなく記述できる命令セットにする¡小規模 MCU によく見られる偏ったアーキテクチャを避ける¡16 本の汎用レジスタを持ち，ALU のソースとディスティネーションは，全汎用レジスタを組み合わせ可能にする¡32 ビットの加減算処理を安易にする¡一般的なベクタ方式の割り込みをサポートする
4．メモリとして FPGA 内蔵 BlockRAM の使用を前提とする
5．コード領域ができるだけ小さくなるように設計する¡8 ビット・イミディエートは 1 ワード命令で処理する¡1 ワード命令の条件付き相対ジャンプ命令をサポートする
6．C コンパイラを意識した命令セットにする¡ディスプレイメント付きメモリ・アクセス命令を実装する¡符号付き演算結果による一般的な条件判定を実装する¡スタック・レジスタへ定数の加算/減算命令を実装する

たインストラクション・マップの割り当てや算術命令ユニット，相対ジャンプ・アドレス加算器をスタック・ポインタの加減算やプログラム・カウンタ（PC）のインクリメントで共有するな
ど，回路の共有化にも重点を置いています．
当初は回路規模だけを念頭に設計したため，高速動作を期待していませんでした．それでも論理合成結果からクリティカル・パスを探し出し，LUT の階層をできるだけ浅くしていくことで速度最適化を行っています．最適化の結果は予想を上回るもので，メイン・ターゲットの一つである XC3S200-5FT256 に最小の実用回路を付加したデザインを論理合成した結果で，50MHz を超える動作速度を得ています．
回路規模の参考例として Xilinx 社製の各 FPGA の上に論理合成した結果を表 2 に示します．論理合成の結果はインプリメント時にも変動しますので，あくまでも参考値としてとらえてください．

● Xilinx 社製 FPGA への最適化と互換性
MR16 コアは Spartan3 に最適化した設計ですが，すべてVerilog-HDL 汎用言語で記述されており，論理合成ツールの最適化処理によって FPGA が持つ専用プリミティブへ自動的にフィットすることを期待しています．ターゲットが Spartan3 で

170 KEYWORD ―― 16 ビット CPU，RISC，Verilog-HDL，FPGA 向け，マクロ・アセンブラ

June 2007

June 2007

171

4ビット
MUX

OUTOUTOUT

I，N，V，Z，C
N，V，Z，C

ConditionSel

ReadData.B

OUT

各ユニットへ同期回路部

ステート/プレフィクス・レジスタIN

11ビット・レジスタ

8/16ビット・イミディエート

サイクル・セレクタへ

O

B

B

O

B

O
MOV/AND/XOR/OR

A
B

O

Address

WriteData

IntAck

ByteAccess

WriteEnableO

16ビット+4ビット
MUX

ALUセレクタ

D

B

A

C

O

16ビット論理演算ユニット

O

O

16ビット
MUX

アドレス・セレクタ

MLT/MLH

B

A

O

16ビット
MUX

16ビットx16ビット=32ビット乗算ユニット

A

B

O
ADD/ADC (SUB/SBC)

A

A

RET/POP

IACK

Reset

Inst/Prefetch

JSR/PUSH/LDM/STM/IACK2

IntVector

O

ライト・データ・セレクタ

STM/PUSH Rx

JSR/IACK2PUSH FLAG

16ビット算術演算ユニット
AO
サイクル ・セレクタ

論理回路

ResetVector

IF

irq

next̲pc

PCセレクタ

Jcc/JSR

16ビット
MUX

算術ソース・セレクタ

LDM/STM-0002hPOP/RET
PUSH/JSR+0002h-RB

SUB/SBC

16ビット Inverter[15..0]

Bcc/Inst/Prefetch

15ビット
MUX

RET/IACK2/RESET

4/11ビット・ディスプレイスメント

SRC

16ビット
MUX

ソース・
セレクタ

Register

R0〜R15(汎用レジスタ，スタック・レジスタ)

Address.B

WriteData.A ReadData.A

Address.A

ＰＣ
セレクタへ

IntReq15ビット+8ビット加算ユニット
ＰＣ相対アドレスBranchADD/ADC

条件デコーダデコーダ，セレクタ

PCホールド/インクリメント/
相対分岐セレクタ
8ビット MUX
PC（プログラム・カウンタ）
IACK/MEM+00H
rel̲pcInst/Prefetch
+01H
Bcc

IN

15ビット・レジスタフラグ・レジスタIN

5ビット・レジスタ

16ｘ16ビット非同期リード，
同期ライトDual Port RAM

インストラクション・デコーダ

IN

多段デコーダディスティネーション・
セレクタ

LDM LOAD

Inst

図 1 MR16 のブロック図

ReadData

IntVector

IntReqResetVector

ClockEnable

Clock

Reset