自作CPUの回路面積削減の続き。ストアバッファの面積が結構大きいので、削減を検討する。 ストアバッファが大きくなっている原因は、直接的なものはよくわからないのだが、Atomic命令を処理するフィールドが少なくともかなり面積を使用しているので、これを削減することを考える。
Atomic命令を処理するエントリはエントリの1番目のみに限定し、それ以外のエントリはAtomicをサポートしない。
generate for (genvar e_idx = 0; e_idx < ST_BUF_ENTRY_SIZE; e_idx++) begin : entry_loop logic w_ready_to_merge; logic w_load; assign w_entry_valids[e_idx] = w_entries[e_idx].valid; assign w_load = st_buffer_if.valid & (st_buffer_if.is_rmw ? e_idx == 0 : w_in_ptr_oh[e_idx]) & w_st_buffer_allocated; if (e_idx == 0) begin scariv_st_buffer_amo_entry u_entry /* ... 途中省略 ... */ ); end else begin // if (e_idx == 0) scariv_st_buffer_entry u_entry ( .i_clk (i_clk ), .i_reset_n(i_reset_n), /* ... 途中省略 ... */
どっちにしろ、Atomic命令を処理するときはストアバッファが空になっていることを確認してからキャッシュアップデートをするので、一応問題ないはずだ。
一応面積的には大幅な削減になっている。やはりAtomic命令の処理のところでかなり面積を消費していたんだなあ。
- 削減処理前
- 削減処理後