01.03.01 Concurrency

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을 진행 시킨다
마지막 편집일시 : 2022년 11월 29일 3:06 오후