FPGA開発日記

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

Verilog-Perl の vhier を使ってモジュール構成を把握する

Verilog-Perl には、 vhier というモジュール階層を認識するスクリプトがある。 これを使って現在開発しているモジュールの階層を把握してみよう。

www.veripool.org

vhier -f dotf/pulsar1_top.f --top-module pulsar1_top -o pulsar1.hier --cells --forest --instance

とすると、pulsar1.hier に現在のVerilogモジュールの階層構成が表示される。入力はdotf/pulsar1_top.f だ。 これはVcsとかが利用するfファイルをそのまま投入している。ただし、いくつか引掛った点があった。

  • bindなどのシミュレーション用のモジュールは挿入してはいけない。bindはモジュールを、その上位の階層を変更せずに挿入することができるが、これには対応していない。
  • XilinxのIPなどを使っている場合は、プリミティブなセルまで階層を見付けようとして失敗するので、最初からstubに置き換えておくのが良い。

XilixのIPの機能モデルは、LUTなどのモジュールを使って表現をしていることが多いが、これまで階層を表示すると非常に見にくいため、それくらいだったらstubに置き換えておくのが良いかもしれない。

$ less dotf/pulsar1_top.f
+incdir+c:/usr/pulsar-1/questa_pulsar1_top/./
+incdir+c:/usr/pulsar-1/questa_pulsar1_top/../design/
+incdir+c:/usr/pulsar-1/questa_pulsar1_top/../sim/

+incdir+C:/Xilinx/14.6/ISE_DS/ISE/verilog/src/unisims/
+incdir+C:/Xilinx/14.6/ISE_DS/ISE/verilog/src/unisims/secureip/
+incdir+C:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/
+incdir+C:/Xilinx/14.6/ISE_DS/ISE/verilog/src/XilinxCoreLib/

c:/usr/pulsar-1/questa_pulsar1_top/./../sim/bram_model.v
c:/usr/pulsar-1/questa_pulsar1_top/./../ips/axi_dram_128bit/axi_dram_128bit_stub.v
c:/usr/pulsar-1/questa_pulsar1_top/./../ips/pulsar1_connect/pulsar1_connect_stub.v

c:/usr/pulsar-1/questa_pulsar1_top/./../design/axi_connect3.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/axi_connect4.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/pulsar1_core.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/pulsar1_top.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/bus_interface.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/ram_128bit_wrapper.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/axiram.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/if_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/ic_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/id_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/mips_dec.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/mips_ctrl.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/rn_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/cm_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/rs_ex_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/rs_br_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/rs_ls_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/br_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/dc_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/ex_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/int_mult_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/int_div_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/ls_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/wb_unit.v
c:/usr/pulsar-1/questa_pulsar1_top/./../design/ex_perifs.v

