目录
1 新手上路
序列间互动
事务的传输需要通过以下几个核心类来实现:
uvm_sequence_item uvm_sequence uvm_sequencer uvm_driver
它们之间的关系可以比喻为:sequence就是道路,sequnence_item就是道路上行驶的货车,sequencer就是目的地的关卡,driver就是最终卸货的地方。
整个过程的互动关系:
- sequence产生目标数量的内容不同的item(随机化)。
- item经过sequencer再流向driver
- driver拿到item后,解析发送给dut形成有效激励
- 当必要时,driver可以返回rsp给item对象再返回给sequencer,最终抵达sequence。目的在于检查driver图dut的互动状态。
过程中需要注意的是:
sequence_item是每次互动的最小粒度内容,包含相应的成员变量和方法;
sequence可以产生多个item,也可以包好多个sequence,使其具有层次化,可以看做是产生激励内容的载体
sequnencer是driver和sequnence之间的桥梁,它和driver都是组件类型,相互间的通信使用TLM端口,通信参数就是sequence_item类型。还可以在面向多个并行sequence时,仲裁分配。(存在的原因)
driver永远喂不饱,一直想要get_item。
继承关系
从图中可以看出,item和sequence都继承于uvm_object,所无法通过phase机制和config-db对其直接做相应运行和配置。(phase机制和config机制都是针对组件进行操作的)。
所以,sequen必须挂载到sequencer组件上间接获取相关配置参数和信息。
总结
数据传输方式采用的是get模式,即driver不断的从sequencer中拿到item.原因有两点:
1 get模式下,driver到sequence的返回值是可选的;put模式下的返回值是必须的
2 get更符合sequencer的仲裁特性。
2 Sequence&Item
对于激励的生成和场景控制,是由sequencen来实现的;激励的具体数据和控制要求,是由sequence_item自己实现的。
uvm_sequence_item
sequnence_item继承于object,所以具备核心基类的方法,一般具备以下数据成员:
控制类(读写类型、数据长度、传输模式)
负载类(总线上的数据包)
配置类(控制driver的驱动行为)
调试类(标记额外信息方便调试