Cmod A7ボード(FPGA)を使って、オリジナル16ビットCPUコアMoscoviumの開発を進めています。
現在、1つのマイコン上に多数のCPUコアを集積する、多コア化をテーマに考察を重ねています。前回までに、必要な回路設計が終了しましたので、ポリコア版Moscoviumマイコンを組み上げてみましょう。
ポリコア版Moscoviumマイコンを組み立てるのに必要な、密結合メモリコントローラTCMC16、バス権調停コントローラBUSA716、ポリコア制御POLYC144ユニット等を含むデザインは、GitHubで提供しています。以下バナーよりアクセスしてください。
デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。
以下、実際にポリコア版Moscoviumマイコンをコンパイル(論理合成・配置配線)してみたいと思います。
まずは、Moscovium-BSコアでポリコア版を作成して見ました。特徴としては以下の通りです。
コンパイルオプションは、以下の通りです。
コンパイルオプション:
`define MCOC_CORE_MCBS
//`define MCVM_COPR_NOMUL
//`define MCVM_COPR_NODIV
`define MCVM_COPR_NOFPU
`define MCOC_POLY_6
`define MCOC_ROM_16K
Vivadoでコンパイル(論理合成・配置配線)して見ました。
コンパイル結果:
結果、論理合成までは終了したのですが、配置配線の途中でVivadoが異常終了してしまいました。残っていたログを漁って見たところ、以下の様なメッセージが残っていました。
Abnormal program termination (EXCEPTION_ACCESS_VIOLATION)
ちなみに、今回使用したVivadoのバージョンは、2024.02です。
「エラー終了」ならまだしも、「異常終了」です。
その他のログも眺めて見たところ、電力最適化ステージ⚡でコアダンプして終了している模様です。論理規模(LUT数やRAMマクロ数)の上限さえクリアできればFPGAに焼き付けられるもの、と思っていたのですが、ツール(Vivado)起因でコンパイルできない事もあるとは、盲点でした。
最初の検討段階では、Moscovium-BSコアだと論理規模(LUT数)的に8コア前後が限界なのですが、「Tennessineなら14コア行けるか?」と、目論んでいました。しかし、そもそも、の「Vivado異常終了」ですから、14コアなんて、無理だよね?と、ダメ元で14コアのコンパイルを強行して見ました。
結果は、やっぱりダメで、Vivadoが異常終了してしまいます。コア数を14コア → 12コア → 10コアと減らしながら、試して行って、漸く10コアでコンパイルが通りました。型名をTSOC117PD5408としてあります。
以下に、その時の結果をまとめます。
コンパイル結果:
LUT数もRAMマクロ数も上の通りですので、まだまだ論理規模的には十分余裕があります。それにもかかわらず、Vivado起因でコンパイルできないのは、やっぱり得心できません。
設計上、論理規模的にはTennessine×14コアをギリギリ実装可能だと考えられます。Vivadoの不能を何とか回避できれば実装可能なのですが、まったくVivadoには「がっかり」です。これまでVivadoの動作は安定しており、「さすがは老舗のFPGAメーカ」と、安心しきっていただけに、幻滅です。
小さいけど少し使い難いTennessineコアではなく、Moscovium-BSコアで、Blockly for Moscoviumを使った開発に耐え得るポリコア版マイコンを1個作っておきたいと思います。Moscovium-BSコアを使ってコア数を4コアに減らし、代わりにH-FPUを搭載して性能向上を図ってみます。
型名はMBOC115PT6608と、なります(型名規則はこちら)。コンパイル結果を以下に示します。
コンパイル結果:
Vivadoが異常終了した、こちらのデザインからCPUコア数を4コアに減らしたことで、異常終了する要因を回避できた様です。
ROM容量も16Kバイト確保できたので、Blockly for Moscoviumによるプログラミングにも耐え得る余力があります。しかも、整数の乗・除算に加え、浮動小数演算まで可能な4コアなので、十分実用に耐え得るマイコンです。
少なくとも4コアのMoscovium-BSは、Cmod A7ボード(FPGA)に書き込んで使えそうで良かった。でも、欲を言えば6コアくらいは確保しておきたかった……。論理規模的(LUT数)には、6コア実装可能なのだけど┐(1−_−)┌。
ポリコア版Moscoviumマイコンへ対応するため、Blockly for Moscovium開発環境を拡張しておきます。
改定内容:
Blockly for Moscovium開発環境の構築については、こちらの記事をご参照ください。
今回拡張したBlockly.XML→Moscovium.ASM変換スクリプトは、こちらからダウンロードしてください。
以下にシミュレーション用のプログラムをリンクしておきます。Blockly for MoscoviumのXMLタブに貼り付けて、ご利用ください。
実験用プログラム:test_task_poly.xml
※ブラウザによっては、XMLファイルをレンダリングして表示してしまうので、「右クリック ⇒ リンク先を保存」などしてください。
Blockly.XML→Moscovium.ASM変換して、シミュレーションを実行してみましょう。上のプログラムはシミュレーション用ですので、実際にCmod A7ボードへ書き込んでも、これと言って面白いことは、ございませんm(1__)m。……「OK:」で始まるメッセージがシリアルモニタに送信されてきて終了です。
実験サンプル:シミュレーション結果ログ
OK: CPU2: r6=0x4000, sp=0x4ffc
OK: CPU4: r6=0x4000, sp=0x4ff6
OK: CPU3: r6=0x4000, sp=0x4ff6
OK: CPU1: r6=0x4000, sp=0x4ffe
OK: NCPU=4
Test Pass
CPI: 5472/ 4327( 0)= 1264/1000
finish: 238720 ns
追加した変換オプション@stk_iram@が機能していることを確かめるため、変数領域の先頭アドレスを保持する汎用レジスタr6値と、スタックポインタsp値を、CPU毎に表示しています。変数領域、スタック領域共、密結合メモリ(命令RAM、アドレス範囲0x4000〜0x4fff)に割り当たっていることが確認できました。
異なるCPU間で同じアドレス領域に割り当たっていますが、密結合メモリ空間であり、CPU毎に専用のRAMへアクセスするため、誤動作の恐れはありません。
CPU毎にメッセージを表示するのにuart printlnブロックを使っていますが、これは共有リソースであるため、ポリコアセマフォを取得したCPUだけがuart printlnブロックを使用するようなプログラムに組んであります。また、セマフォが取得できると割り込みが発生してtask IRQPブロックが実行されていることも確認できました。
何気にちゃんと、「追加・新設した機能をすべて使っていますよ」って事です。簡単なプログラムなので、ポリコア版プログラミングの見本としてもご活用ください。
ツール(Vivado)起因とは言え、結局、実用的に使用可能なのが普通に4コア(tetra-core)では、PCやスマホのMPUと変わらないなあ……。Tennessineの10コア(deca-core)がコンパイルできたので、それは成果だったかな?筆者の技術力要因では無いので、そこだけ、お間違え無き様。Vivadoの不能が原因ですからぁ〜。残念!