Subject: RE: [sv-cc] Modified Get/Put User Data Proposal - function vs. mo dule scope
From: Warmke, Doug (doug_warmke@mentorg.com)
Date: Mon Mar 24 2003 - 09:46:34 PST
John,
Nice write-up on the issues.
I really like Francoise's proposal with your amendments.
My informal poll response is "go for it".
Also, I agree with you that this user data association
is critical for efficient implementation of systems that
rely on DPI context functions.  Sorry Andrzej, but I don't
believe this is "2nd layer" functionality that can be
postponed, since without it context functions are not
able to reach close to their full power.
Regards,
Doug
> -----Original Message-----
> From: Stickley, John 
> Sent: Monday, March 24, 2003 9:07 AM
> To: Francoise Martinolle
> Cc: Andrzej Litwiniuk; sv-cc@server.eda.org
> Subject: Re: [sv-cc] Modified Get/Put User Data Proposal - 
> function vs. mo dule scope
> 
> 
> Francoise,
> 
> This is not a bad proposal and I see it as an alternative to
> mine that can be probably be implemented just as efficiently
> (and probably nicely addresses Andrzej's concerns if my response
> on Friday did not).
> 
> It think the only difference between your and my proposals is
> that yours reserves an index for a specific user data storage
> pointer in a module scope area and mine reserves an object keyed
> to a specific function that can be called from a module scope.
> Both solutions imply that the implementation will create some
> additional structure that can be attached to the internal
> representation of a module scope that can be used to store
> user specified data pointers.
> 
> As I said, I think both could be equally efficient can
> solve the original problem that was identified, namely,
> 
> "For a given module instance scope, we need to allow multiple
> independent C models to be able to associate their local model
> context (a.k.a. user data) with the specific module instance."
> 
> This facilitates provision of multiple IP models in the form
> of imported functions in C models that can be utilized by a
> given SV module.
> 
> Let me re-frame your proposal and make a couple of minor
> suggestions for modifications. Then, below, I have another
> message address to the team to try to reach closure on
> one of the two proposals so we can be sure this important
> enhancement gets incorporated into the 1st revision of DPI.
> 
> Here are my suggestions:
> 
> 1. Perhaps we can just reserve ID=0 to denote module scope
>     and all other ID's to be some valid id returned by
>     svGetNewIdForScope()
> 
> 2. Let me suggest a slightly less vague name for your new
>     function. How about,
> 
>     int svGetUserDataIdForScope( svScope moduleScope );
> 
>     I'm open to other suggestions.
> 
> -- johnS
> 
> Team,
> 
> So at this point, I would like to request to the committee that
> we bring quick closure to this issue as time is running out
> for freezing the content of the LRM and I think it is really
> important that we reach consensus on either my or Francoise's
> proposals ASAP. I personally am open to either - in fact
> I now rather slightly favor Francoise's proposal at this point.
> 
> My main objective is to address the problem that is the
> original reason we're having this discussion. Let's go
> back and review what that is.
> 
> We had already defined and agreed to a need to be able to
> associate some user data object point with an instance of
> an SV module. Some of my examples demonstrate why C model
> to SV module instance association, at a bare minimum, is
> essential to any application that utilizes DPI context
> functions.
> 
> This feature alone is very useful and could probably
> serve a large class of applications quite nicely
> (certainly the type of applications we've been working with).
> 
> However, at one of our meetings members of the team
> justifiably raised a concern that different bodies of
> C code provided from possibly different sources or vendors
> may want to provide IP in the form of imported functions/
> C models that can a given SV module may want to make use of.
> A single user data pointer association capability just does
> not address this scenario.
> 
> So the challenge is to provide a *very* simple, efficient
> extension to what we already have to allow for this capability.
> To do that, Francoise and I have come up with 2 proposals
> which I'll summarize here:
> 
> 1. JohnS Proposal:
> 
> In my proposal, the underlying assumption is that each
> of these "C model vendors" may provide their own
> imported C function which essentially serves as the
> entry point or "method" to their C model code. With
> that assumption then, it is enough to be able to have a
> way of creating a handle representing "that function of that
> module instance" so that the combination can be
> uniquely identified by the code in question.  So to do
> that I proposal 3 additional functions in my proposal
> which is detailed here:
> 
>      http://www.eda.org/sv-cc/hm/1110.html
> 
> 2. Francoise's Proposal
> 
> Francoise's proposal solves the same problem and, in my
> view, does so equally as efficiently. It requires only
> one additional function but a change to the existing
> svGet/PutUserData functions to now require an extra
> 'id' parameter.
> 
> Here's a re-framed description of Francoise's proposal
> (Her original text is included in the following posting
> http://www.eda.org/sv-cc/hm/1137.html ):
> 
> - Allow association of multiple user defined data pointers
>    with module instances by allocating unique ID's denoting
>    each.
> 
> - The following new function is defined to request an ID:
> 
>    int svGetUserDataIdForScope( svScope moduleScope );
> 
> - This function can be called at model initialization time
>    and the returned ID can be stored in the C model and later
>    be frequently referenced during run-time.
> 
> - The functions svPutUserData() and svGetuserData() now
>    require the additional ID argument:
> 
>    void  svPutUserData(
>        const svScope moduleScope, int userDataId, void* userData);
>    void* svGetUserData(
>        const svScope moduleScope, int userDataId );
> 
> - ID=0 is reserved for association of user data with an
>    overall module scope. Simpler applications that only
>    need simple Cmodel-to-SV module association can simply
>    pass id=0 to the svGetUserData() function and therefore
>    not have to call svGetUserDataIdForScope() at initialization.
> 
> - While storage of user data for ID=0 can be combined with storage
>    for specific ID's, it is recommended that vendor supplied C
>    model IP always use allocated ID's and that only end-user
>    applications use ID=0.
> 
> I would like to request an informal poll that we quickly
> choose one of these two approaches so we can formally
> incorporate this feature into the spec.
> 
> Thanks,
> -- johnS
> 
> 
> Francoise Martinolle wrote:
> > Andrzej, John,
> > 
> > I think that there is a difference between the module scope and
> > the function scope. The function scope is used to be able 
> to associate a
> > specific user-data
> > area to a function call, while the module scope can also be 
> used for the
> > user-data and also to change scope.
> > 
> > I would suggest to create user-data scopes differently and 
> not associate
> > them with function
> > names (which seems to be of concern to Andrzej). Why don't 
> we create a new
> > DPI function which would request an ID. This new DPI 
> function could be used
> > to be able to associate user-data to a specific id within a 
> normal svScope.
> > 
> > Conceptually the scope user area will be partitioned in 
> several pieces,
> > each one of them
> > will be given an id. An imported function will be able to store some
> > user-data in the svScope
> > at a particular ID location.
> > 
> > 
> > Example:
> > 
> >   (int)svGetNewIdForScope( svScopeHdl); this functions 
> returns an id inside
> > a scope.
> > This id should be called by the imported C function at init 
> time and saved
> > for future use.
> > 
> > The function svPutUserData and svGetuserData takes an 
> additional argument
> > which is the id.
> > 
> > void svPutUserData(const svHandle scope, void* userData, int id);
> > void* svGetUserData(const svHandle scope, int id);
> > 
> > 
> > If no ID is used, the svScope user-data is a single whole 
> entity which is
> > shared by all functions.
> > We don't need svGetFunctionScopeFromName and svGetFunctionScope.
> > 
> > Francoise
> >         '
> > 
> > At 01:32 PM 3/21/2003 -0500, Stickley, John wrote:
> >  >Andrzej,
> >  >
> >  >I don't have time to give a thorough response to you
> >  >e-mail today but let me at least give some quick
> >  >comments. I'll follow with the rest by Monday.
> >  >
> >  >-- johnS
> >  >
> >  >Andrzej Litwiniuk wrote:
> >  >>  >       svScope svGetScope();
> >  >>  >       void svPutScope(const svScope scope);
> >  >>  >       svScope svGetScopeFromName(const char* instancePath);
> >  >>  >       void svPutUserData(const svHandle scope, void* 
> userData);
> >  >>  >       void* svGetUserData(const svHandle scope);
> >  >>  >
> >  >>  > To remedy this situation, I'm proposing what I think
> >  >>  > is a pretty simple, efficient solution.
> >  >>  >
> >  >>  > Basically we add 2 new functions to compliment
> >  >>  > svGetScopeFromName() and svGetScope() respectively:
> >  >>  >
> >  >>  > svScope svGetFunctionScopeFromName(
> >  >>  >       svScope moduleScope, const char *cname );
> >  >>  > svScope svGetFunctionScope()
> >  >>  >
> >  >>  > With these functions, a handle can be returned that
> >  >>  > represents a specific function of a specific module
> >  >>  > instance as an alternative to a handle representing
> >  >>  > just the module instance itself - though the latter
> >  >>  > will still be supported.
> >  >>  > -- johnS
> >  >>
> >  >>John,
> >  >>
> >  >>I'm a little concerned with the result type of the function
> >  >>svGetFunctionScopeFromName().
> >  >>What does exactly mean "specific function of a specific module 
> > instance"?
> >  >>Is it meant solely as a unique key or as an instance? If 
> an instance, 
> > then
> >  >>an instance of what?
> >  >
> >  >johnS:
> >  >It is an instance of a module calling a specific function.
> >  >It is a way of, with essentially 1 key, identifing a particular
> >  >instance of a module calling a specific function and letting
> >  >the user associate that combination with his or her own
> >  >data (c-context) pointer.
> >  >
> >  >>Are "function scope handle" and "module handle" similar 
> or different?
> >  >>Should both be of the same type? Can they be used in the 
> same context?
> >  >>I suppose NOT.
> >  >
> >  >johnS:
> >  >They are different and function scopes cannot be used
> >  >where you do an svPutScope(). But they can be used where you
> >  >do an svPutUserData() interchangeably with module scopes. In
> >  >object oriented terms you can think of them being different
> >  >but having a common derivation ancestry or "is a" relation
> >  >with a common parent class.
> >  >
> >  >For example the implementation may chose to define a "class scope"
> >  >then have classes derived from it called "moduleScope" and
> >  >"functionScope".
> >  >
> >  >The svScope itself however can be polymorphically interpreted
> >  >as (i.e. downcast to) a pointer to the base class 'scope'. It
> >  >can use common polymorphic access techniques such as virtual
> >  >functions, class type tagging, etc. to identify which type
> >  >it is and to therefore know what it can and cannot to with it.
> >  >
> >  >The reason I wanted to overload the same svScope for both
> >  >of these purposes is that it reduces the total number
> >  >of functions, data types, and complexity needed in the interface
> >  >thus making things easier for the user.
> >  >
> >  >It is analogous to how vpiHandle is a "one-serves-all" handle
> >  >in the VPI interface. In this case svScope does not "serve all"
> >  >but it does serve function and module scopes.
> >  >
> >  >>Is a scope returned by svGetFunctionScopeFromName() a 
> legitimate module
> >  >>scope? Can it be used as an argument for svPutScope()?
> >  >
> >  >johnS:
> >  >No. Passing a function scope here should cause an error.
> >  >
> >  >>svPutScope sets the scope to be used by an exported SV function.
> >  >>Which instance will be used if a scope is set to 
> "function scope"?
> >  >>It is possible, of course, to map unambiguously a 
> function scope onto
> >  >>a module scope (but not other way round!). Is it what 
> you intended?
> >  >>You intended to use either of those two categories of handles
> >  >>as an argument to svPutUserData(); as in your example:
> >  >>    >               svPutUserData( funcScope, this );
> >  >>    >               svPutUserData( dSvScope, this );
> >  >>If, however, both types of handles, "function scope" and 
> "module scope"
> >  >>cannot be used in the same context, then they are apparently two 
> > different
> >  >>types.
> >  >
> >  >johnS:
> >  >But they both derive from 'scope' as explained above so, a typical
> >  >application will chose one or the other depending on what 
> it's needs
> >  >are. This adds to the flexiblity of the interface since now you
> >  >can store data at the module instance level or at the 
> function instance
> >  >level. Which solves the basic limitation we identified in 
> the meeting
> >  >of only supporting module instance association with user data.
> >  >
> >  >>If so, then svPutUserData()/svGetUserData() will have to 
> be split into
> >  >>two versions, for functions and for modules. Not big deal.
> >  >
> >  >johnS:
> >  >I would prefer to avoid this. I think it is overkill and 
> unecessary.
> >  >
> >  >>
> >  >>I've been trying to figure out what kind of support may be needed
> >  >>from SV compiler for the above functionality. What will 
> have to be done
> >  >>at a call of imported a function and what kind of data 
> will have to be
> >  >>provided to support run-time (i.e. simulation).
> >  >>This is pretty obvious for supporting modules scope and 
> > svGetScopeFromName().
> >  >>I couldn't figure out where exactly function names may 
> be involved
> >  >>(other then for veryfying the correctness).
> >  >>If SV compiler statically reserves/allocates space for 
> "function scope"
> >  >>(have we agreeed upon restrictions, which modules, which 
> functions?),
> >  >>then function names will matter. Static scheme means 
> memory overhead.
> >  >>If, however, a dynamic scheme is used instead of a 
> static one, than
> >  >>a function name will be no more than a unique key solely, and 
> > actually any
> >  >>unique string will do! It is merely a convenient 
> coincidence, that C
> >  >>functions names must be unique and therefore may play 
> the role of unique
> >  >>keys.
> >  >
> >  >johnS:
> >  >The difference is that a string cannot be used as a direct, more 
> > efficient
> >  >pointer to an object while a handle can. Strings require hashing.
> >  >For handles the implementation may chose to use it as a 
> key for hashing
> >  >but it can also use it as a direct object pointer (which 
> I think most 
> > savvy
> >  >implementations will do in the interest of efficiency).
> >  >
> >  >>But, if this is the case, that is, if functions names 
> are just unique 
> > keys
> >  >>and no support whatsoever is needed from SV compiler, 
> then that part of
> >  >>the functionality, however useful and desired it may be, 
> doesn't seem
> >  >>to be an inherent part of DPI.
> >  >>C implementation of a specific hash table or an 
> associative array may be
> >  >>a key component of DPI applications, but it is =not= a 
> part of the
> >  >>interface. Similarly as a support for bit manipulations 
> might be a 
> > welcome
> >  >>addition to DPI, but wouldn't be a part of the interface per se.
> >  >>I don't mind if sv-cc defines a hash table with 
> <instance,function>
> >  >>as a key. But please, please: do not embed it into DPI. 
> Make it a 
> > separate
> >  >>layer. Describe it in a separate annex.
> >  >
> >  >johnS:
> >  >I'll comment more later. Sorry for my hastiness. I acually have
> >  >the day off and am about to go to Vermont !
> >  >
> >  >>
> >  >>Thanks and regards,
> >  >>Andrzej
> >  >>
> >  >>  > Now, if I call svPutUserData() passing the function scope
> >  >>  > handle rather than the module handle, I'm associating the
> >  >>  > user data with a specific imported function instance
> >  >>  > and we remove the restriction of only allowing one user
> >  >>  > data per module. Now we allow one user data
> >  >>  > per function per module.
> >  >>  >
> >  >>  > Similarly if I call svGetUserData() passing it a function
> >  >>  > scope handle, I'll get the user data associated with that
> >  >>  > specific function.
> >  >>  >
> >  >>  > Note, with this approach, I can still support the existing
> >  >>  > functionality of only setting one user data per module
> >  >>  > if that's all I really need (which often might be the case).
> >  >>  > But I can also do it per function.
> >  >>  >
> >  >>  > The following example illustrates both use models:
> >  >>  >
> >  >>  > ---------------------------------------
> >  >>  > C Side:
> >  >>  >
> >  >>  > class MyCModel {
> >  >>  >       private:
> >  >>  >           svModuleScope dSvScope;
> >  >>  >           void *processArgs( args ... );
> >  >>  >
> >  >>  >       public:
> >  >>  >           MyCModel( const char *svModulePath ){
> >  >>  >               dSvScope = svGetScopeFromName( svModulePath );
> >  >>  >               svScope funcScope = svGetFunctionScopeFromName(
> >  >>  >                   dSvScope, "MyExternedCFunc" );
> >  >>  >               svPutUserData( funcScope, this );
> >  >>  >
> >  >>  >               // Note: Here I could have also associated user
> >  >>  >               // data with a module scope instead as follows:
> >  >>  >               // svPutUserData( dSvScope, this );
> >  >>  >           }
> >  >>  >
> >  >>  >       // This imported function is called from SV ...
> >  >>  >       friend void MyExternedCFunc( args ... ){
> >  >>  >
> >  >>  >           svScope scope = svGetFunctionScope();
> >  >>  >
> >  >>  >           // Note: Here if I wanted to retreive user data for
> >  >>  >           // module scope rather than a function 
> scope, I could
> >  >>  >           // have done this in place of the statement above:
> >  >>  >           //
> >  >>  >           // svScope scope = svGetScope();
> >  >>  >           //
> >  >>  >           // This is identical the current use model as per
> >  >>  >           // sv_layer_v2.pdf.
> >  >>  >
> >  >>  >
> >  >>  >           MyCModel *me = (MyCModel *)svGetUserData( scope );
> >  >>  >
> >  >>  >           me->processArgs( args ... );
> >  >>  >       }
> >  >>  >
> >  >>  >       public:
> >  >>  >           // This public method calls an exported SV 
> function ...
> >  >>  >           void CallExportedFunction( args ... ){
> >  >>  >               svPutScope( dSvScope );
> >  >>  >               MyExportedSvFunc( args ... );
> >  >>  >           }
> >  >>  > };
> >  >>  >
> >  >>  > ---------------------------------------
> >  >>  > SV Side:
> >  >>  >
> >  >>  > module MySvModel();
> >  >>  >       extern "DPI" context MyExternedCFunc = CFunc( 
> args ... );
> >  >>  >
> >  >>  >       export "DPI" MyExportedSvFunc = function SvFunc;
> >  >>  >       void function SvFunc( args ... ) begin
> >  >>  >           ...
> >  >>  >       endfunction
> >  >>  >
> >  >>  > endmodule
> >  >>  >
> >  >>  > This simple context association capability is essential for
> >  >>  > conjoining object oriented C testbench environments with the
> >  >>  > instance-based SV environment.
> >  >>  >
> >  >>  > I realize the temptation is to say, let's just keep support
> >  >>  > the simple function call paradigm leave context 
> capability out.
> >  >>  >
> >  >>  > But the reason that approach is inadequate is that we're
> >  >>  > trying to bridge a C environment to a fundamentally instanced
> >  >>  > based, hierarchical HDL environment where instance context
> >  >>  > is such a central concept.
> >  >>  >
> >  >>  > Also I think it is important for us to recognize some of the
> >  >>  > emerging object oriented HVL testbench modeling environments
> >  >>  > such as SystemC and others and provide the bare minimum
> >  >>  > functionality in our first release to cleanly support them.
> >  >>  >
> >  >>  > -- johnS
> 
>                                                             __
>                         ______                             |  \
> ______________________/      \__                         /    \
>                                  \       H  Dome      ___/     |
> John Stickley                 E |       a  __    ___/  /       \____
> Principal Engineer            l |       l  | \  /
> Verification Solutions Group    |       f  |  \/     ____
> Mentor Graphics Corp. - MED   C \         --  /     /
> 17 E. Cedar Place             a  \     __/   /     /
> Ramsey, NJ  07446             p  |    /        ___/
>                                   |   /        /
> mailto:John_Stickley@mentor.com  \           /
> Phone: (201)818-2585              \         /
>                                     ---------
> 
This archive was generated by hypermail 2b28 : Mon Mar 24 2003 - 09:47:40 PST