コンピュータアーキテクチャにおいて、制御装置(CU)は、コンピュータの中央処理装置(CPU)の構成要素であり、プロセッサの動作を制御する役割を担います。CUは通常、バイナリデコーダを用いて、符号化された命令をタイミング信号や制御信号に変換し、他のユニット(メモリ、演算論理装置、入出力装置など)の動作を制御します。
ほとんどのコンピュータ資源はCUによって管理されます。CUはCPUと他のデバイス間のデータの流れを制御します。ジョン・フォン・ノイマンは、フォン・ノイマン・アーキテクチャの一部として制御ユニットを組み込みました。[ 1 ]現代のコンピュータ設計では、制御ユニットは通常CPUの内部部分であり、その全体的な役割と動作は導入以来変わっていません。[ 2 ]
最もシンプルなコンピュータは、マルチサイクル・マイクロアーキテクチャを採用している。これらは初期の設計であり、機械を操作する組み込みシステムなど、ごく小型のコンピュータでは現在でも広く用いられている。
コンピュータでは、制御装置は命令サイクルを順次実行します。このサイクルは、命令のフェッチ、オペランドのフェッチ、命令のデコード、命令の実行、そして結果のメモリへの書き込みから構成されます。次の命令が制御装置に格納されると、制御装置の動作が変更され、命令が正しく完了します。つまり、命令のビットが制御装置を直接制御し、制御装置がコンピュータ全体を制御するのです。
制御装置は、制御装置のロジックに実行すべき手順を指示するためのバイナリカウンタを備えていてもよい。
マルチサイクル制御ユニットは通常、方形波タイミングクロックの立ち上がりエッジと立ち下がりエッジの両方を利用します。タイミングクロックの各エッジで演算ステップを実行するため、4ステップの演算が2クロックサイクルで完了します。これにより、同じロジックファミリを使用した場合、コンピュータの速度が2倍になります。
多くのコンピュータには、2種類の予期せぬイベントが発生します。割り込みは、何らかの入力または出力が正しく動作するためにソフトウェアによる処理を必要とする場合に発生します。例外は、コンピュータの動作によって発生します。重要な違いの一つは、割り込みのタイミングを予測できないことです。もう一つの違いは、一部の例外(例えば、メモリ不足例外)は、再開が必要な命令によって発生する可能性があることです。
制御ユニットは、割り込みを処理するために、大きく分けて2つの方法のいずれかで設計できます。迅速な応答が最優先される場合、制御ユニットは割り込み処理のために処理を中断するように設計されています。この場合、処理中の作業は、最後に完了した命令の後に再開されます。コンピュータを非常に安価で、非常にシンプルで、非常に信頼性が高く、あるいはより多くの作業をこなせるようにしたい場合は、制御ユニットは割り込み処理の前に処理中の作業を完了させます。処理を完了させる方法は、最後に完了した命令を記録するためのレジスタを必要としないため、コストがかかりません。また、状態数が最も少ないため、シンプルで信頼性が高く、無駄な作業量も最小限に抑えられます。
例外処理は、非常に単純なコンピュータにおける割り込みのように動作するように設定できます。仮想メモリが必要な場合、メモリが利用できない例外が発生すると、失敗した命令を再試行する必要があります。
マルチサイクルコンピュータは、より多くのサイクルを使用するのが一般的です。プログラムカウンタを再ロードする必要があるため、条件分岐に時間がかかる場合があります。また、プロセスによって乗算や除算命令を実行する場合もあり、例えばバイナリ長乗算や除算などが挙げられます。非常に小型のコンピュータでは、一度に1ビットまたは数ビットずつ算術演算を行う場合があります。また、多くのステップを要する非常に複雑な命令を持つコンピュータもあります。
多くの中規模コンピュータは命令をパイプライン処理する。この設計は、その経済性と速度の点で広く普及している。
パイプライン型コンピュータでは、命令がコンピュータ内を流れていきます。この設計は複数のステージから構成されています。例えば、フォン・ノイマン回路の各ステップごとに1つのステージを持つといった具合です。パイプライン型コンピュータでは、通常、各ステージの後に「パイプラインレジスタ」が設けられています。これらのレジスタは、あるステージで計算されたビットを格納し、次のステージの論理ゲートがそのビットを使って次のステップを実行できるようにします。
偶数段は方形波クロックの一方のエッジで動作し、奇数段はもう一方のエッジで動作するのが一般的です。これにより、シングルエッジ設計に比べてコンピュータの処理速度が2倍になります。
パイプライン型コンピュータでは、制御ユニットがプログラムの指示に従って処理の流れを開始、継続、停止させます。命令データは通常、パイプラインレジスタを介して各ステージに渡され、各ステージにはそれぞれ独立した制御ロジックが存在します。制御ユニットはまた、各ステージの命令が他のステージの命令の動作を妨げないようにします。例えば、2つのステージが同じデータを使用する必要がある場合、制御ロジックはそれらの使用が正しい順序で行われるようにします。
パイプラインコンピュータが効率的に動作している場合、各ステージに1つの命令があります。そして、それらの命令すべてを同時に処理します。クロックの1サイクルあたり約1つの命令を完了できます。プログラムが判断を下し、別の命令シーケンスに切り替える場合、パイプラインは処理中のデータを破棄して再開しなければならないことがあります。これを「ストール」と呼びます。2つの命令が干渉する可能性がある場合、制御ユニットは前の命令が完了するまで後の命令の処理を停止しなければならないことがあります。パイプラインの一部が命令を処理していないため、これを「パイプラインバブル」と呼びます。パイプラインバブルは、2つの命令が同じレジスタを操作する場合に発生する可能性があります。
割り込みや予期せぬ例外もパイプラインを停止させます。パイプライン方式のコンピュータが割り込みのために処理を中断した場合、マルチサイクル方式のコンピュータよりも多くの処理が失われます。予測可能な例外は停止させる必要はありません。たとえば、例外命令を使用してオペレーティングシステムに入る場合、停止は発生しません。
電子ロジックの処理速度が同じ場合、パイプライン方式のコンピュータはマルチサイクル方式のコンピュータよりも毎秒実行できる命令数が多い。また、電子ロジックの最大速度は固定されているものの、パイプライン方式のコンピュータはパイプラインの段数を変えることで高速化または低速化が可能である。段数が増えるほど各段の処理量は少なくなり、論理ゲートによる遅延も少なくなる。
パイプライン方式のコンピュータは、マルチサイクル方式やアウトオブオーダー方式のコンピュータに比べて、1秒あたりの命令あたりの論理ゲート数が少ない場合が多い。これは、平均的なステージがマルチサイクル方式のコンピュータよりも複雑ではないためである。アウトオブオーダー方式のコンピュータは、通常、どの時点においても大量のアイドル状態の論理回路を抱えている。同様の計算結果から、パイプライン方式のコンピュータは1命令あたりのエネルギー消費量が少ないことが一般的に示される。
しかし、パイプライン処理方式のコンピュータは、同等のマルチサイクル方式のコンピュータに比べて、一般的に複雑で高価です。通常、より多くの論理ゲート、レジスタ、そしてより複雑な制御ユニットを備えています。同様に、総エネルギー消費量は多くなりますが、命令あたりのエネルギー消費量は少なくなります。アウトオブオーダー方式のCPUは、一度に複数の命令を実行できるため、通常、1秒あたりの命令実行数が多くなります。
制御ユニットは、パイプラインを常に満杯に保ち、停止を回避するために多くの方法を使用します。たとえば、単純な制御ユニットでも、番号の小さい前の命令への逆方向分岐はループであり、繰り返されると想定できます。[ 3 ]そのため、この設計の制御ユニットは常に逆方向分岐パスでパイプラインを満たします。コンパイラが分岐の最も頻繁に実行される方向を検出できる場合、コンパイラは最も頻繁に実行される分岐が優先される分岐方向となるように命令を生成できます。同様に、制御ユニットはコンパイラからヒントを得る場合があります。一部のコンピュータには、分岐の方向に関するコンパイラからのヒントをエンコードできる命令があります。[ 4 ]
一部の制御ユニットは分岐予測を行います。制御ユニットは、分岐命令のアドレスによってエンコードされた最近の分岐の電子リストを保持します。[ 3 ]このリストには、各分岐に対して、最近実行された方向を記憶するための数ビットが含まれています。
一部の制御ユニットは投機的実行を行うことができ、その場合、コンピュータは2つ以上のパイプラインを持ち、分岐の両方向を計算した後、使用されない方向の計算結果を破棄する。
非常に高速なコンピュータはメモリをキャッシュするため、メモリからの結果が予期せぬタイミングで利用可能になることがあります。つまり、限られた量のメモリデータを非常に高速なキャッシュメモリにコピーするのです。CPUはキャッシュメモリの非常に高速な速度で処理できるように設計する必要があります。そのため、CPUがメインメモリに直接アクセスする必要がある場合、処理が停止する可能性があります。最新のPCでは、メインメモリはキャッシュメモリよりも最大300倍も低速です。
この問題を解決するために、データが利用可能になった時点で処理するアウトオブオーダーCPUと制御ユニットが開発された。(次項参照)
しかし、すべての計算が完了しても、CPUがメインメモリを待って停止している場合はどうでしょうか。その場合、制御ユニットは、スレッドがアイドル状態だった間にデータがフェッチされた別の実行スレッドに切り替えることができます。スレッドは、独自のプログラムカウンタ、命令ストリーム、および独立したレジスタセットを持ちます。設計者は、現在のメモリ技術とコンピュータの種類に応じてスレッドの数を変更します。PCやスマートフォンなどの一般的なコンピュータは、通常、手頃な価格のメモリシステムで処理を効率的に行うのに十分な数のスレッドを持つ制御ユニットを備えています。データベースコンピュータは、はるかに大きなメモリを効率的に処理するために、通常、その約2倍のスレッドを持ちます。グラフィック処理ユニット(GPU)は、繰り返しグラフィック計算を行う数百または数千の実行ユニットを備えているため、通常、数百または数千のスレッドを持ちます。
制御ユニットがスレッドをサポートする場合、ソフトウェアもスレッドを処理できるように設計する必要があります。PCやスマートフォンなどの汎用CPUでは、スレッドは通常、通常のタイムスライス処理と非常によく似た形で動作します。せいぜい、オペレーティングシステムがスレッドの存在を認識する必要がある程度です。GPUでは、スレッドスケジューリングは通常、アプリケーションソフトウェアから隠蔽することはできず、多くの場合、専用のサブルーチンライブラリによって制御されます。
制御装置は、実行可能な処理を完了するように設計できます。複数の命令を同時に実行できる場合、制御装置はそれらを適切に配置します。そのため、最速のコンピュータは、オペランドや命令の実行先が利用可能になるタイミングに応じて、命令を多少異なる順序で処理できます。ほとんどのスーパーコンピュータと多くのPCのCPUはこの方法を採用しています。このタイプの制御装置の具体的な構成は、コンピュータの中で最も処理速度の遅い部分に依存します。
計算処理が最も遅い場合、命令はメモリから「発行ユニット」と呼ばれる電子部品へと送られます。発行ユニットは、命令のオペランドと実行ユニットが利用可能になるまで命令を保持します。その後、命令とそのオペランドは実行ユニットに「発行」されます。実行ユニットは命令を実行し、その結果得られたデータはメモリまたはレジスタに書き戻されるデータキューに移動されます。コンピュータに複数の実行ユニットがある場合、通常は1クロックサイクルで複数の命令を実行できます。
専用の実行ユニットを持つことは一般的です。例えば、低価格のコンピュータには浮動小数点演算ユニットが1つしか搭載されていない場合があります。これは、浮動小数点演算ユニットが高価であるためです。一方、同じコンピュータでも、整数演算ユニットは複数搭載されている場合があります。これは、整数演算ユニットが比較的安価であり、命令の大部分を実行できるためです。
命令発行のための制御ユニットの一種は、命令を発行できるタイミングを検出する電子ロジックのアレイ、つまり「スコアボード」[ 5 ]を使用します。アレイの「高さ」は実行ユニットの数であり、「長さ」と「幅」はそれぞれオペランドのソースの数です。すべての項目が集まると、オペランドと実行ユニットからの信号が交差します。この交点のロジックは命令が実行可能であることを検出し、命令は空いている実行ユニットに「発行」されます。別のスタイルの命令発行制御ユニットは、命令のハードウェアキューを並べ替えるトマスロアルゴリズムを実装しています。ある意味では、どちらのスタイルもキューを利用しています。スコアボードは命令のキューをエンコードして並べ替える別の方法であり、一部の設計者はそれをキューテーブルと呼んでいます。[ 6 ] [ 7 ]
追加のロジックにより、スコアボードは実行順序の変更、レジスタ名の変更、正確な例外と割り込みをコンパクトに組み合わせることができます。さらに、トマスロアルゴリズムで使用される電力消費の激しい複雑なコンテンツアドレス指定可能なメモリを使用せずにこれを実現できます。[ 6 ] [ 7 ]
実行が結果の書き込みよりも遅い場合、メモリ書き戻しキューには常に空きエントリがあります。しかし、メモリへの書き込みが遅い場合はどうでしょうか?あるいは、宛先レジスタがまだ発行されていない「以前の」命令で使用される場合はどうでしょうか?その場合、命令の書き戻しステップをスケジュールする必要があるかもしれません。これは、命令の「リタイア」と呼ばれることもあります。この場合、実行ユニットのバックエンドにスケジューリングロジックが必要です。これは、結果を取得するレジスタまたはメモリへのアクセスをスケジュールします。[ 6 ] [ 7 ]
発行ロジックにメモリやレジスタへのアクセスを含めることで、発行スコアボードやトマスロキューに引退ロジックを組み込むこともできます。[ 6 ] [ 7 ]
アウトオブオーダーコントローラでは、割り込みを処理するために特別な設計機能が必要です。複数の命令が進行中の場合、命令ストリームのどこで割り込みが発生するかは明確ではありません。入力割り込みと出力割り込みについては、ほぼどのような解決策でも機能します。しかし、コンピュータが仮想メモリを持つ場合、メモリへのアクセスが失敗したことを示すために割り込みが発生します。このメモリへのアクセスは、正確な命令と正確なプロセッサの状態に関連付けられている必要があり、プロセッサの状態を割り込みによって保存および復元できるようにする必要があります。一般的な解決策は、メモリへのアクセスが完了するまでレジスタのコピーを保持することです。[ 6 ] [ 7 ]
また、アウトオブオーダーCPUは、クロックサイクルごとに複数の命令を完了でき、通常はさまざまな段階で多くの命令が進行しているため、分岐によるストールの問題がさらに多くなります。そのため、これらの制御ユニットは、パイプラインプロセッサで使用されるすべてのソリューションを使用する可能性があります。[ 8 ]
一部のコンピュータは、個々の命令をより単純な命令のシーケンスに変換します。この利点は、アウトオブオーダー方式のコンピュータは、複雑な複数ステップの命令を処理しながらも、ロジックの大部分を簡素化できることです。Pentium Pro以降のx86 Intel CPUは、複雑なCISC x86命令を、よりRISCライクな内部マイクロオペレーションに変換します。
これらの方式では、制御ユニットの「前面」が命令の変換を管理します。オペランドは変換されません。制御ユニットの「背面」はアウトオブオーダーCPUであり、マイクロオペレーションとオペランドを実行ユニットとデータパスに発行します。
現代の多くのコンピュータには、電力消費を最小限に抑えるための制御機能が備わっています。携帯電話などのバッテリー駆動コンピュータでは、バッテリー寿命が長くなるという利点があります。商用電源を使用するコンピュータでは、電力、冷却、または騒音のコストを削減することがその利点となります。
現代のコンピュータのほとんどはCMOSロジックを使用しています。CMOSは、状態変化による「アクティブ電力」と、意図しないリーク電流という2つの一般的な方法で電力を浪費します。コンピュータのアクティブ電力は、制御信号をオフにすることで削減できます。リーク電流は、電気的圧力(電圧)を下げる、トランジスタの空乏層を大きくする、またはロジックを完全にオフにすることで削減できます。
アクティブ電力は、ロジックに格納されているデータに影響がないため、削減しやすい。一般的な方法は、CPUのクロック周波数を下げることである。ほとんどのコンピュータシステムはこの方法を採用している。クロック周波数の変更による副作用を避けるため、移行中はCPUがアイドル状態になるのが一般的である。
ほとんどのコンピュータには「停止」命令も備わっています。これは、割り込みコードが確実にタイミングを保てるように、割り込み以外のコードを停止させるために考案されました。しかし、設計者たちはすぐに、停止命令はCPUのクロックを完全にオフにし、CPUの消費電力をゼロにする絶好の機会でもあることに気づきました。割り込みコントローラはクロックを必要とする場合もありますが、通常はCPUよりもはるかに少ない電力しか消費しません。
これらの方法は比較的簡単に設計でき、非常に一般的になったため、商業的な利点のために他の方法が考案されました。多くの最新の低消費電力CMOS CPUは、必要な命令に応じて、専用の実行ユニットとバスインターフェースを停止および開始します。一部のコンピュータ[ 9 ]は、各命令が正確に必要なロジックのみを使用するように、転送トリガー型マルチプレクサを使用するようにCPUのマイクロアーキテクチャを構成しています。
一般的な方法の 1 つは、負荷を多数の CPU に分散し、負荷が減少するにつれて使用されていない CPU をオフにすることです。オペレーティングシステムのタスク切り替えロジックは、CPU のデータをメモリに保存します。場合によっては、[ 10 ] CPU の 1 つは、論理ゲートの数が少なく、よりシンプルで小さいものになります。そのため、リーク電流が少なく、最後にオフになり、最初にオンになります。また、特別な低電力機能が必要な唯一の CPU になります。同様の方法は、電源システムを管理する補助組み込み CPU を通常備えているほとんどの PC で使用されています。ただし、PC では、ソフトウェアは通常、オペレーティングシステムではなく BIOS にあります。
理論的には、クロック速度の低いコンピュータは、電源電圧を下げることでリーク電流を低減できる。しかし、これはコンピュータの信頼性に様々な影響を与えるため、技術開発にはコストがかかり、PCや携帯電話といった比較的高価なコンピュータ以外では一般的ではない。
非常に低リークのトランジスタを使用する設計もありますが、通常はコストが増加します。トランジスタの空乏層を大きくすることでリークを減らすことができますが、これによりトランジスタが大きくなり、結果として動作速度とコストの両方が低下します。一部のベンダーは、アナログ回路用に一部のプロセスで提供される大型トランジスタから低リークのロジックを構築することで、ICの特定の部分でこの技術を使用しています。一部のプロセスでは、シリコン表面上に「フィンFET」と呼ばれるトランジスタを配置しますが、これらのプロセスは工程が多いため、コストが高くなります。特殊なトランジスタドーピング材料(例えばハフニウム)もリークを低減できますが、これにより処理工程が増え、コストが高くなります。一部の半導体はシリコンよりもバンドギャップが大きくなっています。しかし、これらの材料とプロセスは現在(2020年)シリコンよりも高価です。
データ漏洩の管理はより困難です。なぜなら、ロジックを停止する前に、その中のデータを何らかの低漏洩ストレージに移動する必要があるからです。
一部のCPU [ 11 ]は、高速でリーク電流が大きい記憶セルと、低速で大容量(高価)のリーク電流が小さい記憶セルを結合する特殊なタイプのフリップフロップ(ビットを記憶するため)を使用しています。これら2つのセルは電源が分離されています。CPUが省電力モードに入ると(割り込みを待つ停止など)、データはリーク電流が小さいセルに転送され、他のセルはオフになります。CPUがリーク電流が小さいモードから抜けると(割り込みなど)、プロセスは逆になります。
旧式の設計では、CPUの状態をメモリやディスクにコピーしていたが、場合によっては専用ソフトウェアを使用していた。非常にシンプルな組み込みシステムでは、単に再起動するだけの場合もあった。
現代のすべてのCPUには、CPUをコンピュータの他の部分に接続するための制御ロジックが備わっています。現代のコンピュータでは、これは通常バスコントローラです。命令がメモリの読み書きを行うとき、制御ユニットはバスを直接制御するか、バスコントローラを制御します。多くの現代のコンピュータは、メモリ、入力、出力に同じバスインターフェースを使用します。これは「メモリマップドI/O」と呼ばれます。プログラマにとって、I/Oデバイスのレジスタは特定のメモリアドレスにある数値として表示されます。x86 PCは、I/O命令によってアクセスされる別のI/Oバスという古い方式を使用します。
現代のCPUには、割り込みコントローラが搭載されているのが一般的です。これはシステムバスからの割り込み信号を処理します。コントローラは、コンピュータの中で割り込みに応答する部分です。
メモリをキャッシュするためのキャッシュコントローラがしばしば存在する。キャッシュコントローラとそれに付随するキャッシュメモリは、現代の高性能CPUにおいて、物理的に最も大きな部分を占めることが多い。メモリ、バス、またはキャッシュが他のCPUと共有されている場合、制御ロジックはそれらのCPUと通信し、どのコンピュータも古いデータを取得しないようにする必要がある。
多くの初期のコンピュータは、何らかの入出力機能を制御ユニットに直接組み込んでいました。例えば、多くの初期のコンピュータには、制御ユニットによって直接制御されるスイッチやランプを備えたフロントパネルがありました。これにより、プログラマはプログラムを直接入力してデバッグすることができました。後の量産型コンピュータでは、フロントパネルの最も一般的な用途は、ディスクからオペレーティングシステムを読み込むための小さなブートストラッププログラムを入力することでした。フロントパネルは、読み取り専用メモリに格納されたブートストラッププログラムに置き換えられました。
ほとんどのPDP-8モデルには、I/Oデバイスが制御ユニットのメモリの読み書きロジックを借用できるように設計されたデータバスがありました。[ 12 ]これにより、ディスクなどの高速I/Oコントローラの複雑さとコストが削減されました。
Xerox Alto は、ほぼすべての I/O を実行するマルチタスクのマイクロプログラマブル制御ユニットを備えていました。[ 13 ]この設計により、電子ロジックのごく一部だけで、現代の PC のほとんどの機能が実現されました。デュアルスレッドコンピュータは、優先度の低い 2 つのマイクロスレッドによって実行されました。これらは、I/O が必要ないときに計算を実行しました。優先度の高いマイクロスレッドは、(優先度の高い順に)ビデオ、ネットワーク、ディスク、周期タイマー、マウス、キーボードを提供しました。マイクロプログラムは、I/O デバイスの複雑なロジックと、デバイスをコンピュータに統合するロジックを実行しました。実際のハードウェア I/O については、マイクロプログラムは、ほとんどの I/O のシフトレジスタを読み書きし、場合によっては、出力電圧レベルをシフトするために抵抗ネットワークとトランジスタを使用しました (たとえば、ビデオの場合)。外部イベントを処理するために、マイクロコントローラは、スレッドのサイクルの終わり、たとえば命令の終わり、またはシフトレジスタにアクセスした後でスレッドを切り替えるためのマイクロ割り込みを備えていました。このマイクロプログラムは書き換えや再インストールが可能だったので、研究用コンピュータにとっては非常に便利だった。
このように、メモリ内の命令プログラムによって、CUはCPUのデータフローを構成し、命令間でデータを正しく処理します。その結果、完全なプログラムを実行でき、命令間のハードウェア変更に人間の介入を必要としないコンピュータが実現します( CUを搭載したプログラム内蔵型コンピュータが発明される以前は、計算にパンチカードのみを使用していたため、このような人間の介入が必要でした)。

