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