公開日:2025/02/22
title.png

33rd Season


#33-8 多コア化に挑戦(テトラ)

 Cmod A7ボード(FPGA)を使って、オリジナル16ビットCPUコアMoscoviumの開発を進めています。

 現在、1つのマイコン上に多数のCPUコアを集積する、多コア化をテーマに考察を重ねています。前回までに、必要な回路設計が終了しましたので、ポリコア版Moscoviumマイコンを組み上げてみましょう。

デザイン

 ポリコア版Moscoviumマイコンを組み立てるのに必要な、密結合メモリコントローラTCMC16バス権調停コントローラBUSA716ポリコア制御POLYC144ユニット等を含むデザインは、GitHubで提供しています。以下バナーよりアクセスしてください。

btn_moscovium.png

 デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。

 以下、実際にポリコア版Moscoviumマイコンをコンパイル(論理合成・配置配線)してみたいと思います。

コンパイル(6コア)

 まずは、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)起因でコンパイルできない事もあるとは、盲点でした。

コンパイル(10コア)

 最初の検討段階では、Moscovium-BSコアだと論理規模(LUT数)的に8コア前後が限界なのですが、「Tennessineなら14コア行けるか?」と、目論んでいました。しかし、そもそも、の「Vivado異常終了」ですから、14コアなんて、無理だよね?と、ダメ元で14コアのコンパイルを強行して見ました。

 結果は、やっぱりダメで、Vivadoが異常終了してしまいます。コア数を14コア → 12コア → 10コアと減らしながら、試して行って、漸く10コアでコンパイルが通りました。型名をTSOC117PD5408としてあります。
 以下に、その時の結果をまとめます。

  コンパイル結果:

 LUT数もRAMマクロ数も上の通りですので、まだまだ論理規模的には十分余裕があります。それにもかかわらず、Vivado起因でコンパイルできないのは、やっぱり得心できません。

 設計上、論理規模的にはTennessine×14コアをギリギリ実装可能だと考えられます。Vivadoの不能を何とか回避できれば実装可能なのですが、まったくVivadoには「がっかり」です。これまでVivadoの動作は安定しており、「さすがは老舗のFPGAメーカ」と、安心しきっていただけに、幻滅です。

コンパイル(4コア)

 小さいけど少し使い難い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−_−)┌。

Blocklyの拡張

 ポリコア版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の不能が原因ですからぁ〜。残念!


btn_arduino.png

btn_prev.png btn_next.png

home