长沙高端网站制作公司丹灶建网站
在《 creating and using  sequence》中,我们了解到sequence会调用任务start_item()和finish_item()。通过直接调用UVM sequence宏uvm_do或uvm_do_with,你可以避免在代码中写入所有这些语句。在编译时,这些宏将被替换为对start_item()和finish_item()的调用。主要有四种类型的UVM宏可以在默认sequencer上执行。
Macros `uvm_do_*
你必须提供一个 uvm_sequence_item 对象或序列,其内部会执行以下操作:
1. 必要时通过 uvm_create 创建条目。若无需创建条目,请使用 uvm_send。
2. 对条目或序列进行随机化
3. 若为 uvm_sequence_item 对象,则调用 start_item() 和 finish_item()
4. 若为序列,则调用 start() 任务
uvm_do:在默认sequencer上执行提供的sequence itemuvm_do_with:用行内值覆盖默认约束uvm_do_pri:根据优先级值执行,用于同时运行多个sequence时uvm_do_pri_with:根据优先级执行,并用行内值覆盖默认约束
uvm_do_*宏会判断参数是sequence还是sequence item,并相应调用start()或start_item()。
Example
下面的序列将生成四个项目,随机排列后发送至驱动器
class base_sequence extends uvm_sequence #(my_data);`uvm_object_utils (base_sequence)...virtual task body ();`uvm_info ("BASE_SEQ", $sformatf ("Starting body of %s", this.get_name()), UVM_MEDIUM)`uvm_do (req)`uvm_do_with (req, { data == 8'h4e;addr == 8'ha1; })`uvm_do_pri (req, 9)`uvm_do_pri_with (req, 3, { data == 8'hc5; })`uvm_info ("BASE_SEQ", $sformatf ("Sequence %s is over", this.get_name()), UVM_MEDIUM)endtask...
endclass变量req已在序列类的参数中声明并定义,其类型为my_data。uvm_do_*宏将默认使用内置的m_sequencer执行序列。若需在其他用户自定义的sequencer上执行该序列,则需调用uvm_do_on_*宏,示例如下:
`uvm_do_on          (SEQ_OR_ITEM, SEQR)
`uvm_do_on_pri      (SEQ_OR_ITEM, SEQR, PRIORITY)
`uvm_do_on_with     (SEQ_OR_ITEM, SEQR, CONSTRAINTS)
`uvm_do_on_pri_with (SEQ_OR_ITEM, SEQR, PRIORITY, CONSTRAINTS)Structure

注意:所有宏均使用UVM中的define进行编码,每个宏都会调用uvm_do_on_pri_with并传入适当的参数。例如,
`define uvm_do (SEQ_OR_ITEM)`uvm_do_on_pri_with (SEQ_OR_ITEM, m_sequencer, -1 {})`define uvm_do_on_with (SEQ_OR_ITEM, SEQR, CONSTRAINTS)`uvm_do_on_pri_with (SEQ_OR_ITEM, SEQR, -1, CONSTRAINTS)