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

    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变量就不会被约束了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值