富顺门户网
国际新闻 当前位置:首页 > 国际新闻 > 正文

UVM sequence 笔记

sequence

Read 《UVM实战》 Book Notes

sequence Foundation

Reason for Stripping动机

由此带来的最大问题之一是gen_pkt函数的重复定义,这显然是不允许的。为了避免重复定义,有两种策略:第一种是

使用虚函数。在代码清单6-3中将gen_pkt定义为虚拟类型,然后从my_driver中派生一个新的

crc_err_driver,并在构建带有crc错误的测试用例时重载gen_pkt函数。然而,这个新问题又出现了。如何在这个测试用例中实例化这个新的驱动程序?似乎只有一个我的经纪人[1]可以重新定义。为了实例化这个新代理,只能重新定义一个my_env。这种解决方案显然是不可取的。第二个解决方案

formula是使定义的函数的名称不同,但是不同名称的函数不能在驱动程序的main_phase中执行。

这是一个相当困难的问题。使用SystemVerilog提供的一些接口是不可能的。为了解决这个问题,UVM引入了序列

机制。在解决问题的过程中还使用了工厂机制、配置机制

序列启动和执行。

在同一序列上启动多个序列(交替运行)

直接启动start task

start

uvm _ config _ db # with default _ sequence(uvm _ object _ wrapper): set(this,

"env.i_agt.sqr.main_phase ",

"default_sequence ",

case 0 _ sequence : type _ id 3: get());

首先实例化要启动的序列,然后通过default_sequence启动

42 case0 _ sequence cseq

43 super.build_phase(阶段);

45 cseq=new(“cseq”);

45 cseq=new(“cseq”);

46 uvm _ config _ db #(uvm _ sequence _ base): set(此,

47 " env . I _ AGT . sqr . main _ phase " ,

48 " default _ sequence " ,

49 cseq);

当序列开始时,它将自动执行序列的主体任务。事实上,除了body,sequence pre_body和post_body

sequence

uvm_do_pri和uvm_do_pri_with的仲裁机制将被自动调用,以改变transaction _ do _ pri (m _ trans,100)

seq _ ARB _ FIFO的优先级。严格遵循先进先出的顺序,不考虑优先级。

SEQ _阿尔巴_加权是加权仲裁;SEQ随机完全是随机选择;SEQ严格先进先出严格按照优先级

SEQ严格随机严格按照优先级。当有多个序列具有相同的优先级时,从最高优先级中随机选择

SEQ _阿尔巴_用户是一种新的仲裁算法,用户可以自定义

lock。当所有先前的请求被处理时,序列发生器开始响应该锁定请求,并且序列发生器将持续发送该序列的事务,直到解锁操作被调用为止。抓取操作也被用于临时拥有序列发生器。只有抓取操作具有比锁定操作更高的优先级

序列可以通过重载is _ relevant function

sequence relevant宏

UVM _ DO _ ON(TR,THIN)而无效。M _序列器)

` UWM _ DO _ ON _ WITH(TR,THIS,{TR。公共科学图书馆。尺寸==100。})

`uvm_do_on_pri_with(tr,this,100,{ tr . pload . size==100;})

uvm_create宏用于实例化事务。当事务被实例化时,它可以被更多地处理。处理后,

uvm_rand_send宏类似于uvm_send宏。唯一的区别是它使交易随机化。前提是已经为事务分配了空间

start_item和finish_item。在使用这两个任务之前,首先实例化事务

tr=new(“tr”);

开始_项目(tr);

finish _ item(tr);

增加uvm_do系列宏的功能。

UVM提供了三个接口:前置_do、中间_do和后置_do

sequence Advanced

写一个新序列,它可以交替生成上述两个

class case 0 _ sequenceextensions UVM _ sequence #(我的_事务);

虚拟任务主体();

my _ transaction tr

repeat(10)begin

