006. default_sequence
以前、OVMやUVMの初期?では、default_sequenceの初期値が "random_seuqnece" というもので、実行したいsequenceをセットしておかないと、意図しない動作をしていました。
デバッグで、uvm_top.print_topology();を実行すると、昔はdefault_sequenceの値が見えていました。しかし今は見えません。仕方がないので、uvm_sequencerをextendsして、task run_phaseの中で default_sequence の値を表示させるようにしていました。ところが、uvm_testクラスからuvm_config_dbのsetでdefault_sequenceを設定しても、uvm_sequencerの中で表示されるのは常に uvm_random_sequence。なんでだ?なんでだ?と昨日ずーっと悩んでいました。しかも、uvm_random_sequenceになっていても、指定したsequenceは動いている。
今朝、気づきました。default_sequenceは
protected string default_sequence = "uvm_random_sequence";
となっているのですが、これはDEPRECATEDの中。もう使わなくなるよと言うわけですが、それ以外に、「uvm_config_db」を使っているということは、このstringにセットするわけではないんですよね。ってこ とはですよ。どこかで default_sequence という名前で uvm_config_db を使って get しているところがあるはずだと。調べたらありました。
function void uvm_sequencer_base::start_phase_sequence(uvm_phase phase);
uvm_object_wrapper wrapper;
uvm_sequence_base seq;
uvm_factory f = uvm_factory::get();
// default sequence instance?
if (!uvm_config_db #(uvm_sequence_base)::get(
this, {phase.get_name(),"_phase"}, "default_sequence", seq) || seq == null) begin
// default sequence object wrapper?
if (uvm_config_db #(uvm_object_wrapper)::get(
this, {phase.get_name(),"_phase"}, "default_sequence", wrapper) && wrapper != null) begin
// use wrapper is a sequence type
if(!$cast(seq , f.create_object_by_type(
wrapper, get_full_name(), wrapper.get_type_name()))) begin
`uvm_warning("PHASESEQ", {"Default sequence for phase '",
phase.get_name(),"' %s is not a sequence type"})
return;
end
end
else begin
`uvm_info("PHASESEQ", {"No default phase sequence for phase '",
phase.get_name(),"'"}, UVM_FULL)
return;
end
end
UVMでは、この人なんですねー仕事しているの。