进程常见问题
  1. fork_join、fork_join_any 和 fork_join_none 之间的区别
fork_joinfork_join_anyfok_join_none
在 fork_join 中,主(父)线程在 fork_join 中的所有线程(子线程)执行完毕后才会执行在 fork_join_any 中,如果任何一个子线程执行,则主(父)线程执行在 fork_join_none 中,子线程和主(父)线程同时执行
  1. 我们可以在 fork_join 中使用 wait_fork 吗?

我们知道,在 fork_join 中,仅当 fork_join 中的所有线程执行完毕时,主线程才会执行,因此不需要使用 wait_fork。 我们可以在 fork_join_any 或 fork_join_none 语句后使用 wait fork,以等待 fork-join_any 或 fork_join_none 中的所有线程完成。 因此,在 fork_join 中不需要 wait_fork。

  1. 阻塞和非阻塞赋值的区别
阻塞非阻塞
在阻塞赋值中,一条语句执行完毕后,下一条语句将执行,即右侧表达式的第一个表达式被评估并立即分配给左侧变量在非阻塞赋值中,对当前时间单位的所有右侧表达式进行评估,并在时间单位结束时分配给左侧变量
由 " = " 表示由 " <= " 表示
它按顺序执行它并行执行
阻塞用于组合逻辑非阻塞用于时序逻辑
  1. wait event 和 @ event 之间的区别

如果我们在相同的延迟下触发 wait 和 @,那么 wait 语句会被执行,因为 wait 捕获速度比 @ 快。

  1. 我们可以使用不同延迟执行 wait 和 @ 吗?
module tb;    
    event e;  
    initial begin  
    #20 ->e;  
   $display($time,"thread1");  
   end  
  initial   
    begin  
     #25 @e;  
     $display($time,"thread2");  
    end  
  initial   
   begin  
   #15 wait(e.triggered);  
   $display($time,"thread3");  
   end 
endmodule  

在上面的例子中,我们可以看到事件、wait 和 @ 的延迟是不同的。我们还可以看到这里 @ 的延迟大于事件的延迟,而 wait 的延迟小于事件的延迟,所以这里只有 wait 语句与事件的延迟一起执行。因此,在下面的图中,我们可以看到线程 1 和线程 3 使用相同的延迟(#20)执行。

Untitled Diagram drawio (7)

On this page:
Tags
sv