sequence
启动
- 通过uvm_config_db:set default_sequence 来指定启动sequence的sequencer。
- 通过sequence.start(sequencer)来启动
仲裁机制
多个sequcence指向同一个sequencer 且并行时,sequencer的仲裁算法来确定,通过seqr.set_arbitration(XXX)来设置,有如下集中参数定义:
- SEQ_ARB_FIFO
- SEQ_ARB_WEIGHTED
- SEQ_ARB_RANDOM
- SEQ_ARB_STRICT_FIFO
- SEQ_ARB_STRICT_RANDOM
- SEQ_ARB_USER
锁(支持动态设置)
- lock:占用
- grab:优先占用
- is_relevant:设置失效
系列宏
- ·uvm_do
- ·uvm_do_with
- ·uvm_。。。
sequence 成员变量
sequencer的内置成员变量m_sequencer ,即sequence绑定的sequencer,但是此m_sequencer的类型是uvm_sequencer_base,如果要在sequence中使用其绑定sequencer的属性则需要定义p_sequencer:
`uvm_declare_p_sequencer(my_sequencer)
嵌套sequence
通过·uvm_do_* 可以item,也可以是sequence
可以在sequence中 do多个sequence ,串行或并行控制。
虚拟sequence
只实现sequence-sequencer控制,本身不与driver有关联。
实现多个sequencer之间的控制。
定义v_sequencer,并将实际的sqr在v_sqr中进行例化连接;
定义v_seq,在body函数中·uvm_do_on squence,多个sequence之间的顺序控制,eg:
fork
·uvm_do_on(seq0,p_sequencer.p_sqr0
sequence通过uvm_config_db设置或获取配置参数
一般在build_phase中设置和获取参数,先set 后get。
- 一般在build_phase中set和get:由于UVM的build_phase是按照层次结构从上到下执行的(即父组件先于子组件),因此,在父组件中设置的配置信息可以在子组件的build_phase中被检索。只要保证在子组件尝试检索配置信息之前,父组件或更高层次的组件已经设置了这些信息,就可以确保get方法在set方法之后执行。
- 如果在task中设置参数,怎样保证先set 后get呢,uvm_config_db提供了wait_modified任务,wait生效后再执行get 即可。
response
- sequence 中的get_response,driver中 put_response
- rsp和req的类型可以不同,参见p208
sequence library
将多个sequence注册到一个sequence_library中,seq_lib 相当于一个seq
通过selecion_mode 来控制选择算法,来控制seq_lib中sequcne的选择机制:
UVM_SEQ_LIB_RAND
UVM_SEQ_LIB_RANDC
UVM_SEQ_LIB_ITEM
UVM_SEQ_LIB_USER