* OSECPU-VMをFPGAに移植しよう by [[hikalium]], 2017-04-17 ** 関連ページ - 仕様まとめ -- https://github.com/osecpu/spec/blob/master/f0/index.md - 開発ブログ -- http://hikalium.hatenablog.jp/ ** 日次ログ ** 2017-05-22 レビューありがとうございました。 *** 現在の状況 形式的記述を現在追加中。 ブロックダイアグラムを追加した。githubのspec/f0のindex.mdを参照。 ブロックダイアグラムを追加した。 https://github.com/osecpu/spec/blob/master/f0/index.md メモリアクセス時の各テーブル・レジスタファイル間のデータフローについても別途図示した。 データのロード・ストアについて 先週までは書き込みも各データ型に合わせた幅で行う予定だったが、それだと32bit以外のサイズのときに2回のメモリアクセスが必要になるため、避けたいと思った。 ということで結局、実際のメモリへの読み書きは32bit単位でのみ行うことになった。 32bit未満のデータに関しては、ローダで32bit幅に拡張する。ただし、データ幅の検査と、ポインタとメモリのデータ・タイプ一致検査は行う。 ただし、読み込みに関しては、ローダでの変換を支援するため、32bit単位でない読み込みをハードウエアで支援する。 LMEMCNVという命令を新設し、この目的に使用する。この命令は、設定されたデータタイプでメモリ領域がパックされていると考えて、アクセスしてくれる。レジスタ代入時に自動的に符号拡張する。 この回路自体は前回までにすでに設計済みなので問題はない。 *** 次回までの目標 まずは形式的記述を完全にする。そして実装にとりかかる。 実装の流れとしては、最初は単純な32bitCPUを構成して、それにチェック部分・メモリアクセス支援部分を付け足す形になる。 次回までに各コンポーネントをVerilogで記述してFPGA上に書き込んでみて、意図したとおり動作するかを確認する。 ALUの遅延がどうなるのかわかっていないので(特に除算命令が不穏)、次々回までにそれを試して調べてみる。 こういう場合は各演算の種類に合わせてウェイトを可変にするというので問題ないか? ** 2017-05-15 *** GW前の進捗:命令セットをまとめたページを作成した。 - https://github.com/osecpu/spec/blob/master/f0/opcode.md *** GW期間中の進捗:RTLレベル設計(途中) - RTLレベルの設計を進めている。これを通して、いくつか命令セットの仕様を変更した。 -- 整数レジスタ:64bit -> 32bit --- メモリ(外部・内部とも)のデータ幅を32bitにしたかった。 --- もし64bitのデータ取得を許してしまうと、2回フェッチしなければならず複雑になるため避けた。 -- 同様の理由で、ポインタのデータ型も32の約数のbit数に制限することにした。 -- -> これらの処理を行うデータデコーダの設計は終わっている。 -- https://github.com/osecpu/spec/raw/master/f0/schem/datadecoder.pdf - 各コンポーネントの仕様も固まってきたが、 - 転送表の作成で時間がかかっている。SoCの授業で習ったような方法で転送表をつくれば大丈夫か?もっとよい方法がある? - まだ初心者でわからないところも多いので、並行してVerilogでの実装を始めつつ仕様を詰めていくことにしたい。 - IOの件 メモリマップドIOにしようとしている。ただ、メモリマップドIOをどのように記述すればいいのかわかっていないので調査する。 *** 報告事項 - セキュリティ・キャンプで使うFPGAボードが決定した -- Cyclone IV EP4CE -- https://www.aliexpress.com/item/FPGA-development-board-ALTERA-IV-EP4CE-four-generations-NIOSII-send-send-remote-control-to-send-video/32657715247.html -- ボードのドキュメントが中国語のため、載っているデバイスについては要調査(デバイスリストとピン配置のファイルは持っている) ** 2017-05-10 - 命令セットの設計を多少見直した。RTLレベルの設計に差し掛かっている。 -- レジスタ幅を32bitにした。メモリ幅と揃えたかったため。 ** 2017-04-24 *** ここまでの進捗 - CPU向け命令セットの設計はほとんどできた。 -- ラベルのある場所にしか飛べず、ポインタの型チェックと範囲チェックが強制されるという部分をメインの実装ポイントとする。 --- 範囲チェックはハードウエア的に行う予定。 -- CPUの実行が開始すると、ROMに書かれたローダプログラムが起動し、外部メモリからOSECPUのコード(VM向けのもの)を読み込んで、まずラベルのチェックをする。 --- 読み込んだラベルに相当するメモリ領域を作成するバイナリをまず生成する。 --- その後、プログラム本体とデータ領域を、CPU向けに変換しつつ読み込む。 -- 直接メモリ番地を操作できる命令は、ローダしか実行できないのでセキュアである。 -- プログラムの終端は、終端命令をバックエンドに追加してそれにより判定する。 -- 変換が終了したら、変換後のバイナリにジャンプする。 - 開発環境の構築も終わった -- Quartus Prime Liteを使う(旧Quartus II WebPack) -- 自分のコンピューターは非力なので、コンパイルサーバーを家に立てた。 - ブロック図を書き始めた。 *** これからすること - ブロック図を完成させる。 - 外部RAMをFPGAから操作する方法を調査・試してみる。 - シリアル通信は絶対に実装するので、FPGAからどのように操作するのか、命令セットからどのように操作するかを調査して試す。 - ラベルテーブルの容量をどうするか、FPGAの内部メモリ容量との兼ね合いで決める。 -- 現在は4096エントリ分の予定。 ** 2017-04-17 このページを作成 CPUの仕様をどのようにするか考えているところ。