LiteXのLiteScopeではどうにも細かい信号を取得することができないので、Xilinxの純正の波形のデバッグツールであるILA(Integrated Logic Analyzer)を使って内部の信号を観察する方法を見てみる。
もうちょっと細かい信号を取得するために、tclでILAを挿入する場所を細かく変えながらいろいろ動作を取得している。
以下のようなtclファイルを用意して、取得したい信号をILAに挿入する。
# BRU dispatch set bru_net_lists { "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_issue_unit/w_entry_valid.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_issue_unit/w_entry_ready.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_issue_unit/entry_loop.0..u_issue_entry/r_state.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_issue_unit/entry_loop.1..u_issue_entry/r_state.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_issue_unit/entry_loop.0..u_issue_entry/r_entry.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_issue_unit/entry_loop.1..u_issue_entry/r_entry.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_bru_pipe/w_ex0_issue.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_bru_pipe/r_ex1_issue.*" "mycpu_subsystem_axi_wrapper/u_mycpu_subsystem/u_tile/u_bru/u_bru_pipe/r_ex2_issue.*" } foreach net $bru_net_lists { set debug_nets [lsort -dictionary [get_nets -hierarchical -regexp $net]] puts $debug_nets set new_port [create_debug_port u_ila_0 probe] set_property port_width [llength $debug_nets] [get_debug_ports $new_port] set_property PROBE_TYPE DATA_AND_TRIGGER $new_port connect_debug_port $new_port $debug_nets }
必要な信号部分は、Vivadoでの最適化を抑制するためのアトリビュートを挿入する必要がある。
(* mark_debug="true" *)(* dont_touch="yes" *) scariv_bru_pkg::issue_entry_t w_ex0_issue;
論理合成を最初からやり直しているのでそれぞれのイタレーションは30分~1時間くらいかかってしまうが、仕方がない。 これで、少しずつ命令がデッドロックしてしまう原因を特定している。時間はかかるが、もう少しだ。