
如果你的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验证平台等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)