デバッグについて考えている。 例えば、今試している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
