uvm_do sequence marcos
在《 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)