階層構造を表示した結果。

  pulsar1_top pulsar1_top
  |--axi_connect3 axi_connect3
  |--axi_connect4 axi_connect4
  |--axi_ctrl_DRAM axi_dram_128bit
  |--axi_ctrl_START axi_dram_128bit
  |--axi_ctrl_TEXT axi_dram_128bit
  |--ex_perifs_0 ex_perifs
  |--pulsar1_connect_0 pulsar1_connect
  |--pulsar1_core_0 pulsar1_core
  |  |--br_0 br_unit
  |  |--cm_0 cm_unit
  |  |  |--cm_branch_0 cm_branch
  |  |  |--cm_flush_0 cm_flush
  |  |  \--reorder_buffer_0 reorder_buffer
  |  |--ex_0 ex_unit
  |  |  |--ex_latch_0 ex_latch
  |  |  |--int_alu_main_0 int_alu_main
  |  |  |--int_alu_selector_0 int_alu_selector
  |  |  |--int_div_unit_0 int_div_unit
  |  |  \--int_mult_unit_0 int_mult_unit
  |  |--ex_1 ex_unit
  |  |  |--ex_latch_0 ex_latch
  |  |  |--int_alu_main_0 int_alu_main
  |  |  |--int_alu_selector_0 int_alu_selector
  |  |  |--int_div_unit_0 int_div_unit
  |  |  \--int_mult_unit_0 int_mult_unit
  |  |--id_0 id_unit
  |  |  |--detect_separate_inst_0 detect_separate_inst
  |  |  |--id_ctrl_0 id_ctrl
  |  |  |--id_input_buffer id_input_buffer
  |  |  |--id_latch_0 id_latch
  |  |  |--id_latch_1 id_latch
  |  |  |--id_latch_2 id_latch
  |  |  |--id_latch_3 id_latch
  |  |  |--mips_ctrl_0 mips_ctrl
  |  |  |--mips_ctrl_1 mips_ctrl
  |  |  |--mips_ctrl_2 mips_ctrl
  |  |  |--mips_ctrl_3 mips_ctrl
  |  |  |--mips_dec_0 mips_dec
  |  |  |--mips_dec_1 mips_dec
  |  |  |--mips_dec_2 mips_dec
  |  |  |--mips_dec_3 mips_dec
  |  |  \--separate_inst_0 separate_inst
  |  |--if_0 if_unit
  |  |  |--detect_likely_inst_0 detect_likely_inst
  |  |  |  |--is_branch_inst_0 is_branch_inst
  |  |  |  |--is_branch_inst_1 is_branch_inst
  |  |  |  |--is_branch_inst_2 is_branch_inst
  |  |  |  \--is_branch_inst_3 is_branch_inst
  |  |  |--fetch_state_machine_0 fetch_state_machine
  |  |  |--ic_unit_0 ic_unit
  |  |  |  \--ic_buffers_0 ic_buffers
  |  |  \--inst_buffer_0 inst_buffer
  |  |--ls_0 ls_unit
  |  |  |--ls_ctrl_0 ls_ctrl
  |  |  |--ls_input_buffer_0 ls_input_buffer
  |  |  \--ls_unit_main_0 ls_unit_main
  |  |     \--dc_unit_0 dc_unit
  |  |--rn_0 rn_unit
  |  |  |--freelist_0 freelist
  |  |  |--future_file_0 future_file
  |  |  |--phy_rfile_0 phy_rfile
  |  |  |--rename_map_0 rename_map
  |  |  |  |--rename_unit_0 rename_unit
  |  |  |  |--rename_unit_0__duplicate_2 rename_unit
  |  |  |  \--rename_unit_0__duplicate_3 rename_unit
  |  |  \--rn_selector_0 rn_selector
  |  |--rs_br rs_br_unit
  |  |  |--rs_br_decoder_0 rs_br_decoder
  |  |  |--rs_br_entry_0 rs_br_entry
  |  |  |--rs_br_entry_1 rs_br_entry
  |  |  |--rs_br_entry_selector_0 rs_br_entry_selector
  |  |  |--rs_br_input_demux_0 rs_br_input_demux
  |  |  |--rs_br_input_demux_1 rs_br_input_demux
  |  |  |--rs_br_input_mux_0 rs_br_input_mux
  |  |  \--rs_br_input_mux_1 rs_br_input_mux
  |  |--rs_ex_0 rs_ex_unit
  |  |  |--rs_alu_decoder_0 rs_alu_decoder
  |  |  |--rs_alu_entry_0 rs_alu_entry
  |  |  |--rs_alu_entry_1 rs_alu_entry
  |  |  |--rs_alu_entry_2 rs_alu_entry
  |  |  |--rs_alu_entry_3 rs_alu_entry
  |  |  |--rs_alu_entry_selector_0 rs_alu_entry_selector
  |  |  |--rs_alu_input_demux_0 rs_alu_input_demux
  |  |  |--rs_alu_input_demux_1 rs_alu_input_demux
  |  |  |--rs_alu_input_demux_2 rs_alu_input_demux
  |  |  |--rs_alu_input_demux_3 rs_alu_input_demux
  |  |  |--rs_alu_input_mux_0 rs_alu_input_mux
  |  |  \--rs_alu_input_mux_1 rs_alu_input_mux
  |  |--rs_ex_1 rs_ex_unit
  |  |  |--rs_alu_decoder_0 rs_alu_decoder
  |  |  |--rs_alu_entry_0 rs_alu_entry
  |  |  |--rs_alu_entry_1 rs_alu_entry
  |  |  |--rs_alu_entry_2 rs_alu_entry
  |  |  |--rs_alu_entry_3 rs_alu_entry
  |  |  |--rs_alu_entry_selector_0 rs_alu_entry_selector
  |  |  |--rs_alu_input_demux_0 rs_alu_input_demux
  |  |  |--rs_alu_input_demux_1 rs_alu_input_demux
  |  |  |--rs_alu_input_demux_2 rs_alu_input_demux
  |  |  |--rs_alu_input_demux_3 rs_alu_input_demux
  |  |  |--rs_alu_input_mux_0 rs_alu_input_mux
  |  |  \--rs_alu_input_mux_1 rs_alu_input_mux
  |  |--rs_ls rs_ls_unit
  |  |  |--rs_lsu_decoder_0 rs_lsu_decoder
  |  |  |--rs_lsu_entry_0 rs_lsu_entry
  |  |  |--rs_lsu_entry_1 rs_lsu_entry
  |  |  |--rs_lsu_entry_2 rs_lsu_entry
  |  |  |--rs_lsu_entry_3 rs_lsu_entry
  |  |  |--rs_lsu_entry_selector_0 rs_lsu_entry_selector
  |  |  |--rs_lsu_input_demux_0 rs_lsu_input_demux
  |  |  |--rs_lsu_input_demux_1 rs_lsu_input_demux
  |  |  |--rs_lsu_input_demux_2 rs_lsu_input_demux
  |  |  |--rs_lsu_input_demux_3 rs_lsu_input_demux
  |  |  |--rs_lsu_input_mux_0 rs_lsu_input_mux
  |  |  \--rs_lsu_input_mux_1 rs_lsu_input_mux
  |  \--wb_0 wb_unit
  |--ram_DRAM bram_model
  |--ram_START bram_model
  \--ram_TEXT bram_model