Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

UVM : `uvm_do_onマクロ


UVMになって、`uvm_do_onマクロというものが追加されました。
macros/uvm_sequence_defines.svh内で次のように定義されています。
`define uvm_do_on(UVM_SEQUENCE_ITEM, SEQUENCER_REF) \
  begin \
  `uvm_create_on(UVM_SEQUENCE_ITEM, SEQUENCER_REF) \
  start_item(UVM_SEQUENCE_ITEM); \
  if (!UVM_SEQUENCE_ITEM.randomize()) begin \
    uvm_report_warning("RNDFLD", "Randomization failed in uvm_do action"); \
  end \
  finish_item(UVM_SEQUENCE_ITEM); \
  end

uvm_doマクロは、次のようになっています。
`define uvm_do(UVM_SEQUENCE_ITEM) \
  begin \
  `uvm_create(UVM_SEQUENCE_ITEM) \
  start_item(UVM_SEQUENCE_ITEM); \
  if(!UVM_SEQUENCE_ITEM.randomize()) begin \
    uvm_report_warning("RNDFLD", "Randomization failed in uvm_do action"); \
  end \
  finish_item(UVM_SEQUENCE_ITEM); \
  end
違いuvm_create_onuvm_createだけ。
2つのマクロの違いは、'''create_itemの第2引数が違うだけ(m_sequencer と SEQUENCER_REF)。
シーケンサーの指定ができるがどうかだけね!
`define uvm_create(UVM_SEQUENCE_ITEM) \
  begin \
  uvm_object_wrapper w_; w_ = UVM_SEQUENCE_ITEM.get_type(); \
  $cast(UVM_SEQUENCE_ITEM , create_item(w_, m_sequencer, `"UVM_SEQUENCE_ITEM`"));\
  end\

`define uvm_create_on(UVM_SEQUENCE_ITEM, SEQUENCER_REF) \
  begin \
  uvm_object_wrapper w_; w_ = UVM_SEQUENCE_ITEM.get_type(); \
  $cast(UVM_SEQUENCE_ITEM , create_item(w_, SEQUENCER_REF, `"UVM_SEQUENCE_ITEM`"));\
  end

検証、Verification、SystemVerilog、UVM、Unified Verification Methodology