現在、asm シミュレーター用のパイプラインを作成しています。私はマルチスレッドでこれを行うつもりです。現在、フェッチ、デコード、実行、ライトバックのそれぞれに対応する 4 つのスレッドがあります。正しいパイプラインをコーディングする方法について混乱しています。これが私のコードの一部です:
private void Fetch()
{
while(_continue)
{
fetchEvent.WaitOne();
if (!_continue) break;
lock (irLock)
{
try
{
// Do stuff to fetch instruction...
catch (IndexOutOfRangeException e) { Err = "Segmentation Fault at Line " + _pc.ToString(); }
catch (Exception e) { Err = e.Message + "Line " + _pc.ToString(); }
_pc++;
GiveTurnTo(2); // used these 2 lines to handle mutual exclusion
WaitTurn(1);
}
}
}
private void Decode()
{
while (_continue)
{
decodeEvent.WaitOne();
if (!_continue) break;
lock (irLock)
{
WaitTurn(2);
Console.WriteLine("decode works");
GiveTurnTo(1);
}
}
}
private void Execute()
{
while (_continue)
{
exeEvent.WaitOne();
if (!_continue) break;
lock (irLock)
{
//WaitTurn(3);
Console.WriteLine("Am I, execute, getting a turn?");
// GiveTurnTo(4);
}
}
}
private void WriteBack()
{
while (_continue)
{
wbEvent.WaitOne();
if (!_continue) break;
lock (irLock)
{
Console.WriteLine("Am I, Write Back, getting a turn?");
//GiveTurnTo(1);
// WaitTurn(4);
}
}
}
}
このメソッドを使用して、ボタンのクリックでサイクルを実行します。
public void nextInstruction()
{
fetchEvent.Set();
decodeEvent.Set();
exeEvent.Set();
wbEvent.Set();
}
I was thinking of changing nextInstruction() to this:
public void nextInstruction()
{
fetchEvent.Set();
}
各ボタンのクリックは常に Fetch で始まります。その後、Fetch メソッド内に set イベントを配置して、サイクルの次の部分 (Decode) を呼び出し、次のメソッドに対して同じことを行うことができるのではないかと考えました。私はこのようなものになります:
private void Fetch()
{
while(_continue)
{
// Do stuff....
decodeEvent.Set();
}
}
private void Decode()
{
while (_continue)
{
// Do stuff...
exeEvent.Set();
}
}
private void Execute()
{
while (_continue)
{
// Do stuff...
wbEvent.Set();
}
}
private void WriteBack()
{
while (_continue)
{
// Do stuff...
}
}
それらの設定されたイベントを公開するのではなく、何らかのロジックでアクティブ化する必要があると思いますが、どのようなロジックかはわかりません。たぶん、ボタンをクリックしてアクティブにすることができます。これにより、命令がサイクルに渡されるタイミングを制御できます。理論的には、これでパイプラインの構造が得られると思います。誰でもこれについて意見を提供できますか? これは、自動リセット イベントだけで実現できますか?
私が提供したコードの最初のブロックを見ると、ロックを使用しようとしたことがわかりますが、一度に 1 つのスレッドしか実行できませんでした。などの形式になるようにしたいですFetch0, {Decode0, Fetch1}, {Execute0, Decode1, Fetch3},...
。この場合、ロックは必要ですか?