【问题标题】:SystemVerilog : fork - join and writing parallel testbenchesSystemVerilog : fork - 加入和编写并行测试平台
【发布时间】:2018-02-21 19:19:08
【问题描述】:

我正在关注此链接上的测试平台示例:

http://www.verificationguide.com/p/systemverilog-testbench-example-00.html

我有两个关于 fork-join 语句的问题。测试环境有以下启动测试的任务:

task test();
  fork
  gen.main();
  driv.main();
  join_any
endtask

task post_test();
  wait(gen.ended.triggered);
  wait(gen.repeat_count == driv.no_transactions);
endtask

task run;
  pre_test();
  test();
  post_test();
  $finish;
endtask

我的第一个问题是为什么我们要等待在 post_test() 任务中触发生成器事件?为什么不做一个常规的fork-join,据我所知,它将等待两个线程完成后再继续。

我阅读了另一个 Stack Overflow 问题 (System Verilog fork join - Not actually parallel?),它说这些线程实际上并没有在 CPU 意义上并行执行,而只是在模拟意义上。

我的第二个问题是,如果分叉连接实际上没有并行执行,那么它们的意义何在。不会有性能优势,所以为什么不遵循如下顺序算法:

while true:
  Create new input
  Feed input to module
  Check output

对我来说,这似乎比测试台示例简单得多。

感谢您的帮助!

【问题讨论】:

  • 您所遵循的示例写得非常糟糕,我无法开始解释为什么事情会以这种方式完成。我永远不会使用events 和触发方法。他们基本上是在避免一种本来就不应该存在的竞争条件。另外 - 不要使用未参数化的邮箱,也不要使用程序块

标签: verilog system-verilog fork-join test-bench


【解决方案1】:

没有gen和drive的代码,很难说。但是,很可能驱动器和生成器都以某种方式相互通信,即gen 产生driv 消耗并驱动其他东西的数据。

如果 gen 和 drive 以 gen 输入/cousume 输入方式编写,那么您的循环将是有意义的,但是,它们很可能会根据某些事件生成和使用数据,并且不能轻易地在此类函数中轻松拆分。像下面这样的东西通常更干净。

gen:
    while() begin
       wait(some event);
       generateData;
       prepareForTheNextEvent;
    end

driv: 
    while() begin
       wait(gen ready);
       driveData;
   end

因此,由于上述原因,您不能按顺序运行它们。它们必须并行运行。出于所有编程目的,它们并行运行。更详细地说,它们在同一个单线程中运行,但 verilog 根据模拟中生成的事件安排它们的执行。所以,你需要 fork。

至于join_any,我认为,您的案例中的测试应该在任一线程完成时完成。但是,驱动程序还必须完成所有未完成的工作才能退出。因此,在 posttest 任务中有那些wait 语句。

【讨论】:

  • 我链接到代码;我不想用大量代码堵塞这个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多