您的位置:首页 > 产品设计 > UI/UE

SystemVerilog VMM Workshop Lab Guide(LG)学习笔记-Lab2 VMM Transaction & Atomic Generator

2012-11-01 23:39 1271 查看
vmm_data中的重要函数有allocate(), compare(), copy(), copy_data(), display(),psdisplay(),

在Packet.sv中添加vmm_log与随机数据成员,log声明为static

定义Packet约束

使用allocate()代替new(),便于重用.

这是一种类似$cast()的处理方法:

例如Generator中

Xaction tr;

function new(...);
endfunction

task run();
tr = new();
assert(tr.randomize());
tr.send();
endtask
这种情况下,如果想在上层test中使用Xaction的派生类My_xaction就不能了,因为Generator初始化之后,新对象无法赋给tr.一种思路是将tr的初始化放在new()中,但是这样会导致每次run使用的tr都会指向同样的tr对象,这并不是期望的结果。可以采用的解决办法是:

Xaction blueprint;

function new(...);
blueprint = new();
endfunction

task run;
Xaction tr;
if(!$cast(tr, blueprint.allocate())) ...
endtask

这样很容易使用派生类替换blueprint.

填充copy函数

$cast(dest_var, source_exp);

copy函数的两种用法:

1. $cast(cbja, objb.copy()); 将obja的内存回收,赋予新内存,再将objb的内存中的内容复制到obja

2. objb.copy(obja); 这样操作obja的内存仍然存在,将objb的内容复制到obja中。这在以同步/通信为目的保留资源是会使用到。

通过channel在transaction中传递对象`vmm_channel(Packet),建立channel

添加`vmm_atomic_gen(Packet, "Packet Gen"),建立Generator

在build()中将Packet_atomic_gen对象gen中的属性stop_after_n_insts置为cfg中的run_for_n_packets

stop_after_n_insts的作用为生产该值的对象,发送至channel后generator停止,发出vmm_notify::DONE

添加get.out_chan()的sink()方法,丢弃生成的数据,以免堵塞。注意使用该方法后channel常空,不要设法get()

在start()中添加gen.start_xactor();会自动调用main()方法。

在wait_for_end()中等待gen()的结束,在stop()中使用gen的stop_xactor()方法。当调用wait_if_stopped方法和wait_if_stopped_or_empty时,transactor会停止。

从Packet中派生出一个子类,约束其只产生长度为2~4之间的payload,将对象赋给gen的randomize_obj

这个lab中值得注意的是:约束名一样时,派生类的约束可以覆盖基类的约束。这里采用的是完全覆盖方式,假如约束valid中约束了a,b两个rand变量,而派生类的约束valid只约束了b变量,那么派生类中对象里的a变量就不会被约束了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: