デコーダデコーダは、RAMモジュールのインストラクションレジスタ(64ビット)と、ステートを入力とする巨大な組み合わせ回路になります。サブセット仕様と言えど、アドレシングモードも含むとマイクロコードは、300位あります。あまりに命令が多いので書いていて厭になります。(16ビットから32ビットへの拡張を担当した人に同情します。)BCD演算とLONGの24ビット相対アドレシングは、サブセット仕様ということで省いています。この巨大なデコードと実行を1ステートでやってしまうというのが、当初のプランです。遅延対策は後で考えることにしてとりあえず進みましょう。アーキテクチャでもExcelは書いたのですが、今回は、実際にVerilog上で記述するために、Verilog形式のフォーマットに直す必要があります。慣れないExcelでこの作業をやってみました。Excelでマイクロコードを書く方法は、米国で仕事をした際、エンジニアがやっていた方法を真似たものです。マイクロコードアセンブラです。Compiler等、先進的なソフトは全て米国人によるものですね。)ほぼデバッグが終わったEXCELコードです。下記はVerilogに直したデコーダになります。筆者が今まで書いたデコーダのなかで一番でかいです。考えてみるとH8300Hは、(演算ビット幅で考える)と32ビットマイコンです。H8の下位機種は、16ビットなので、そんなに複雑なことはないのですが、BYTE,WORD,LONGがあるために命令数が多くなりデコーダにしわ寄せが来てしまいました。16ビットCPUの方がデコーダは簡易なので速度的に上げやすいと思います。(余談ですが、昔32ビットスーパミニコンなんてのがありました。当時は、16ビットのCPUでラック入りのミニコンを作っていたのですが、レジスタ間演算が300ns(300psではありません。)で堂々とカタログスペックに載っていました。)繰り返しますがデコーダは組み合わせ回路です。下で、bus_stateは、RESET,割り込み、実行状態等の大局的ステート、irwordは、64ビットインストラクションレジスタ、STは実行ステートです。これを入力として一意に制御信号(マイクロコード52ビット)は決まります。デコーダモジュールからのoutput信号は、各モジュールに行き状態を制御することになります。マイクロコードをそのままマシンコードにすればVLIWCPU?になります。割り込みを含む全ての実行ステート数は最大でも5ステートで、メモリReadを含まない命令は2ステート(Fetch,Decode/Excute)で実行します。オリジナルでは、最大で12ステート(同じ命令で比較)かかる命令もあります。FPGAの任意バス幅が効いています。割り込みは、固定Vectorです。コーディングではtaskを使って書いてみました。Quartasでは問題なく論理合成できました。デコーダの負担を軽くするために、8ステート1ホットコード(ST)にしてみました。(乗除算命令を載せた時を考えて少し多めにしておきました。)case文では、?(ドントケア)は使えません。casezもしくはcasexを使います。endendmodule。