今のところ自作CPUは面積が大きすぎる。Vivadoでの論理合成結果をもっと詳細に見ていくことにする。
非常に目立つのはLSUの内部のパイプラインだ。パイプラインが大きいというのがちょっと意味が分からないが、何が起きているのか見てみよう。
+-----------------------------------------------+------------------------------------------------+------------+------------+---------+------+--------+--------+--------+------+--------------+ | Instance | Module | Total LUTs | Logic LUTs | LUTRAMs | SRLs | FFs | RAMB36 | RAMB18 | URAM | DSP48 Blocks | +-----------------------------------------------+------------------------------------------------+------------+------------+---------+------+--------+--------+--------+------+--------------+ | u_lsu_top | scariv_lsu_top | 163127 | 162215 | 912 | 0 | 24696 | 128 | 0 | 0 | 0 | | (u_lsu_top) | scariv_lsu_top | 0 | 0 | 0 | 0 | 5 | 0 | 0 | 0 | 0 | | lsu_loop[0].u_scariv_lsu | scariv_lsu | 42912 | 42816 | 96 | 0 | 4725 | 0 | 0 | 0 | 0 | | lsu_loop[1].u_scariv_lsu | scariv_lsu__parameterized0 | 24523 | 24427 | 96 | 0 | 4732 | 0 | 0 | 0 | 0 | | u_l1d_mshr | scariv_l1d_mshr | 17814 | 17814 | 0 | 0 | 4679 | 0 | 0 | 0 | 0 | | u_ldq | scariv_ldq | 3073 | 3073 | 0 | 0 | 1467 | 0 | 0 | 0 | 0 | | u_lrsc | scariv_lsu_lrsc | 0 | 0 | 0 | 0 | 57 | 0 | 0 | 0 | 0 | | u_scariv_dcache | scariv_dcache | 38824 | 38104 | 720 | 0 | 2459 | 128 | 0 | 0 | 0 | | u_scariv_store_requester | scariv_store_requestor | 1077 | 1077 | 0 | 0 | 1191 | 0 | 0 | 0 | 0 | | u_st_buffer | scariv_st_buffer | 9373 | 9373 | 0 | 0 | 1755 | 0 | 0 | 0 | 0 | | u_stq | scariv_stq | 25531 | 25531 | 0 | 0 | 3626 | 0 | 0 | 0 | 0 |

まずは、ネットリストとして何が大きいのかを合成結果から確認する。
grep "lsu_loop\[0\]" core_tile_wrapper_nets_list.txt | grep aligned | sed 's/[0-9]//g' | sort -n | uniq -c | grep lsu_pipe | sort -n
1 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/u_tlb/w_misaligned
6 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_i_
14 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i___[]
16 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i____[]
37 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_i__n_
39 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/u_rs_data_select/r_ex_aligned_data_reg[]
45 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i____
52 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i___
63 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_i__
64 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_[]
64 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_rep_n_
64 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_rep_i__n_
73 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i_
84 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_i_[]
101 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i__[]
120 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i_[]
256 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_rep___n_
256 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_rep___i__n_
306 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i____n_
489 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i__
966 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data[]_i__n_
977 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_rep___
2005 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_
3259 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_rep_
12288 u_tile/u_lsu_top/lsu_loop[].u_lsu/u_lsu_pipe/r_ex_aligned_data_reg[]_rep___[]
うーん、ロード結果を格納するネットが非常に多い。これはおそらくロードした結果のデータを別のユニットにブロードキャストする、バイパスネットワークが大きくなっているのでは。 普通の構成だと、LSUの結果は10個近くのモジュールにバイパスされる。このために信号がかなり複製されているものと思われる。
ただし、いろいろとやりようはある気がしていて、例えば本当に物理レジスタに書き込むためのバイパスネットワークと、フォワーディングのためのバイパスネットワークは分離したりすることができるし、リネームユニット内に存在するインフライト・リストのアップデートのための信号については、実際のデータは不要だ。
書き込みレジスタのタイプ(整数・浮動小数点)でも切り替えができるような気がするので、その辺で最適化をかけていくのがいいのではないだろうか。