[Verilog/SystemVerilog] SystemVerilog Fork-Join: 프로세스와 스레드의 동시 실행

2024. 10. 20. 18:02(System)Verilog 시스템 베릴로그

반응형

SystemVerilog에서 fork와 join은 여러 개의 병렬 프로세스를 제어하는데 사용되는 중요한 키워드입니다. 이를 이해하기 위해서는 먼저 프로세스와 스레드에 대한 개념을 짚어볼 필요가 있습니다.

프로세스 (Process)

실행 중인 프로그램 자체를 의미합니다. 하나의 독립된 작업 단위로, 프로그램의 실행 흐름을 담당합니다.

스레드 (Thread)

프로세스 내에서 실행되는 작업의 흐름을 뜻하며, 하나의 프로세스 안에 여러 스레드가 존재할 수 있습니다.


fork와 join의 기본 개념

1. Fork

fork는 병렬로 여러 프로세스를 동시에 실행시키는 키워드입니다. fork 블록 내의 모든 문장은 동일한 시점에 병렬적으로 시작됩니다.

2. Join

fork로 생성된 병렬 프로세스들이 종료될 때까지 기다리는 키워드입니다. join에는 세 가지 유형이 있습니다.

  • join: 모든 병렬 스레드가 완료될 때까지 기다린 후, 다음 구문을 실행합니다.
  • join_any: 하나의 스레드라도 완료되면 다음 구문을 실행합니다.
  • join_none: 스레드의 완료 여부와 상관없이 바로 다음 구문을 실행합니다.

 

동작 시 주의점

SystemVerilog에서 fork로 생성된 child 프로세스는 부모 프로세스가 blocking 문장을 실행하거나, 부모 프로세스가 종료되기 전까지 실행되지 않습니다. 

  • join - the parent preocess blocks until all the processes spawned by this fork complete
  • join_any - the parent preocess blocks untill any one of processes spwned by this fork complete.
  • join_none - the parent process continues to execute concurrently with all the processes spqwned by the fork. 
                        the spawned processes do not start executing until the parent thread executes a blockig statement.

위 내용을 보면,

join_none을 사용할 경우, 병렬 프로세스들은 즉시 실행되지 않고, 부모 프로세스가 blocking statement에 도달하거나 종료될 때까지 대기하게 됩니다.

이는 SystemVerilog의 프로세스 스케줄링과 실행 순서 제어를 통해 결정론적(deterministic) 동작을 보장하고, 레이스 컨디션(race condition)을 방지하기 위한 메커니즘입니다.

레이스 컨디션(Race Condition)*

 : 여러 프로세스가 동일한 자원을 동시에 접근할 때 발생할 수 있으며, 이를 방지하기 위해서는 적절한 동기화 기법을 사용해야 한다.


추가적인 Fork 제어 키워드

1. disable fork

가장 먼저 완료된 스레드 이후 나머지 병렬 스레드들을 모두 종료시킵니다. 여러 스레드 중 하나만 완료되면 전체 병렬 프로세스를 중지시킬 수 있습니다.

2. wait fork

모든 병렬 스레드가 종료될 때까지 부모 프로세스가 기다리게 만듭니다.


레이스 컨디션 (Race Condition)

여러 프로세스가 동시에 동일한 자원에 접근하려 할 때 발생할 수 있는 문제로, 이를 방지하기 위해 적절한 동기화 기법을 사용해야 합니다.

SystemVerilog의 fork-join 구문을 통해 프로세스의 병렬 실행을 제어하며, 이러한 동작은 하드웨어 설계 및 검증에서 매우 유용하게 사용됩니다.

 

반응형