ようやくシミュレーションが出来るようになったので、どんどん追加していく。 端子の規則が出来ていなくて、余計な信号が出来てしまっていた。
例えば、EmacsのVerilogモードにて、クロックの名前がCPU_CLK, リセットの名前がCPU_RESETとなっていた場合、接続したいモジュールの信号の欄で、
/*AUTOWIRE*/ moduleA u_moduleA (/*AUTOINST*/); moduleB u_moduleB (/*AUTOINST*/);
として、C-x, C-aを入力すると自動的に接続してくれる。
wire conect_A; moduleA u_moduleA (.CLK(CLK), .connect_A(connect_A)); moduleB u_moduleB (.CLK(CLK) .connect_A(connect_A));
端子名が同じで、同一階層の中に入力ポートと出力ポートがあれば自動的に接続してくれる。また、AUTOWIREを持っていれば自動的に配線を定義してくれる。 両方とも出力になっていれば、自動的にoutputポート、両方とも入力になっていれば、自動的にinputポートを作ってくれる。
これ、配線ミスや接続し忘れを防ぐのにかなり便利だ。例えば、端子名を間違っており、実は接続できていないかった場合には、接続先が無いため、勝手にinput/outputポートを作られる。 そうすると、上の階層までポートが上がってしまい、最終的に接続先が無くなって未接続となるわけだ。
これで、やっとCPUのパイプトレースが出るようになった。ただし、まだフェッチが完了してからパイプラインの内部信号に不定が載ったままのため、次のデコードステージに進んでくれない。 これもどんどん見ていこう。