ハードワイヤード制御ユニットは組み合わせ論理ユニットを使用して実装され、特定の応答を呼び出すために使用された命令に基づいて特定の結果を生成できる有限個のゲートを備えています。ハードワイヤード制御ユニットは一般的にマイクロプログラム設計よりも高速です。[ 14 ]
この設計は固定アーキテクチャを採用しているため、命令セットが変更された場合は配線の変更が必要になります。シンプルで高速なコンピュータには適しています。
この方式を採用したコントローラは高速動作が可能ですが、柔軟性に欠けます。複雑な命令セットは、場当たり的な論理設計を行う設計者にとって大きな負担となる可能性があります。
ハードワイヤード方式は、コンピュータの進化に伴い人気がなくなってきている。以前は、CPUの制御ユニットはアドホックなロジックを使用しており、設計が困難だった。[ 15 ]
マイクロプログラミングの概念は、 1951年にモーリス・ウィルクスによって、コンピュータプログラムの命令を実行する中間レベルとして導入されました。マイクロプログラムは、マイクロ命令のシーケンスとして構成され、専用の制御メモリに格納されます。マイクロプログラム制御ユニットのアルゴリズムは、ハードワイヤード制御ユニットとは異なり、通常はフローチャートで記述されます。[ 16 ]マイクロプログラム制御ユニットの主な利点は、その構造が単純であることです。コントローラからの出力はマイクロ命令によって行われます。マイクロプログラムは、ソフトウェアと同様にデバッグおよび置換できます。[ 17 ]
マイクロコードの一般的なバリエーションとして、ソフトウェアシミュレータを使用してマイクロコードをデバッグする方法があります。この場合、マイクロコードはビットの表になります。これは論理真理値表であり、マイクロコードのアドレスを制御ユニットの出力に変換します。この真理値表をコンピュータプログラムに入力すると、最適化された電子ロジックが生成されます。結果として得られる制御ユニットは、マイクロプログラミングとほぼ同じくらい簡単に設計できますが、ハードワイヤード制御ユニットのような高速性と少ないロジック要素数を備えています。実際の結果は、ミーリーマシンやリチャーズコントローラに似ています。