FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

自作CPUコアとBOOMv3のPPA(Performance, Power, Area)を比較する (4. 面積の解析)

今のところ自作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 |
+-----------------------------------------------+------------------------------------------------+------------+------------+---------+------+--------+--------+--------+------+--------------+
|                    Instance                   |                     Module                     | Total LUTs | Logic LUTs | LUTRAMs | SRLs |   FFs  | RAMB36 | RAMB18 | URAM | DSP48 Blocks |
+-----------------------------------------------+------------------------------------------------+------------+------------+---------+------+--------+--------+--------+------+--------------+
|     u_lsu_top                                 |                                 scariv_lsu_top |     161548 |     160636 |     912 |    0 |  24624 |    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 |      43552 |      43456 |      96 |    0 |   4730 |      0 |      0 |    0 |            0 |
|       lsu_loop[1].u_scariv_lsu                |                     scariv_lsu__parameterized0 |      27012 |      26916 |      96 |    0 |   4652 |      0 |      0 |    0 |            0 |
|       u_l1d_mshr                              |                                scariv_l1d_mshr |      17769 |      17769 |       0 |    0 |   4679 |      0 |      0 |    0 |            0 |
|       u_ldq                                   |                                     scariv_ldq |       3095 |       3095 |       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 |      38785 |      38065 |     720 |    0 |   2459 |    128 |      0 |    0 |            0 |
|       u_scariv_store_requester                |                         scariv_store_requestor |       1067 |       1067 |       0 |    0 |   1191 |      0 |      0 |    0 |            0 |
|       u_st_buffer                             |                               scariv_st_buffer |       9385 |       9385 |       0 |    0 |   1753 |      0 |      0 |    0 |            0 |
|       u_stq                                   |                                     scariv_stq |      20883 |      20883 |       0 |    0 |   3631 |      0 |      0 |    0 |            0 |

よく見てみるとSynthesisのオプションでflatten_hierarchyrebuildになっていたので、Noneに再設定して信号がやたらとDupulicateされるのを防いでみる。

|     u_lsu_top                                 |                                 scariv_lsu_top |     122264 |     121352 |     912 |    0 |  25489 |    128 |      0 |    0 |            0 |
|       (u_lsu_top)                             |                                 scariv_lsu_top |        111 |        111 |       0 |    0 |      5 |      0 |      0 |    0 |            0 |
|       lsu_loop[0].u_scariv_lsu                |                                     scariv_lsu |       9731 |       9635 |      96 |    0 |   4156 |      0 |      0 |    0 |            0 |
|       lsu_loop[1].u_scariv_lsu                |                     scariv_lsu__parameterized0 |       9413 |       9317 |      96 |    0 |   4124 |      0 |      0 |    0 |            0 |
|       u_l1d_mshr                              |                                scariv_l1d_mshr |      13292 |      13292 |       0 |    0 |   4711 |      0 |      0 |    0 |            0 |
|       u_ldq                                   |                                     scariv_ldq |       7783 |       7783 |       0 |    0 |   1468 |      0 |      0 |    0 |            0 |
|       u_lrsc                                  |                                scariv_lsu_lrsc |        135 |        135 |       0 |    0 |     57 |      0 |      0 |    0 |            0 |
|       u_scariv_dcache                         |                                  scariv_dcache |      33997 |      33277 |     720 |    0 |   4525 |    128 |      0 |    0 |            0 |
|       u_scariv_l2_req_arbiter                 |                                  l2_if_arbiter |        293 |        293 |       0 |    0 |      0 |      0 |      0 |    0 |            0 |
|       u_scariv_store_requester                |                         scariv_store_requestor |       1075 |       1075 |       0 |    0 |   1197 |      0 |      0 |    0 |            0 |
|       u_st_buffer                             |                               scariv_st_buffer |      13425 |      13425 |       0 |    0 |   1735 |      0 |      0 |    0 |            0 |
|       u_stq                                   |                                     scariv_stq |      33009 |      33009 |       0 |    0 |   3511 |      0 |      0 |    0 |            0 |

うーん、ネットリストの数だけで言うと多少改善された。次に見えるのはデータキャッシュの付近に見えるパスだな、これはフォワーディングパスも混ざってややこしくなっている。どうにか改善できんかな。