uvm _ do _ with(tr,{ tr . CRC _ err==0;

tr . pload . size()==1500;

tr.dmac==48 ' hF675})

uvm_do系列的宏,其第一个参数可以是一个指向事务的指针。它也可以是某个sequence

在一个序列的主体中,除了使用uvm_do宏生成事务之外,实际上它还可以启动其他sequence

uvm_do系列的宏,其第一个参数可以是一个指向事务的指针。它也可以是某个sequence

在一个序列的主体中,除了使用uvm_do宏生成事务之外,实际上它还可以启动其他sequence

uvm_do系列的宏,其第一个参数可以是一个指向事务的指针。它也可以是某个sequence

transaction类型的指针,将两个不同的事务匹配到同一个序列器。序列器和驱动程序可接受的数据类型需要设置为uvm_sequence_item:使用转换

M_sequencer是属于每个序列的成员变量。一个宏:内置

UVM _ DECLARE _ p_sequencer(序列器),然后m_sequencer通过转换自动转换为p_sequencer。此过程在前置体()之前完成。在序列中,成员变量p_sequencer可以

直接用于引用

class case 0 _ sequenceextensions

uvm _ sequence #(my _ transaction);

my _ transaction m _ trans

uvm _ declare _ p _ sequencer(my _ sequencer)

my _ sequencer p _ sequencer;

……

虚拟任务体();

……

repeat(10)begin

` uvm _ do _ with(m _ trans,

{ m _ trans . dmac==p _ sequencer . dmac;

m _ trans . smac==p _ sequencer . smac;})

结束.

endtask

endclass

可以按照基本顺序编写许多常见的函数或任务。Uvm_declare_p_sequence用于声明p_sequencer

join_none的特性:在结束任务时,系统认为该序列已经被执行。系统将清理它占用的内存空间,并“杀死”它启动的进程,因此4个启动的dseq在它们完成之前被直接杀死。

在测试中使用虚拟序列

实例化2 env0,env1

要求驱动0在驱动1发送数据包之前发送一个最大长度的数据包-send _ over;

send_over

virtual意味着它根本不发送事务,它只控制其他序列,而统一调度

virtual序列是使用最多的宏。

seq 0 . start(p _ sequencer . p _ sqr 0);手动启动

以定义cfg_vseq。在虚拟序列中,只在最上面的虚拟序列中启动其他虚拟序列来控制对象。序列是序列中的一个对象。现在在

UVM树上找不到它。设置第二个路径参数时很难确定。使用config _ db: get函数按顺序获取参数的最大障碍是路径问题

uvm _ config _ db #(int):3360 set(这是“env.i _ agt.sqr. *”,“count”,9);

uvm _ config _ db #(int):3360 get(null,get _ full _ name()," count ",count)

第一个参数必须是组件,并且序列不是组件。

所以这个指针不能在这里使用,只有null或uvm _ root: get()。如前所述,当使用空值时,UVM将自动将其替换为UVM _根:get(),加上第二个参数get_full_name(),并且可以完全获得该序列的路径,从而获得参数

UVM _ config _ db #(位):3360set (UVM _根:3360get(),“UVM _测试_ top.env0.scb”,

“CMP _ en”,0);

Sequence LIBRARY

UVM _ OBJECT _ UTILS(简单_ SEQ _库)

一个是表示当从uvm_sequence派生时,由这个序列库生成的事务的类型。这与公共序列

2在其新函数中调用init_sequence_library相同,否则其内部候选序列队列为空init _ sequence _ library();

第三个是调用uvm_sequence_library_utils来注册“UVM _ Sequence _ Library _ Utils(简单_ SEQ _ Library)”。

uvm_add_to_seq_lib有两个参数,第一个是序列的名称,第二个是要添加的序列库的名称。一个序列可以添加多个不同的序列库` uvm _ add _ to _ seq _ lib (seq1,simple _ seq _ lib)

use sequence _ lib _ CFG

CFG=new(“CFG”,uvm _ seq _ lib _ randc,5,20)

xind : Zen-triavversion



富顺门户网 版权所有© www.drsyd.cn 技术支持:富顺门户网 | 网站地图