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;

 

posted on   知北游。。  阅读(632)  评论(0编辑  收藏  举报

编辑推荐:
· .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吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示