tomako123

导航

2.3.1---加入transaction

transaction概念:

可以简单地将transaction理解为一个包,在不同的验证平台中的transaction也不相同。

一个简单的transaction如下:

在这些代码中,其中dmac是48bit的以太网目的地址,smac是48bit的以太网源地址,ether_type是以太网类型,pload是其携带的数据大小,通过pload_cons约束可以看到,其大小被限制在46~1500byte,CRC是前面所有数据的校验值。这里的post_randomize只是为了演示所以放了空函数。post_randomize是sv中提供的一个函数,当某个类的实例的randomize函数被调用后,post_randomize会紧随其后无条件地被调用。

一:my_transaction的基类是uvm_sequence_item

在uvm中,所有的transaction都要从uvm_sequence_item中派生,只有这样才能使用UVM强大的sequence机制。

二:这里没有使用uvm_component_utils宏来实现factory机制,而是使用了uvm_object_utils

从本质上来说,my_transaction和my_driver是有区别的,在整个仿真周期之内my_driver是一直存在的,my_transaction不同,他有生命周期。它在仿真的某一个时间产生,经过driver驱动,再经过reference model处理,最终由scoreboard比较完成后,其生命周期就结束了。

首先在main_phase中:
23:实例化my_transaction
24:提起objection
31:先用randomize将tr随机化,之后通过driver_one_pkt任务将tr的内容驱动到DUT的端口上。
drive_one_pkt中,先将tr中所有数据压入队列data_q中,再把data_q中所有的数据弹出并驱动

posted on 2024-05-17 16:58  甜豆莎的辣白菜  阅读(1)  评论(0编辑  收藏  举报