Language Change Specification for Bidirectional Connections

LCS Number: LCS-2016-070
Version: 3
Date: 26-Mar-2017
Status: Voting
Author: Patrick Lehmann
Martin Zabel
Email: Main.PatrickLehmann
Main.MartinZabel
Source Doc: Bidirectional Connections
History Doc: LCS2016_070_History
Summary: Adds bidirectional connections aka. Spaceship assignments.

Changes are shown in red font.
Deletions are crossed out.
Restructuring is shown in crossed out gray font somewhere else in gray font.
Editing or reviewing notes in green font.

Details of Language Change

(070.1) 6.4.2.3 Signal declarations

[Editor note: 1st paragraph on page 69]

A signal may have one or more sources. For a signal of a scalar type, the set of sources is the union of the subset of primary sources and of
the subset of secondary sources. each source is either a driver (see 14.7.2) or an out, inout, buffer, or linkage port of a component instance
or of a block statement with which the signal is associated.
The subsets are determined as follows:

  • For a signal of a scalar type, each primary source is either a driver (see 14.7.2) or an out, inout, buffer, or linkage port of a component
    instance or of a block statement with which the signal is associated.
  • For a signal of a scalar type, the subset of secondary sources is the union of all primary sources of all other signals in the same association
    group (see 11.7).

It?s an error if after elaboration the calculation of driving values in a signal association group contains a cyclic dependency on the sources.

For a signal of a composite type, each composite source is a collection of scalar sources, one for each scalar subelement of the signal.
It is an error if, after the elaboration of a description, a signal has multiple sources and it is not a resolved signal. It is also an
error if, after the elaboration of a description, a resolved signal has more sources than the number of elements in the index range of the
type of the formal parameter of the resolution function associated with the resolved signal.

If a subelement or slice of a resolved signal of composite type is associated as an actual in a port map aspect (either in a component
instantiation statement, a block statement, or in a binding indication), and if the corresponding formal is of mode out, inout, buffer, or
linkage, then every scalar subelement of that signal shall be associated exactly once with such a formal in the same port map aspect, and
the collection of the corresponding formal parts taken together constitute one primary source of the signal. If a resolved signal of composite type
is associated as an actual in a port map aspect, that is equivalent to each of its subelements being associated in the same port map aspect.

If a subelement of a resolved signal of composite type has a driver in a given process, then every scalar subelement of that signal shall
have a driver in the same process, and the collection of all of those drivers taken together constitute one primary source of the signal.

The default value associated with a scalar signal defines the value component of a transaction that is the initial contents of each driver
(if any) of that signal. The time component of the transaction is not defined, but the transaction is understood to have already occurred
by the start of simulation.

(070.1) 11.1 General

concurrent_statement ::=
    block_statement
  | process_statement
  | concurrent_procedure_call_statement
  | concurrent_assertion_statement
  | concurrent_signal_assignment_statement
  | concurrent_signal_association_statement
  | component_instantiation_statement
  | generate_statement
  | PSL_PSL_Directive

(070.2) 11.7 Concurrent signal association statements [NEW, inserted between 11.6 and 11.7]

[Editor note: New main paragraph]

A concurrent signal association statement represents an association between two signals. Associated signals are said to
compose an association group. An association group can comprise multiple signals.

concurrent_signal_association_statement ::=
  [ label : ] concurrent_simple_signal_association

concurrent_simple_signal_association ::=
  lhs_signal_association_target <=> rhs_signal_association_target ;

signal_association_target ::=
  signal_name

A signal association implies no direction of information exchange between signal association targets (henceforth referred to as targets).
If the target in the concurrent signal association statement is a name, then the name shall denote a signal.

The signals are associated as follows:

  • If the left-hand side target is a scalar signal and the right-hand side target is also a scalar signal, then both signals are associated.
  • If the left-hand side target is a composite signal and the right-hand side target is also a composite signal, then each subelement in the right-hand
    side target shall be associated with the corresponding subelement in the left-hand side target.
  • All other cases are an error.

All signals in an association group are either resolved or unresolved signals. The targets' subtypes shall be compatible to each other. Moreover, the resolution function
corresponding to the subtypes shall be the same, if any.

If a subelement or slice of a resolved signal of a composite type is associated as the right-hand side target, then every scalar subelement of that
signal shall be associated exactly once with the corresponding left-hand side target in the same concurrent signal association statement.

Note 1 -- A signal association target, denoting a signal name, can also denote an attribute name returning an implicit signal.

(070.3) 14.7.3.2 Driving values [Exposed hidden list with a new list hierarchy]

A basic signal is a signal that has all of the following properties:
  • It is either a scalar signal or a resolved signal (see 6.4.2.3).
  • It is not a subelement of a resolved signal.
  • Is not an implicit signal of the form S'STABLE(T), S'QUIET(T), or S'TRANSACTION (see 16.2).
  • It is not an implicit signal GUARD (see 11.2).

Basic signals are those that determine the driving values for all other signals.

