【发布时间】:2021-07-11 10:41:48
【问题描述】:
我正在尝试使用驱动程序的 run_phase 中的信号量、fork-join 和 get()-put() 方法为简单的流水线模型实现 UVM 驱动程序。
只要我以特定方式对序列进行编码,驱动程序部分就可以正常工作。据我所知,body 任务的编码如下
Code1:
pkt = packet::type_id::create("pkt"); // Factory create the sequence item
for(int i=0;i<num_trans;i++) // Repeat as required
begin
assert(pkt.randomize()); // Randomize the sequence item
start_item(pkt); //Send the request to Driver.
finish_item(pkt); //Wait for the driver to finish the current item
上述风格,没有实现流水线,而且与第一个事务包对应的数据节拍丢失。在 start_item 之后调用随机化时,测试台按预期工作。
Code2:
pkt = packet::type_id::create("pkt");
for(int i=0;i<num_trans;i++)
begin
start_item(pkt);
assert(pkt.randomize());
finish_item(pkt);
我想知道编码风格 1 和 2 有什么区别
【问题讨论】:
-
只是一个小评论,重要的是不要将 assert() 放在这些随机调用周围。有时人们会在模拟过程中关闭断言。如果他们这样做,突然之间您的随机化将不会运行,并且没有人会知道随机化被禁用。相反,您应该执行“if(!pkt.randomize()) uvm_error”或类似的操作
标签: uvm pipelining