如何在定义后启动一个sequence

电子说

1.2w人已加入

描述

Q:激励最初产生在driver中,后来产生在sequence中。为什么会有这个过程呢?

Q:当一个激励在driver中产生,当要对DUT施加不同的激励时,那应该怎么办呢?

Q:如何在定义后启动一个sequence

  •  
  •  
  •  
  •  
  •  
  •  
//当完成一个sequence的定义后,可以使用start任务将其启动my_sequence my_seq;my_seq = my_sequence::create("my_seq");my_seq.start(sequencer);//除了直接启动之外,还可以使用default_sequence启动uvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence", case0_sequence::get());

A:使用sequence机制之后,在不同的测试用例中,将不同的sequence设置成sequencer的main_phase的default_sequence。当sequencer执行到main_phase时,发现有default_sequence,那么它就启动sequence。

 

A:当一个sequence启动后会自动执行sequence的body任务。其实,除了body外,还会自动调用sequence的pre_body与post_body

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
文件:src/my_case0.sv3 class case0_sequence extends uvm_sequence #(my_transaction);virtual task pre_body();`uvm_info("sequence0", "pre_body is called!!!", UVM_LOW)endtaskvirtual task post_body();`uvm_info("sequence0", "post_body is called!!!", UVM_LOW)endtaskvirtual task body();#100;`uvm_info("sequence0", "body is called!!!", UVM_LOW) endtask `uvm_object_utils(case0_sequence)endclass

 

Q:UVM支持同一时刻在同一sequencer上启动多个sequence,那同时启动多个sequence时,哪个先执行呢?

Q:sequencer根据什么选择使用哪个sequence的transaction呢?这是UVM的sequence机制中的仲裁问题

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
//例如如下启动了seq0和seq1文件:src/no_pri/my_case0.svtask my_case0::main_phase(uvm_phase phase);   sequence0 seq0;   sequence1 seq1;   seq0 = new("seq0");   seq0.starting_phase = phase;   seq1 = new("seq1");   seq1.starting_phase = phase;fork   seq0.start(env.i_agt.sqr);   seq1.start(env.i_agt.sqr);joinendtask

A:对于transaction来说,存在优先级的概念,通常来说,优先级越高越容易被选中。当使用uvm_do或者uvm_do_with宏时,产生的transaction的优先级是默认的优先级,即-1。可以通过uvm_do_pri及uvm_do_pri_with改变所产生的transaction的优先级

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
文件:src/item_pri/my_case0.sv3 class sequence0 extends uvm_sequence #(my_transaction);virtual task body();repeat (5) begin   `uvm_do_pri(m_trans, 100)   `uvm_info("sequence0", "send one transaction", UVM_MEDIUM)end#100;endtaskendclassclass sequence1 extends uvm_sequence #(my_transaction);virtual task body();repeat (5) begin   `uvm_do_pri_with(m_trans, 200, {m_trans.pload.size < 500;})   `uvm_info("sequence1", "send one transaction", UVM_MEDIUM)endendtaskendclass

uvm_do_pri与uvm_do_pri_with的第二个参数是优先级,这个数值必须是一个大于等于-1的整数。数字越大,优先级越高。

 

A:除transaction有优先级外,sequence也有优先级的概念

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
文件:src/sequence_pri/my_case0.svtask my_case0::main_phase(uvm_phase phase);env.i_agt.sqr.set_arbitration(SEQ_ARB_STRICT_FIFO);fork    seq0.start(env.i_agt.sqr, null, 100);    seq1.start(env.i_agt.sqr, null, 200);joinendtask

 

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分