The driving value of any signal S is determined by the following steps:

  1. If a driving-value release is scheduled for S or for a signal of which S is a subelement, S becomes driving-value released, that is, no
    longer driving-value forced. Proceed to step b).
  2. If a driving-value force is scheduled for S or for a signal of which S is a subelement, S becomes driving-value forced and the driving value
    of S is the driving force value for S or the element of the driving force value for the signal of which S is a subelement, as appropriate; no
    further steps are required. Otherwise, proceed to step c).
  3. If S is driving-value forced, the driving value of S is unchanged from its previous value; no further steps are required. Otherwise, proceed
    to step d).
  4. If a driving-value deposit is scheduled for S or for a signal of which S is a subelement, the driving value of S is the driving deposit value
    for S or the element of the driving deposit value for the signal of which S is a subelement, as appropriate; no further steps are required.
    Otherwise, proceed to step e), if S is a basic signal, otherwise proceed to or f), as appropriate.
  5. If S is a basic signal:
    • If S has no source, then the driving value of S is given by the default value associated with S (see 6.4.2.3).
    • If S has one source that is a driver and S is not a resolved signal (see 6.4.2.3), then the driving value of S is the current value of
      that driver.
    • If S has one source that is a port and S is not a resolved signal, then the driving value of S is the driving value of the formal part of
      the association element that associates S with that port (see 6.5.7.1). The driving value of a formal part is obtained by evaluating the
      formal part as follows: If no conversion function or type conversion is present in the formal part, then the driving value of the formal
      part is the driving value of the signal denoted by the formal designator. Otherwise, the driving value of the formal part is the value
      obtained by applying either the conversion function or type conversion (whichever is contained in the formal part) to the driving value of
      the signal denoted by the formal designator.
      [Changed hidden nested item list into a sublist for better readablility]
      • If no conversion function or type conversion is present in the formal part, then the driving value of the formal part is the driving
        value of the signal denoted by the formal designator.
      • Otherwise, the driving value of the formal part is the value obtained by applying either the conversion function or type conversion
        (whichever is contained in the formal part) to the driving value of the signal denoted by the formal designator.
    • If S is a resolved signal and has one or more sources, then the driving values of the sources of S are examined. It is an error if
      any of these driving values is a composite where one or more subelement values are determined by the null transaction (see 10.5.2.2) and
      one or more subelement values are not determined by the null transaction. If S is of signal kind register and all the sources of S have
      values determined by the null transaction, then the driving value of S is unchanged from its previous value. Otherwise, the driving value
      of S is obtained by executing the resolution function associated with S, where that function is called with an input parameter consisting
      of the concatenation of the driving values of the sources of S, with the exception of the value of any source of S whose current value is
      determined by the null transaction.
      [Changed hidden nested item list into a sublist for better readablility]
      • If S is of signal kind register and all the sources of S have values determined by the null transaction, then the driving value of S is
        unchanged from its previous value.
      • Otherwise, the driving value of S is obtained by executing the resolution function associated with S, where that function is called
        with an input parameter consisting of the concatenation of the current driving values of the drivers sources of S and the driving
        values of the OUT, INOUT, BUFFER, and LINKAGE ports with which S is associated
        , with the exception of the value of any source
        of S whose current value is determined by the null transaction.
  6. If S is not a basic signal:
    • If S is a subelement of a resolved signal R, the driving value of S is the corresponding subelement value of the driving value of R.
    • Otherwise (S is a nonresolved, composite signal), the driving value of S is equal to the aggregate of the driving values of each of the
      basic signals that are the subelements of S.

(070.4) 15.3 Lexical elements, separators, and delimiters

[...]

A delimiter is either one of the following special characters (in the basic character set):

& ' ( ) * + , - . / : ; < = > ` | [ ] ? @
or one of the following compound delimiters, each composed of two or more adjacent special characters:
=> ** := /= >= <= <> <=> ?? ?= ?/= ?< ?<= ?> ?>= << >>
[...]

NOTE 2 -- The following names are used when referring to compound delimiters:

Delimiter Name
=> Arrow
** Double star, exponentiate
:= Variable assignment
/= Inequality (pronounced "not equal")
>= Greater than or equal
<= Less than or equal; signal assignment
<> Box
<=> Signal association
?? Condition conversion
?= Matching equality
?/= Matching inequality
?< Matching less than
?<= Matching less than or equal
?> Matching greater than
?>= Matching greater than or equal
<< Double less than
>> Double greater than

(070.5) Annex C

[Editor note: Add these rules]
[...]

concurrent_assertion_statement ::=
  [ label : ] [ postponed ] assertion ;

concurrent_signal_association_statement ::=
  [ label : ] concurrent_simple_signal_association

concurrent_conditional_signal_assignment ::=
  target <= [ guarded ] [ delay_mechanism ] conditional_waveforms ;

concurrent_procedure_call_statement ::=
  [ label : ] [ postponed ] procedure_call ;

concurrent_selected_signal_assignment ::=
  with expression select [ ? ]
    target <= [ guarded ] [ delay_mechanism ] selected_waveforms ;

concurrent_signal_assignment_statement ::=
    [ label : ] [ postponed ] concurrent_simple_signal_assignment
  | [ label : ] [ postponed ] concurrent_conditional_signal_assignment
  | [ label : ] [ postponed ] concurrent_selected_signal_assignment

concurrent_simple_signal_association ::=
  lhs_signal_association_target <=> rhs_signal_association_target ;

concurrent_simple_signal_assignment ::=
  target <= [ guarded ] [ delay_mechanism ] waveform ;

concurrent_statement ::=
    block_statement
  | process_statement
  | concurrent_procedure_call_statement
  | concurrent_assertion_statement
  | concurrent_signal_assignment_statement
  | concurrent_signal_association_statement
  | component_instantiation_statement
  | generate_statement
  | PSL_PSL_Directive

[...]

signal_association_target ::=
  signal_name

Comments

Topic revision: r39 - 2017-07-30 - 05:39:59 - RobGaddi
 
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback