デバッグについて考えている。 例えば、今試しているUVMのデザインで、以下のようなエラーが出てしまった。
ERROR: File: /home/msyksphinz/work/sv/uvm_study/bfm/sample_monitor.sv Line: 24 : Accessing null or invalid reference to virtual interface is not allowed.
sample_monitor.sv
task check_trans; forever begin @(posedge vif.valid) uvm_report_info("MON", $sformatf("addr=%02xh, data=%02xh", vif.addr, vif.data)); end endtask // check_trans
ここのどこが問題なのか分からん。要するにここのvif
がインスタンス化されていないという話なのだと思うのだが。
-------------------------------------------------------- Name Type Size Value -------------------------------------------------------- sample_driver sample_driver - @377 rsp_port uvm_analysis_port - @396 seq_item_port uvm_seq_item_pull_port - @386 sample_monitor sample_monitor - @543 sample_sequencer sample_sequencer - @406 rsp_export uvm_analysis_export - @415 seq_item_export uvm_seq_item_pull_imp - @533 arbitration_queue array 0 - lock_queue array 0 - num_last_reqs integral 32 'd1 num_last_rsps integral 32 'd1 uvm_test_top sample_test - @341 sample_env sample_env - @358 sample_agent sample_agent - @367 --------------------------------------------------------
他のデザインだと、uvm_test_top
をトップにして階層化されるはずだから、なんかおかしいなあ。
----------------------------------------------------------------- Name Type Size Value ----------------------------------------------------------------- uvm_test_top sample_test - @341 env tb_env - @359 sample_model sample_env - @368 master sample_master_agent - @406 driver sample_master_driver - @425 rsp_port uvm_analysis_port - @444 seq_item_port uvm_seq_item_pull_port - @434 monitor sample_master_monitor - @454 ap_read uvm_analysis_port - @473 ap_write uvm_analysis_port - @463 sequencer sample_master_sequencer - @483
これをもとにいろいろ修正したのだが、今度は以下のエラーだ。
UVM_FATAL sample_driver.sv(12) @ 0: uvm_test_top.sample_env.sample_agent.driver [NOVIF] virtual interface must be set for: uvm_test_top.sample_env.sample_agent.driver.vif
今度は、sample_env
をもとに解を導き出す。uvm_config_db
の記述が間違っていた。
- 修正前
initial begin uvm_config_db#(virtual sample_if)::set(uvm_root::get(), "*.env.*", "vif", sif); run_test(); end
- 修正後
initial begin uvm_config_db#(virtual sample_if)::set(uvm_root::get(), "*.sample_env.*", "vif", sif); run_test(); end
余談:+UVM_CONFIG_DB_TRACE
というオプションもあるらしい。
dsim -image image -uvm 1.2 -waves waves.mxd +UVM_NO_RELNOTES +UVM_TESTNAME=$(TESTNAME) +UVM_CONFIG_DB_TRACE