System Verilog
Testbench donation
Open Review Issues
Short name: Description: Person Discussions: Resolution:
REV-1 $cast_assign Static casting in SV? Why not a compiler issue instead of call? Supports run-time checks with dynamic warnings and check before doing casting. Does not replace static checks. Does the syntax need changed? Does it overlap with assertion? Mainly used with assignments. May need a new assignment operator such as ":="
REV-2 Array shorthand Conflict with existing call Conflicts with existing Verilog Remove shorthand notation
REV-3 Built-in string methods Resolve class versus task syntax Predefined classes are a new concept. Accept
REV-4 Forward reference with typedef General implication Should be applied to other places as well (it is). This is a bad idead in SV for non-pointers (which do not exist). Heavily used for classes. Accept
REV-5 Extern withdrawal Impact Not in donation. May be required in future. Delay
REV-6 Class issues super, extends, local/private, virtual, protected etc... Use of : instead of extends. Use braces instead of "EndCase". Kevin C Java vs C++.  Braces vs "End Class". Resolve issue of C++ bias versus Java bias
REV-7 General use of Class How general Not synthesizable due to dynamic allocation. Problem is that adding classes would like to have methods on structs (which is synthesizable) Keep this in mind but allow classes to be general. 
REV-8 Virtual class vs interface How do these relate Abstract data created with class how related to an interface with no ports (can an interface have no ports)?
REV-9 Predefined constants Keywords versus pre-defined constants What is difference between them? Namespace is an issue? May be handled by changing the implementation of things using them. (implement as classes).
REV-10 Mailboxes and semaphores Mailbox and semaphores vs channels and queues in SV Looks like similar requirement to data channels.
REV-11 Mailboxes and semaphores Implemented as classes Look into implementing as classes instead of language features.
REV-12 Program block Reconcile with verilog module Is it still required since it is not going through PLI but is integral to the language? Is cycle semantic required? Remove non-determinism of HDL code and keep execution of testbench clean (clock synchronized). Stefen disagrees that cycle based is required (use non-blocking assignment).
REV-13 Clocking_domain ports defined in multiple clock domains: questions of out1 = 1 and d1.out = 1 (out1 defined in two domains) Is it still required since it is not going through PLI but is integral to the language? Is cycle semantic required? Remove non-determinism of HDL code and keep execution of testbench clean (clock synchronized). Stefen disagrees that cycle based is required (use non-blocking assignment).
REV-14 wait_var/wait_child Extend '@' for wait_var and wait_child. Kevin C wait_var and wait_child should be rolled into '@'. I'd prefer to have autonomous threads named (by identifiers on the fork/process statement) so that you can say "join <identifier>" instead of wait_child().
REV-15 fork/join none vs process Keep both process and fork separate Kevin C process is different from fork in that it refers to a single statement and fork refers to a group of statements (1 or more). This makes a difference if you want to identify a thread uniquely by name, so I'd rather keep the seperate process statement.
REV-16 $sync/$trigger Extend -> and @ to include Kevin C I'd prefer to see these rolled into the -> and @ syntax e.g.
    $tigger(ONE_BLAST,evt);
becomes:
    ONE_BLAST -> evt;
The $sync task appears to create an event out of other events so could be replaced by special event function for the ORDER and CHECK versions. E.g.
    $sync(ORDER,lookupchk_evnt,queue_event);
becomes:
    @(ordered(lookupchk_evnt,queue_event));
Which can be used with other events e.g.:
    always @(posedge clock and ordered(lookupchk_evnt,queue_event)) begin
     ...
     end
(Is there an alternative syntax for ordered events in the assertions stuff already?)
REV-17 alloc Replace alloc with new style syntax Kevin C alloc' appears to be used to create various objects dynamically. As with other Vera system tasks I presume it was done this way for ease of implemetation through PLI. For SV I would offer to create new  types for these objects and use a 'new' style syntax for creating  them dynamically. E.g.
    module foo;
        mailbox      s_mbx, // permanemt mailbox
                    var v_mbx; // mailbox reference
        initial begin
              v_mbx = new;   // dynamic mailbox
        end
        ...
        [NB: I don't think we have a donation covering references and/or pointers yet. Is one in the pipeline?]

The mailbox_put/get tasks can be replaced regular reads and writes as outlined in the channel proposal (http://www.eda.org/sv-ec/hm/0107.html) since channels and mailboxes are almost the same (I'll rehash the proposal to cover the extra functionality later).
 Semaphores should also become a proper part of the language e.g.:
     <semaphore declaration> ::= semaphore <identifier>["["<sema. count>"]"["["<key count>"]"]]
 You could overload the assignment operators to replace semaphore_put/get
 functions e.g.:
     module foo;
        semaphore s1;         // counts default to 1
        integer   key_idx;
        always...

      key_idx  <= s1; // returns -1 if key not available
      ...
                    key_idx   = s1; // blocks until key available

      s1[0][key_idx] = 0; // release key      

      // and/or
       s1++;     // blocks until key available
      s1--;           // returns a key'alloc' appears to be used to create various objects dynamically. As
        with other Vera system tasks I presume it was done this way for ease
        of implemetation through PLI. For SV I would prefer to create new
        types for these objects and use a 'new' style syntax for creating
        them dynamically. E.g.

            module foo;
                mailbox      s_mbx, // permanemt mailbox
                         var v_mbx; // mailbox reference
                initial begin
                    v_mbx = new;   // dynamic mailbox
                end
                ...

        [NB: I don't think we have a donation covering references and/or
        pointers yet. Is one in the pipeline?]

        The mailbox_put/get tasks can be replaced regular reads and writes
 as outlined in the channel proposal (http://www.eda.org/sv-ec/hm/0107.html)
 since channels and mailboxes are almost the same (I'll rehash the proposal
 to cover the extra functionality later).

 Semaphores should also become a proper part of the language e.g.:

     <semaphore declaration> ::= semaphore <identifier>["["<sema. count>"]"["["<key count>"]"]]

 You could overload the assignment operators to replace semaphore_put/get
 functions e.g.:

     module foo;
  semaphore s1;         // counts default to 1
    integer   key_idx;
 
  always...

      key_idx  <= s1; // returns -1 if key not available
      ...
                    key_idx   = s1; // blocks until key available

      s1[0][key_idx] = 0; // release key      

      // and/or

       s1++;     // blocks until key available
      s1--;           // returns a key
The static declarations of mailboxes and semaphores should be more friendly to synthesis tools.The static declarations of mailboxes and semaphores should be more friendly to synthesis tools.
REV-18 Clocking_domain Change syntax Kevin C To avoid making CLOCK a keyword I'd be tempted to change the syntax        to something like:
    clock_domain <domain name> [@(<clock expression>)]
You could just use <domain name> instead of <domain name>.CLOCK to pick up the clock signal.