当前位置: 代码迷 >> 综合 >> SystemVerilog VMM Workshop Lab Guide(LG)学习笔记-Lab2 VMM Transaction Atomic Generator
  详细解决方案

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

热度:84   发布时间:2024-01-15 12:31:54.0

    vmm_data中的重要函数有allocate(), compare(), copy(), copy_data(), display(),psdisplay(),

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

定义Packet约束

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

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

    例如Generator中

Xaction tr;function new(...);
endfunctiontask 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();
endfunctiontask 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变量就不会被约束了。

  相关解决方案