FPGA開発日記

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

Vivado Simulatorを使ってUVMに入門する (9. UVMのデバッグはやりにくい)

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