【发布时间】: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