SonicBOOMのデザインを読み解いている。少しクリティカルな部分について解析するために以下のようなプログラムを動かしてみよう。
000000008000322e <simple_add>: 8000322e: b0002573 csrr a0,mcycle 80003232: 301025f3 csrr a1,misa 80003236: 0205e593 ori a1,a1,32 8000323a: 30159073 csrw misa,a1 8000323e: 8082 ret
CSR命令を大量に発行する。このときにどのようなデータパスで実行されるのだろうか。
まず、GigaBoomConfig
の波形を解析すると、フロントエンドからバックエンドには5命令が同時に発行される。この時にすべてのCSR命令は同時に発行されており、ここではスケジューリングがなされていないことが見て取れる。しかし問題はこの後だ。おそらく先頭からIssueできる命令だけをIssueして、それ以外はReplayさせて再度命令を実行しているものと思われる。
その証拠に、CSR命令発行用のIssueユニットは1命令ずつDispatchを受け入れておりずいぶんと長い時間をかけて実行していることが見て取れる。
これ、Issueの条件はどのようになっているのだろうか。基本的にハザードが無ければすぐに発行しているようだ。これは完全にフロントエンド側がどれくらいパイプラインを停止するかに依存している気がする。フロントエンドのパイプライン停止条件についてもう少し細かく見ていく子はできないだろうか。