如何将analysis_port连接至uvm_sequence传递DUT状态信息
核心结论
没有办法直接将analysis_port连接到uvm_sequence。本质原因是uvm_sequence继承自uvm_object,不属于UVM组件树中的uvm_component节点,没有完整的phase生命周期回调,自然无法在connect_phase阶段完成TLM端口的绑定操作,这是UVM底层机制决定的,没有奇技淫巧可以绕开。
可行实现方案
- sequencer中转方案(首推)
这是改动最小、最符合UVM设计哲学的方案,适配你当前已部署analysis_port的现有平台:
- 在挂载该store序列的对应sequencer中,例化一个
uvm_analysis_imp实例,在sequencer的connect_phase中,将环境中输出写穿完成事件的analysis_port连接到这个imp端口。 - 在sequencer中实现imp对应的
write()函数,函数内将收到的写穿完成事务(建议携带每笔store的唯一事务ID、地址、数据等匹配信息)存入内部队列,同时触发一个uvm_event通知事件到达。 - 你的写激励sequence中,每发送完一笔store事务,就通过类型转换后的sequencer句柄(即常用的
p_sequencer),阻塞等待对应事务ID的写穿完成事件,确认当前store已经在缓存输出端完成写穿后,再启动下一笔激励的发送。
针对你的write-through缓存验证场景,加事务ID匹配逻辑可以避免DUT乱序返回时的误触发,保证每一笔激励严格等前一笔写穿完成再发,完全满足序列的约束要求。
uvm_tlm_fifo中转方案
如果不想修改现有sequencer的代码,可以选这个方案:
- 在验证环境的env层级例化一个
uvm_tlm_fifo,在env的connect_phase中,将输出写穿事件的analysis_port连接到fifo的analysis_export端口。 - 在env的
build_phase或者connect_phase中,通过uvm_config_db将这个fifo的句柄发送到对应sequencer的可见路径下。 - sequence运行时,先从
uvm_config_db拿到fifo句柄,每发完一笔store事务,就调用fifo的get()任务阻塞等待,直到拿到匹配当前事务的写穿完成项,再继续发下一笔。
这个方案要注意config_db的路径配置必须完全匹配,否则sequence会拿到空句柄报运行错。
- 全局事件池同步方案
这是最轻量的快速实现方案,适合不需要传递复杂事务上下文的简单场景:
- 在监测写穿完成事件的monitor组件中,每捕获到一笔写穿完成事务,就从全局
uvm_event_pool中取出对应事务ID的事件,调用trigger()触发。 - sequence中每发完一笔带唯一ID的store事务,就从同一个
uvm_event_pool中取出对应ID的事件,阻塞等待触发即可。
这个方案的缺点是事件本身不带事务载荷,如果需要校验写穿的数据、响应状态等信息,需要额外配合共享存储结构传递数据,可维护性不如前两个方案。
场景选型建议
针对你当前直写缓存验证、sequence需严格等前一笔store写穿完成再发下一笔的需求,优先选择sequencer中转的方案。该方案完全复用现有
analysis_port的监测链路,不需要额外新增环境组件,事务匹配逻辑收敛在sequencer中,sequence只需要保持“发激励-等对应完成”的线性流程,代码可读性和稳定性最高,后续扩展多sequence并发、乱序响应处理的成本也最低。
内容的提问来源于stack exchange,提问作者Melandru's Square
相关产品推荐
相关产品推荐

