POCOのマルチサイクル版のVerilogコードを久しぶりに読み直しました。

IF,ID,EX,WBの4サイクルで命令毎に何をするように割り振るかは以前よりは腑に落ちて来た感はあります。納得できた箇所についてはVerilogコード内にコメントを書き込んで残すことにしました。

今月から仕事が忙しくなり2、3ヶ月はこの状況が続きそうです。平日はもちろん、土日もあまり勉強の時間がとれなさそうですが、先に進める程時間がとれない→一切やらない、という風にすると復活が難しくなるので、現状理解している範囲を再確認する時間と割り切って週1回程度確保したいと考えています。

時間のゆとりができてきた時に少しずつでも続けていて良かったと思えるように、しばらくは我慢我慢。。

引き続きPOCOの4サイクル版のVerilogコードを読んでいます。

大分理解は進みましたが、まだ完全に納得とは行きません。IF状態でirに命令を取り込むので、命令が何かによって分岐するのは次のID状態が自然だというところは納得なのですが、残りのEXとWBで命令によって何をするのが自然かはまだ頭が整理できていません。

また、Verilogの文法上必ずそうしないといけないのか、たまたまそういう記述にしているだけなのかはっきりしない箇所もあります。例えば、別ファイルで定義されているモジュールのインスタンスを使う場合、入力ポートにはregを、出力ポートにはwireを定義してそれをつながないといけないのかです。

もう少し考察してからJALR命令の追加とシミュレーションによる動作確認をしたいと思います。


ここは難しかったです。大まかには納得できるのですが細部まではまだまだ。。

Code: Pipes

・pipeとは、小規模なカーネルバッファであり、プロセスからは読み出し用と書き込み用の一対のdescriptorに見える。
・pipeはプロセス間通信の一手段である。
・pipe(p)により、新しいpipeを作り、読み出しと書き込みのdescriptorを配列pに保存する。
・pipeからreadした時、pipeにデータが書き込まれるか、書き込み用descriptorが全てcloseされるまでwaitする。書き込み用descriptorが全てcloseされたらreadは0を返す。よって子プロセスはexecする前にpipeの書き込み用descriptorをcloseしておかなければならない。
・xv6のシェルは、a|bと入力されるとpipeを作り、pipeの左端と右端にruncmdをコールし、waitを2回コールすることで両端が終わるのを待つ。
・a|b|cの様に右端にpipeが含まれている場合(右端がb|c)、シェルはbとcの2つの子プロセスをforkし、プロセスの木を作る。葉はコマンドであり、中間ノードは両端の子プロセスが終了するのを待つプロセスである。
・pipeとテンポラリファイルの違いは、
(1)終了時にテンポラリファイルを消す必要がない
(2)テンポラリファイルを使うと巨大なデータを保存するディスクスペースが必要になる可能性がある。
(3)2つのプロセスが1対のpipeを使って同期をとることができる。