1.2简介-seq的分类(flat_sequence, hierarchical seq, layering seq, virtual seq)
注1: 每一个sequence都应该派生自uvm_sequence, 在定义时可以指定或不指定要产生的transaction的类型,通常会指定;
注2: 每一个sequence都有一个body任务,当一个sequence启动后,会自动执行body中的代码.
1.扁平类(flat sequence)
(1)用于组织更小的粒度,比如transaction;
class bus_trans extends uvm_sequence_item;
rand bit write;
rand int data;
...
`uvm_object_utils_begin(bus_trans)
`uvm_field_int(***)
`uvm_object_utils_end
...
endclass
class flat_seq extends uvm_sequence;
rand bit write;
rand int data;
...
constraints write_c {
write==’b1;
}
constraints data_c {
...
}
`uvm_object_utils(flat_seq)
...
task body();
bus_trans tmp;
repeat(20) begin
tmp=new();
tmp.randomize() with {data==local::data; write==local::write;};
end
endtask
endclass
2.层次类hierarchical seq(属于嵌套sequence,在sequence内启动sequence)
(1) 更高层的sequence组织底层sequence,进而将这些sequence按照顺序或者并行方式,挂载到同一sequencer上.
(2) 层次类sequence与扁平类sequence的区别是前者可以使用其他hierarchical sequence, flat sequence,当然也可以使用transaction (sequence_item).
class hier_seq extends uvm_sequence; //or class hier_seq extends uvm_sequence#(bus_trans);
`uvm_object_utils(hier_seq)
function new(string name=”hier_seq”);
super.new(name);
endfunction
task body();
bus_trans t1,t2;
flat_seq s1,s2;
`uvm_do_with(t1, {length==2;});
fork
`uvm_do_with(s1, {length==5;});
`uvm_do_with(s2, {length==7;});
join
`uvm_do_with{t2, {length==3}};
endtask
endclass
注1:上图code中case0_sequence内的m_sequencer是case0_sequence在启动后所使用的sequencer的指针;
3.layering seq
(1) 产生ip_transaction的sequence以及与ip_sequence对应的sequencer:
(2) layer sequence的关键问题
关键问题是如何将ip_transaction交给产生my_transaction的sequence.由于ip_transaction是由一个sequence产生的,模仿driver从sequencer获取transaction的方式,在my_sequencer中加入一个端口,并将其实例化; 在my_agent中,将这个端口和ip_sqr的相关端口连接在一起(ip_sqr->my_sequencer->my_driver);
(3) 在my_sequence中使用ip_transaction(由于my_sequence内使用了无限循环,因此不能在其中提起或者撤销objection, objection需要在ip_sequence内控制);
(4) my_sequence与ip_sequence的启动;
(5)my_driver的实现;
注:上述示例中, item_done和try_next_item在同一时刻被调用,会导致时间槽的竞争;在item_done被调用后,并不立即调用try_next_item,而是等待下一个时钟的上升沿到来后再调用.
4.virtual sequence
(1)将内部不同类型的sequence挂载到不同目标sequencer上面. 这是virtual sequence与hierarchical sequence的不同之处.
(2)virtual sequence中不仅可以启动flat_sequence与hierarchical sequence,还可以启动virtual sequence;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?