Thread in SystemVerilog
-
SystemVerilog 에서 아래 경우의 실행은 하나의 thread를 생성함
- Each initial procedure
- Each final procedure
- Each always, always_comb, always_latch, and always_ff procedure
- Each paralle statement in a fork-join ( or join_any or join_none ) statement group
- Each dynamic process ( eg. task in class )
- Each continuous assignment
-
시작점과 종료점이 있는 process를 하나의 thread라고 하며, 위의 모든 경우는 하나의 thread를 형성할 수 있다.
Thread in SystemVerilog Testbench
- Testbench내의 component들은 concurrent 하게 동작하게 되며, 각각의 component는 하나의 thread를 형성함
- 앞절에서 설명한 모든 구문들이 SystemVerilog에서 concurrent한 하나의 thread를 형성하지만, 본 장에서는 Testbench에서 사용하는 program block에서의 사용에 대해서만 다루도록 함
- Single program에서 동시에 실행되는 task들로 부터 multiple thread를 형성한다
Creating Concurrent Threads in TB
- Testbench program의 initial block이나, class component들에서 concurrent threads 는 fork - join 을 사용하여 기술 함.
- fork - join 내의 statements 는 병렬로 concurrent 하게 실행됨
- fork - join 내의 begin - end로 감싸진 statement들은 순차적으로 실행되는 하나의 concurrent thread를 형성함.
-
Concurrent thread들간에는 미리 정해진 실행 순서는 없음
-
fork - join 구문의 형식
int a, b, c; //parent variables
fork
[fork local declarations] // visible to all child threads
statement0;
begin
statement1;
statement2; // statement1 and statement2 execute sequentially
end
join | join_any | join_none // join options
statement3;
- join option
fork
statement_1;
statement_2;
statement_3;
join | join_any | join_none
statement_4;
Option | Description |
---|---|
join | statement_4를 실행하기 전에 모든 child thread가 실행되고 끝나야 함 |
join_any | statement_4를 실행하기 전에 1개의 child thread가 실행되고 끝나야 함, 다른 child thread는 계속 진행 |
join_none | child process들이 queue 되고, parent thread가 끝나거나, blocking statement를 만났을때 child process들 시작함 |
Concurrency in Simulator
- Simulator 는 single core CPU에서 한순간에 하나의 thread만을 처리함.
-
따라서 Multiple thread는 하나의 simulation time 시점에서 하나씩 실행하기 위해서 queue 형태로 schedule 되어야 함.
-
SystemVerilog에서 Thread의 실행
- Thread가 한번 실행이 되면, blocking statement를 만날때까지 진행, child thread는 queue에 등록이 됨
- blocking statement를 만났을 때, queue에 등록이 되고, 이전에 queue된 ready thread가 실행됨
- 모든 thread가 block 되면, simulation time이 하나 진행됨.
-
Blocking statement의 예 :
@( my_if.cb ) ;
wait ( my_var == 1 );
# 20ns;
join_any, join
등
-
Thread 실행 모델 ( 실제구현과는 관련이 없음. 이해를 돕기 위한 개념 그림 )
- Thread를 실행할 때, 모든 threads는 아래의 queue들에 놓이게 됨
- READY queue - 현 simulation time에 실행 되어야 할 것들
- WAIT queue - 실행시, blocked 된 thread들로 해당 wait조건이 만족될때 까지 존재
- Thread 실행시, blocked 되면 일단, WAIT queue로 올려 지고, 다음 thread들이 실행된다
- READY queue에 존재하는 thread가 없으면 simulation time을 진행 시킨다