uvm为了什么原因才引入factory机制

uvm为了什么原因才引入factory机制,第1张

如果你的cpu env将会作为另一个更大level的一个agent组件,情况就变得有点糟糕了;

如果你的cpu env将会例化很多个,用在一个更大level的环境里,情况就变得更糟糕了;

如果你的pcie driver被作为一个component单独用在一个大环境的很多地方,且分布于树形结构的不同深度的话,简直是噩梦!

再假如,目前我有一个环境,有10个pcie driver,其中5个作为sub component用在5个cpu agent里面,另外5个pcie driver单独作为sub component用在top env(前面的5个cpu agent包含于top env中)里面。我现在想吧cpu agent里面的3个pcie driver换成rapidio driver,剩下的2个保持pcie driver不变;top level里面的5个pcie driver也有相似的需求,如果是用方法(1)改代码,那你的测试平台将会很糟糕,不具有任何可扩展性,容易出错等等

不同的需求回很多,因为需求永远是在变化的,我们需要一种方法来很好的适应这种变化,factory机制就可以做到。

据统计,2017年全国百公里交通事故死亡率为018起/10万公里,相比2016年的021起/10万公里有所下降。其中,BJ40车型的死亡率为014起/10万公里。

据统计,2017年全国百公里交通事故死亡率为018起/10万公里,相比2016年的021起/10万公里有所下降。其中,BJ40车型的死亡率为014起/10万公里。

受控随机数的产生,是SV又一个关键特性。普通基于Verilog构成的激励,基本是没有随机化的直接固定激励,大部分是由多层Verilogtask构成。即便Verilog有犹如$random这样的系统函数能够产生随机数,也很难利用它构造比较复杂的随机测试激励,且因为没有class,也很难实现激励的层次化复用以及约束。

SV的受控随机数,可以让使用者在class中定义随机变量,且对它施加约束,让它产生满足设计者要求的在某个范围内的随机变量,结果class的的各种oop用法,灵活实现了各种随机激励的产生,

随机变量有2种声明方式,rand和randc,第一种是普通的随机方式,每2次的产生没有任何关系。第2种是前后联系的,也就是在没有遍历所有可能的数之前,不会有重复的随机数出现。

随机变量的内置方法 randomize() pre_randomize() post_randomize() randomize()with constraint_mode() rand_mode()

randomize(), pre_randomize(), post_randomize() ,randomize() with 都是一个类的内置方法,当类中有变量被定义为随机变量时,可以通过调用randomize()对类中的随机变量进行随机化,并得到返回值,如果是1,则随机化成功,是0说明有相互矛盾的限制条件。pre_randomize(), post_randomize()是两个挂高接口,在randomize()的调用前后会被自动执行。方便使用者对随机化过程进行各种控制。randomize() with 可以对随机过程添加额外的约束条件。 示例如下。

class frame_t;

rand bit[7:0] data;

bit parity;

constraint c{

data > 0;

}

functionvoid pre_randomize();

begin

$write('pre_randomize : Value of data %b andparity %b\n',data,parity);

end

endfunction

functionvoid post_randomize();

begin

parity = ^data;

$write('post_randomize : Value of data %b and parity%b\n',data,parity);

end

endfunction

endclass

initial begin

frame_tframe = new();

integer i =0;

$write('-------------------------------\n');

$write('Randomize Value\n');

$write('-------------------------------\n');

i =framerandomize();

$write('-------------------------------\n');

end

以上例子对pre/post在randomize时自动执行,并且更改了随机数的生成规则。

randomize() with 则可以增加额外约束

class SimpleSum;

rand bit[7:0] x, y, z;

constraint c {z == x + y;}

endclass

task InlineConstraintDemo (SimpleSum p);

int success;

success = prandomize() with{x < y;};

endtask

rand_mode()可以用于开关整个类的随机模式,或者类中某个变量的随机模式,例如

class Packet;

rand integer source_value, dest_value;

// other declarations

endclass

Packet packet_a = new;

packet_arand_mode(0);

packet_asource_valuerand_mode(1);

constraint_mode()用于开关某条具体约束。

class Packet;

rand integer source_value;

constraint filter1 { source_value > 2 m; }

endclass

function integer toggle_rand( Packet p );

if( pfilter1constraint_mode() ) //返回当前是否打开约束

pfilter1constraint_mode(0); //关闭约束

else

pfilter1constraint_mode(1); //打开约束

toggle_rand = prandomize();

endfunction

不识别是因为:

SV报文在网络上传输时采用的是OSI模型,但只用到OSI网络模型七层中的四层,应用层、表示层、数据链路层和物理层,传输层和网络层为空。应用层定义协议数据单元PDU,经过表示层编码后,不采用TCP/IP协议,而是直接映射到数据链路层和物理层。这种映射方式的目的是避免通信堆栈造成传输延时,从而保证报文传输、处理的快速性。

SV报文在MAC层的帧结构包括:源MAC地址、目的地址即组播地址、报文类型、四字节Tag、APPID、报文长度、四字节的保留和VPDU。SV具体报文格式如图0所示。

SV举例报文(十六进制):

01 0c cd 01 40 01 00 00 01 01 40 01 81 00 00 01 88 ba 40 01 00 2f 00 00 00 00 60 25 80 01 01 a2 20 30 1e

订阅专栏 解锁全文

打开CSDN,阅读体验更佳

SV核心知识点-1_vitamin_yin的博客

4SV和UVM中对象的创建的区别:(1)在SV中new函数中不仅仅要进行new *** 作,而且还要进行对象的连接,也就是对象的连接和创建并不是完全剥离的,那么可能会出现在索引句柄的时候句柄为空的情况(2)在UVM中,由于层次化的机制出现,build phase

以上就是关于uvm为了什么原因才引入factory机制全部的内容,包括:uvm为了什么原因才引入factory机制、bj40事故死亡率、如何从零开始构建一个可用的UVM验证平台等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9815475.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存