RE: [sv-ec] RE: [sv-bc] Can a function contain a fork/join/any/none?

From: Stuart Sutherland <stuart_at_.....>
Date: Fri Feb 17 2006 - 22:49:58 PST
If I understand the argument in favor of fork-join_none in functions
correctly, it is that the join_none allows the function itself to execute
and return in zero time, even if the threads that are forked consume time.
I can understand the argument that C++ programmers and verification
engineers might find this useful.  BUT, in my opinion, all fork-join
constructs in functions should be illegal in SystemVerilog, which, as has
been established, is compatible with the Verilog-2001 standard (and arguably
earlier versions of the standard through wording in the text but not the
BNF).

My reasoning for not allowing fork-join in functions is because
Verilog/SystemVerilog is a hybrid verification AND hardware modeling
language.  It is NOT a pure programming language like C++.  I think that for
intuitive simulation behavior of hardware models, is important to maintain
the restriction that a function execute in zero time, including not allowing
a function to spawn threads that potentially consume time.

For the verification and/or IP scenario that Arturo describes, there is a
simple, and obvious, change that maintains all the advantages Arturo pointed
out.  Make the class method a task instead of a function.  Having class
methods that can be either a function or a task allows verification
engineers to have the coding functionality needed.  And it allows functions
to have the restrictions that hardware simulation behavior that is important
in a Hardware Description Language.

Just my thoughts on the topic.

Stu
~~~~~~~~~~~~~~~~~~~~~~~~~
Stuart Sutherland
stuart@sutherland-hdl.com
+1-503-692-0898
  

> -----Original Message-----
> From: owner-sv-bc@eda.org [mailto:owner-sv-bc@eda.org] On 
> Behalf Of Clifford E. Cummings
> Sent: Friday, February 17, 2006 6:41 PM
> To: sv-ec@eda.org; sv-bc@eda.org
> Subject: RE: [sv-ec] RE: [sv-bc] Can a function contain a 
> fork/join/any/none?
> 
> Hi, Arturo -
> 
> Am I missing something here?
> 
> Don't the two threads T1() and T2() have to be 0-delay threads and 
> therefore the fork-join-none really makes no difference? (Just put 
> the two threads into the void function).
> 
> Have I missed something about classes or void functions that allow 
> delays to creep into functions?
> 
> Regards - Cliff
> 
> At 04:52 PM 2/17/2006, Arturo Salz wrote:
> 
> >When 1364-2001 writes "A function shall execute in one simulation 
> >time unit", I
> >understand that users take that quite literally as the meaning of 
> >"time consuming".
> >And, after introducing fork/join_none, which is definitely not time 
> >consuming, I
> >can understand why many people would conclude that 
> fork/join_none must be
> >allowed in functions. Frankly, I see nothing wrong with allowing 
> >fork/join_none in
> >functions. A fork/join_none is semantically equivalent to triggering 
> >the execution
> >of one or more threads from within the function, as in the 
> following code:
> >
> >             function void F();                       
> function void F();
> >                 // some initialization                   // some 
> > initialization
> >                 fork                                          -> ev;
> >                     T1();                                  
> endfunction
> >                     T2();
> >                 join_none                              
> always @ev T1();
> >             endfunction                               
> always @ev T2();
> >
> >Both versions of the above function F() accomplish the same thing, 
> >except that
> >the one on the right is more verbose and doesn't encapsulate 
> the functionality
> >as well as the one the left. If the threads triggered by the 
> >function are related
> >to the function call --- for example, they may be associated with 
> >the particular
> >transactor being created --- then the code on the right becomes a 
> >exceedingly more
> >difficult to write: For example, the function may have to add the 
> >transactor handle
> >to some dynamic data such as queue, which is then examined 
> by the threads.
> >It's also important to remember that the code on the right  cannot 
> >be written in a
> >package, thus, making life even more difficult for both model 
> >writers and users of
> >the model.
> >
> >Forking threads from within a constructor is very common idiom in 
> >both Vera and
> >C++ models. If we were to disallow this in P1800, I imagine a lot of 
> >IP writers will
> >be upset. I suspect that these are the same people that have 
> been questioning
> >Dave on the availability of this feature. I'm not advocating that 
> >SystemVerilog allow
> >all types of fork/join within functions, only fork/join_none, which 
> >is fundamentally
> >not a time consuming construct.
> >
> >Sorry for blasting this to both sv-bc and sv-ec, but I believe it is 
> >important to let
> >both committees know about this (sorry for the copies Cliff).
> >
> >             Arturo
> 
> ----------------------------------------------------
> Cliff Cummings - Sunburst Design, Inc.
> 14314 SW Allen Blvd., PMB 501, Beaverton, OR 97005
> Phone: 503-641-8446 / FAX: 503-641-8486
> cliffc@sunburst-design.com / www.sunburst-design.com
> Expert Verilog, SystemVerilog, Synthesis and Verification Training
> 
> 
Received on Fri Feb 17 22:50:07 2006

This archive was generated by hypermail 2.1.8 : Fri Feb 17 2006 - 22:51:33 PST