Jelly
FPGA向け MIPS-Iサブセット







2017/05/02 更新

重要なお知らせ

現在このページの更新は止まっており、最新情報はRyuzのブログの方にあります。

最新の開発バージョンは github(https://github.com/ryuz/jelly.git) の方にあります。

当初ソフトコアCPUコアの作成がメインでしたが、ZynqのようなハードコアCPU搭載環境も増えてきたので、周辺エンジン含めて少し異なった方向へ進化中です。



開発情報
 HOSの開発中次バージョンHOS-V4 Advanceにあわせて、FPGA向けに MIPS-I 命令のサブセットを実行できるプロセッサをVerilog 2001で開発中です。
 HOS-V4a にて、MMCカード(SDカード)のFATファイルシステムのマウントもできるようになり、シンプルなキャッシュも動き始め、そこそこ使えるレベルが見え始めてきました。
 どうもMIPS1から20年経過しているっぽいので、Ver1.08 でLWL,LWR,SWL,SWR命令も記述してみました。  将来的な展望として、Jelly単品での進化はもちろん、HOSのSMP実験やハードウェアアクセラレート(シリコンOS化)などのハードウェア方面への進化に応用できればと考えている次第です。

newlibをお使いの場合
newlib-1.17.0/newlib/libc/machine/mips/strlen.c
に、mips1 に非対応のコードがあり、Jellyでも動かないようです。
32-bit MIPSのインラインアセンブラでlbu $3,0($4)の直後にnopを埋めるだけで回避できます。
ココで見つけました。


ダウンロード

[最新版]

Jelly Ver. 1.10 2014-06-08

[過去のリリース]

Jelly Ver. 1.09 2010-05-30
Jelly Ver. 1.08 2010-04-06
Jelly Ver. 1.07 2009-11-24
Jelly Ver. 1.06 2009-11-21
Jelly Ver. 1.05 2009-11-12
Jelly Ver. 1.04 2009-11-11
Jelly Ver. 1.03 2009-11-10
Jelly Ver. 1.02 2009-11-09
Jelly Ver. 1.01 2009-11-04
Jelly Ver. 1.00 2009-05-05
Jelly 開発スナップショット 2009-02-05版
Jelly 開発スナップショット 2008-12-23版
Jelly 開発スナップショット 2008-12-12版
Jelly 開発スナップショット 2008-11-30版
Jelly 開発スナップショット 2008-11-29版
Jelly 開発スナップショット 2008-11-22版
Jelly 開発スナップショット 2008-11-16版
Jelly 開発スナップショット 2008-11-12版
Jelly 開発スナップショット 2008-11-09版
Jelly 開発スナップショット 2008-10-31版
Jelly 開発スナップショット 2008-10-29版


jellyの特徴
  • MIPS-Iライクな命令セットで、gcc でC言語開発が行える
  • キャッシュ機能
  • 密結合メモリ(TCM)機能
  • Verilog 2001 で書いている
  • DDR-SDRAM対応
  • μITRON4.0仕様 HOS-V4a 対応中
  • ICE拡張用のデバッグポートを備えている
  • ドキュメントが日本語(作者が英語わかんない)
  • 日本語で作者に応援メールが出せる(笑)

構造説明

大雑把なCPUコアの説明図です。

典型的な教科書どおり5段パイプラインのアーキテクチャで、コア部はハーバードアーキテクチャ(命令バスとデータバスが別)にしています。

また、内蔵でデバッグユニットも用意しており、外部からCPUコアを直接操作可能です。

フォワーディングも入っており、殆どの実行ユニットをEXステージに固めていますし、MIPS-Iではロード命令の次命令ではロードしたレジスタは利用禁止ですので、特にストルール要因はありません(なのでバスビジーなどでインターロックが必要なケースではプロセッサ全体をとめてしまい、機構をシンプル化しています)。

その他、FPGA的な工夫点としては、フォワーディングのマルチプレクサがFPGA的に苦手なので、特に32bit乗算でクリティカルパスとして現れます。そこで乗算命令の時でなく、結果の読み出し命令(mfhi, mflo)で乗算するようにして、見かけ上、乗算は1サイクルで実現できました(除算はさすがに32サイクルのインターロックがかかりますが)。

デバッグユニットのようなボトルネックを挟んで Spartan-3のスピードグレード-4で50MHzで動いていますのでまあまあといったところではないでしょうか?



次にCPUトップの説明図です。

CPUコアの外に、密結合メモリ(TCM)とキャッシュを搭載しています。TCMとキャッシュはオプションで切り離しも可能です。

FPGAの内蔵デュアルポートRAMを行かして、2つのポートを命令/データに割り当てているのでロス無くユニファイドキャッシュが実装できており、命令/データでのキャッシュコヒーレンシの問題も出ません。

密結合メモリ(TCM)もFPGAの内蔵デュアルポートRAMのおかげで、命令/データバスの両方からアクセスできます


各種バスにはOPENCORES.ORGさんのwishboneバスと互換性があるように作ったつもりです(単純なシングルアクセスしか使ってませんが)。


次に大雑把なシステムの説明図です。

今回のボードにはRS-232Cが2ポートあるのをいいことに、デバッグポートはUART経由で制御するようにしています。パソコン側はUSBシリアルなどを買ってきて、増設すればどうにでもなります。ひとまず、プログラムダウンロードやレジスタ制御、ハードウェアブレークなど、将来デバッガ機能を一通り作れる機能を準備しています。
また、非常にシンプルなものですがDDR-SDRAMの制御RTLも書いてみました。IOの遅延調整がボード個体差があると思われますので、流用したい方でうまく動かない方はucfファイルの遅延値を調整してみてください。今のところシングルアクセスのみです。CPUの50MHzに対し、DDR-SDRAMは100MHz駆動なのでクロック乗せかえ用のブリッジが入っています。

ペリフェラルバスには各種周辺回路をつないでいます。IRC(割り込みコントローラ)はITRON屋らしく、多重割り込みや優先度設定が豊富にできるように工夫しています。本当はITRONのAPIをそのまま被せたかったのですが、回路的に無謀なのでそれなりにソフトウェア任せなところもあります。おいおい充実させていきます。





開発環境について

ハードウェア環境

開発ボードにはメインとしてXilinxさんのSpartan-3e Starter Kitを使っています。今だとストロベリーリナックスさんのココとかで個人でも通販で入手可能なようです。

ソフトウェア環境

ザイリンクスさんの ISE WebPack を使っています(現在のバージョンは 11.3)。
C言語コンパイラは gcc のクロスコンパイラを cygwin 上で構築して使っています。swl,swr,lwl,lwrとかが使えないのでそこだけ気をつければ何とかなりそうです。
参考にさせていただいたページ




このページについて
このページに関するご意見などございましたらQZF06013@nifty.ne.jpまで気軽にお願いします。




トップに戻る