内容
sequence概述
- uvm_sequence_item - 数据建模
- uvm_sequence - 产生数据
- uvm_squencer - 将产生的数据给到driver
- uvm_driver - 数据驱动给dut
- sequencer是uvm组件,一个sequencer可以调用多个sequence
uvm_squence class普通成员
sequence执行流程
- sequencer和driver是在agent中进行例化的
- sequencer中可以设置默认的sequence,设置完成之后,会自动执行sequence中的body(),另外会自动执行driver中的get_next_item()
- sequencer中的start()函数会调用sequence中的body()函数,body()会产生sequence item
- body()产生数据,driver消耗数据
流程到代码的映射
- 在main_phaze或者是run_phaze中,使用一个forever死循环
- req是传递进来的transaction item
- seq_item_port - squencer和driver的接口,可以调用方法
- seq_item_port.get_next_item(req) - 获取传入的transaction item
- seq_item_port.item_done() - 表示传递过来的transaction item已经处理完了,此时会告诉sequence已经处理完了,可以通过sequence产生下一笔数据
- sequence中的body()函数通过objection机制控制进行TB运行
- `uvm_do(req) - 产生激励然后发送出去,先产生一个req,然后调用randomize()进行随机化,然后将req发送出去
- req就是一个transaction对象
- 所有的宏不用加分号
sequence class要求
- 自己的sequence必须从uvm_sequence扩展出来
- body()使用task进行书写
- body()函数是需要sequencer进行调用starting_phase()函数进行显式调用的
- set_default_sequence() - 设置默认的sequence,并且执行其中的body()
- 没有设置默认的sequence,需要显示调用body()
User Sequence with callback
手动创建和发送sequence item
sequencer和driver之间的通信机制
- sequencer中调用sequence中的body()方法产生数据,产生的数据如何传给driver呢?
- start_item(req)执行之后会找到对应的sequencer
- sequencer中有wait_for_grant()被启动
- sequencer执行begin_tr(req),开始数据传输,数据传输给driver
- driver在run_phaze的时候执行get_next_item(req) - 获取到数据之后继续向下执行
- driver执行完成之后,会执行item_done(),返回给sequencer中的finish_item(req)中的wait_for_item_done(),然后就执行完成了一次传输
sequence中的randc随机变量
验证工程师可以实现scenario sequence
- 可以创建一组sequence
- uvm_send() - 只是传输数据,没有randomize动作
嵌套sequence
在测试案例中执行user sequences
- 使用uvm_config_db - 设置执行哪个sequence