UVM之sequencer
1.UVM Sequencer含义
Sequencer 就是 sequence 和 driver 间的 “交通枢纽 ”。
在 UVM 里:
- Sequence:负责产生激励(发什么数据、怎么发)
- Driver:负责把激励转成时序信号(驱动 DUT 接口)
2.作用
sequence与driver两者不能直接通信,必须通过 Sequencer 中转。Sequencer作用:
- 接收来自 Sequence 的 transaction;响应 Driver 请求,把 transaction 交给 Driver
//TLM 通信通道
//Driver 通过 seq_item_port
//Sequencer 提供 seq_item_export
//两者通过 connect() 连上:
driver.seq_item_port.connect(sequencer.seq_item_export);
- 缓存、排队、调度
- 多个 sequence 同时发激励
- Sequencer 负责:优先级、抢占、锁定、仲裁
- 保证 Driver 一次只拿到一个 transaction
- 提供上下文环境
Sequencer 里可以放:config 对象;寄存器模型;事件、旗语;virtual sequencer 里的其他子 sequencer:sequence 可通过 p_sequencer 访问。 - Virtual Sequencer(高级功能)
当有多个总线(AXI、UART、I2C)时:每个总线有自己的 sequencer,顶层一个 virtual sequencer 把它们全部挂在一起,virtual sequence 统一调度
3.使用场景
//driver主动请求
seq_item_port.get_next_item(tr); // Driver 向 Sequencer 要 transaction
//sequence发送
start_item(tr);
finish_item(tr); // Sequence 通过 Sequencer 发给 Driver
//Sequencer定义,uvm_sequencer #(TR) → 内置了 TLM 端口、队列、调度机制
class my_sequencer extends uvm_sequencer #(my_transaction);
`uvm_component_utils(my_sequencer)
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
endclass
4.m_sequencer /p_sequencer 关系
m_sequencer:sequence 内部指向 sequencer 的基类句柄
p_sequencer:指向真实类型的子类句柄(uvm_declare_p_sequencer)
本质都是指向同一个 Sequencer 实例,只是类型不同。
- uvm_declare_p_sequencer = 强转 sequencer 指针
- p_sequencer = 你自己的 sequencer,能访问所有成员
- 没有这个宏,你在 sequence 里拿不到 config/reg_model
