Process vs Thread


In the context of SystemVerilog, is there a difference between the terms ‘process’ and ‘thread’?
LRM seems to use both of these terms (for example when describing a fork-join block).
Are they considered interchangeable?

Best regards,
Jung Ik Moon

In reply to Jung Ik Moon:

I would consider the terms more or less interchangeable within SystemVerilog LRM. In the software OS world, a process is a container of one or more threads executing in a protected memory space.

My personal preference in SystemVerilog is using a process more like a declarative construct, like an always, initial, or fork block, and a thread as the active execution of statements within the the process. So there is always a one-to-one correspondence between a process and the thread of execution. In a fork/join_none block, each statement within the block creates a process, but their threads do not start executing until the parent thread blocks or terminates.

In reply to dave_59:

Hi Dave,

Thanks for the explanation.

Best regards,
Jung Ik Moon

In reply to dave_59:

If we look at the parent-child relationship, there are some interesting findings from LRM:

  1. we can find parent process, parent thread and child process in the LRM.
  2. we can not find child thread in the LRM, but we can see this statement “When a new dynamic thread is created, its RNG is seeded with the next random
    value from its parent thread.”
  3. we can find dynamic process and dynamic thread.


  1. there is only thread stability.
  2. In VPI object model diagram, there is a separate section for process and thread.
    • process diagram contains initial, already and final
    • thread diagram shows parent-child relationship

In reply to robert.liu:

  1. there is also subprocess and child subprocess.

  2. we always kill or terminate a process, rather than a thread.

  3. The RNG is localized to threads and objects while it is also said “The RNG of a process” or “The state of the RNG associated with a process”.

  4. there is multithreaded.

In reply to robert.liu:

There is a built-in process SV class so we can see process in SV source code. Threads seems to exist only inside simulator kernel hence we can only access them through VPI.

In reply to dave_59:

Hi Dave,

The issue of proper use of threads and fork/join statements seems to always get me wrapped around the axle. Can you recommend a good reference paper (preferred) or conference proceedings on this subject? For that matter, if you have good technical paper library you can share with everyone, please let us know.


In reply to Robert.Lanier:

I don’t recall seeing an article devoted to fork/join statements other than as part of a full SystemVerilog course. But that doesn’t mean one doesn’t exist :)

Here are two links to libraries of resources.