Submitted to Design Automation and Test in Europe 2000.
Critique of the Objective VHDL Language Definition
Peter J. Ashenden
Department of Computer Science
University of Adelaide, SA 5005
Australia
petera@cs.adelaide.edu.au
Philip A. Wilsey and Dale E. Martin
Dept. ECECS, PO Box 210030
University of Cincinnati
Cincinnati, OH 45221-0030, USA
phil.wilsey@uc.edu
dmartin@ececs.uc.edu
ommend which proposal best serves as the basis for
standardised extensions to VHDL. The findings of the
panel will be reported elsewhere.
We introduce our critique of the Objective VHDL language definition by presenting some views on language design principles that lead to high-quality languages. While
many of the principles presented here may appear to be
common sense or general “motherhood and apple pie”
statements, it is important to bear them in mind when designing language extensions, as they are all too often overlooked. As Brooks notes, “Conceptual integrity does
require that a system reflect a single philosophy and that the
specification as seen by the user flow from a few minds” [5,
page 49].
The foremost principle is that language design should
focus on semantics first and syntax second. The semantics
of language features embody the meaning of the features,
and determine what design intent can be expressed in the
language. The benefits of a semantics-based language design methodology are illustrated by Tennent [9]. He comments that a methodological approach based on semantics
is “intended to help a designer cope with the detailed problems of achieving consistency, completeness, and regularity in the design of specific language features,” and “has the
effect of drawing [the designer’s] attention to deeper structural issues” in a language. Syntax, on the other hand, is the
concrete expression of semantic features. While poor syntax may obfuscate the design intent, it does not prohibit expression of the intent. Good syntax design allows the
designer to think about and communicate design intent
clearly.
In determining semantic features to be included in a language, sufficient simple semantic mechanisms should be
preferred over more complicated general solutions; the
simple mechanisms can then be used to build applicationspecific solutions. The semantic mechanisms should, as
Abstract
This paper provides a critical analysis of Objective VHDL,
an object-oriented extension to VHDL. It is demonstrated
that several design decisions lead to unnecessary complexity in the language and consequent modelling difficulty
for designers. The SUAVE object-oriented extensions to
VHDL, on the other hand, avoid these problems by more
careful selection of language features.
1. Introduction
The design of a programming language or a hardware description language is a difficult task. Since the language is
the vehicle for expression of design intent, a good language
can greatly help the design process, whereas a poor language can significantly hinder it. A language should conform to a set of ideals or philosophies to make it coherent,
easy to learn, and easy to read and understand. This is what
Brooks refers to as “conceptual integrity” [5].
Recently, two language designs have been proposed to
the IEEE Object-Oriented VHDL (OOVHDL) Study
Group as candidates for standardisation: SUAVE [2, 3] and
Objective VHDL [8]. Both extend the VHDL hardware description language to include features for object-orientation. SUAVE also adds features for type-genericity,
abstract communication, and dynamic process creation.
As part of a process of review of the two proposals within the study group, we, the authors of the SUAVE proposal,
have prepared this critique of the Objective VHDL proposal. The Objective VHDL proposers have likewise prepared a critique of the SUAVE proposal. The language
descriptions, critiques and other material are to be examined by a panel of distinguished experts, who will rec-
1
much as possible, be orthogonal to each other. As Hoare
suggests [6], “concentrate on one feature at a time,” and
“reject any that are mutually inconsistent.” By choosing
simple orthogonal semantic mechanisms, interaction between mechanisms is reduced and easier to understand.
Simplicity of mechanism and reduced interaction make it
easier for tool builders to optimise their implementation of
language features.
In the remainder of this paper, we demonstrate that several features of Objective VHDL violate the design principles introduced above. We contrast the features of
Objective VHDL with those of SUAVE.
2. Class Types
Objective VHDL uses class type definitions to provide data
abstraction, encapsulation and inheritance in a single language construct. A class definition defines encapsulated
data and operations for a type, and allows specification of
a superclass from which data and operations are inherited.
When extending an existing language, the preceding
principles should be applied to the extensions. Simple semantic mechanisms should be chosen to augment the existing mechanisms, not to replace them. The new features
should conform to the same design philosophies that were
followed in the original language design so as to maintain
architectural coherence. Careful consideration must be
given to interactions between new features and existing
features. While the semantics of new features are of primary concern, integration of new syntax is also important.
Extensions should aim for stylistic consistency with the existing language. New features that are just syntactic rewrites of existing features (“syntactic sugar”) should only
be included if they significantly enhance the expressiveness of the language. As Wirth puts it [11], “distinguish ...
between what is essential and what ephemeral.”
2.1
Class Types and Information Hiding
A class in an object-oriented language can be considered
as an ADT with inheritance. VHDL already provides a partial facility for defining ADTs, based on the package construct. The user declares the concrete type in a package,
and provides operations in the form of subprograms taking
parameters of the concrete type. While the implementation
details of the operations can be hidden (they are declared
in the package body), VHDL provides no mechanism to
hide the implementation details of the concrete type. Thus
the security of ADTs in VHDL is weak.
Given the importance of integration of new features with
existing features, we need to identify existing features that
relate to object-oriented modelling. VHDL already includes many features that relate to the principles cited by
Booch as necessary for object-orientation: data abstraction, encapsulation, and inheritance with polymorphism
[4, page 181]. Subprograms, entities, and packages support
abstraction and encapsulation (albeit weak encapsulation
in the case of packages); and overloading provides a limited, ad-hoc form of polymorphism. In the terminology
of Wegner [10], these features are sufficient for VHDL to
be called “object-based.”
Objective VHDL addresses this weakness by adding a
new language construct, class type definition, that provides
secure forms of ADTs. A class type definition allows declaration of data elements and operations to be encapsulated
by the ADT, and ensures that the implementation details
are not visible outside the class type definition.
Our first criticism is that the class type definition feature
replicates much of the encapsulation facility provided by
packages. This adds complexity to the language and its implementation. It forces a user to make a decision between
two similar language mechanisms (packages or classes)
when there ought not to be a need for such a choice. The
choice is not always clear, and requires the designer to project the future evolution of the design. If the designer initially chooses to use a package for and ADT, and in
subsequent development of the design discovers that features of a class type are required, the designer is forced to
undertake significant re-engineering of the ADT and its
use.
The main issues for object-oriented modelling that are
not addressed by the existing VHDL language are: inheritance-based hierarchy (for data types and hardware structures); the form of dynamic polymorphism that goes with
inheritance (namely, dynamic binding); a stronger form of
abstraction and encapsulation for abstract data types
(ADTs); and a more flexible form of static polymorphism,
such as that represented by generics in Ada and templates
in C++. We maintain that language extensions to support
object-oriented modelling should address these issues
without subverting or replacing existing language features. Rather, they should build upon the existing language
features that make VHDL object-based. Furthermore,
there should be a clear separation of concerns between language features, so that a given feature does not attempt to
serve multiple underlying modelling requirements. The
interactions between language features should be well defined and understandable to language users.
A further consequence of the Objective VHDL class
mechanism is that will frequently lead to “double encapsulation.” Consider the common case of a class being declared so that it is visible in multiple design units. The class
must be encapsulated in a package, as illustrated by the following example.
package T_pkg is
type T is class
class attribute A : ... ;
2
procedure op_1 ( ... );
...
end class T;
The problem that arises in Objective VHDL is that, in a
class definition, it is not known whether the class will be
instantiated as a memory location (constant or variable) or
as a signal. The object on which a method is invoked is
passed implicitly to the method, rather than being explicitly part of the method’s interface. Hence, for each method
in the class, it is not known whether to use memory location
or signal semantics for assignment and reading of the encapsulated data.
Objective VHDL solves this problem with the mechanism of object configurations within a class definition. Object configurations for constants, variables and signals
group method definitions that are to be used should the
class be instantiated as a constant, variable or signal object
respectively. A method with a given name and signature
can appear in one or more of the following places: the common part, a constant object configuration, a variable object
configuration, or a signal configuration. The kind of storage object on which the method is invoked determines
which version of the method is called. Each version of the
method must only use semantics appropriate for the kind of
storage object implicitly passed to it.
While this approach seemingly solves the problem, it
does not integrate with the existing VHDL models of declarative regions and scope and visibility of names. The
closest analogs of class definitions in VHDL are record and
protected type definitions, each of which define a single declarative region in which homographs are disallowed. In
contrast, a class definition defines three declarative regions, one each for constant, variable and signal objects,
each consisting of the union of the common part and the
corresponding object configurations in the class definition.
This is a significant complication and departure from the
existing language. There is significant potential for confusion in a model where names might be homographs and
cause hiding in some configurations of a class and not in
others.
A further complication arises in methods in the common
part of a class definition. Such methods may only read the
values of class data. While the syntax of reading a value
is the same for constants, variables and signals, the semantics differ between storage locations and signals. Thus the
kind of read to use must be dynamically determined, making analysis, simulation and synthesis more complex. Alternatively, separate versions of the common methods must
be generated, corresponding to the separate object configurations.
The problem of dealing with objects of different storage
kinds naturally arises with SUAVE also. However, it is easily dealt with using existing language mechanisms. Since
the object on which a method is invoked is passed as an explicit parameter to the method, the storage class of the parameter (constant, variable or signal) determines the
applicable semantics for update and reading. Multiple dif-
end package T_pkg;
The package serves no purpose other than to contain the
class type, in which the data types and operations are declared. This extra layer of encapsulation adds unnecessary
complexity to the model.
SUAVE avoids these difficulties by making use of the
existing mechanism (packages) to provide encapsulation
for classes. Information hiding for the encapsulated data
is provided through private types, and inheritance is provided through type derivation. (These features in SUAVE
are adopted from the Ada-95 programming language [7].)
Thus the choices of language features needed for particular
application problems are clear, and no unnecessary encapsulation is required.
2.2
Encapsulated Storage v. Encapsulated Type
A class in Objective VHDL encapsulates class attributes
that denote the storage of a class instance. This leads to two
problems, discussed in this section.
2.2.1
Variables and Signals
In conventional imperative object-oriented programming
languages, there is only one kind of storage for objects,
namely, abstract memory locations with simple storage semantics. A location is updated by assignment, and its value
can be read by naming the location in an expression. In imperative programming languages where storage is encapsulated within a class definition, the semantics of assignment
and reading of encapsulated data are clearly those of storage locations.
In VHDL, however, there are two kinds of storage:
memory locations (constants and variables) and signals.
The semantics of memory locations are the same as those
of iterative programming languages. However, the semantics of signal storage are significantly different and more
complex. Signal assignment involves editing transaction
lists on drivers (which itself involves comparison and assignment of values), resolution of driving values, evaluation of nets (including invocation of type conversions and
conversion functions) to determine driving and effective
values, comparison of old and new values to determine events, and evaluation of dependent implicit signals. Because of the significant difference in semantics, VHDL
uses separate assignment operations for memory location
update (”:=”) and signal transaction scheduling (”<=”).
The semantics of reading the values of memory locations
and signals also differ. Compare use in an expression, association with parameters of different class, inclusions in
sensitivity lists, etc.
3
function imag_part return real is
begin
return im;
end function imag_part;
ferently-named versions of methods for different storage
classes are required, however, the semantics of declarative
regions and scope and visibility of names are preserved. In
the design of the SUAVE extensions, consideration was
given to allowing parameter storage class to be taken into
account as part of the signature of a subprogram to determine homographs. This would have allowed overloading
versions of a method differing only in parameter storage
class. However, the change was not included as it is a significant departure from the existing language. Should it be
necessary to add this overloading, the SUAVE language design could easily be modified for it’s introduction.
function cons ( real_part, imag_part : real )
return complex is
variable temp : complex;
begin
temp.set( real_part, imag_part );
return temp;
end function cons;
function add ( augend : complex ) return complex is
variable temp : complex;
begin
temp.set( re + augend.real_part,
im + augend.imag_part );
return temp;
end function add;
2.2.2 Pure Abstract Data Types and Operator
Overloading
The second problem stemming from encapsulation of storage in Objective VHDL classes relates to definition of what
we will call “pure” abstract data types (ADTs). By pure
ADTs we mean those that define a set of values, and for
which all methods are pure functions on values of the type.
Such ADTs simply serve as user-defined extensions to the
language’s type system, in much the same way that types
defined using type constructors (array and record definitions) do.
... -- other operations
for variable
procedure set ( real_part, imag_part : real ) is
begin
re := real_part; im := imag_part;
end procedure set;
end for;
An example of a pure ADT is a complex number type,
in which the set of values is 9 ¢ 9 (Cartesian representation) and all methods are arithmetic functions with arguments and/or results of the type. In Objective VHDL, such
an ADT would be defined as follows:
for signal
procedure set ( real_part, imag_part : real ) is
begin
re <= real_part; im <= imag_part;
end procedure set;
end for;
type complex is class
end class body complex;
class attribute re : real;
class attribute im: real;
Ideally, the arithmetic operation methods should be declared as overloaded operators. However, Objective
VHDL does not allow a sensible means of doing so. The
rules for overloading operators require that overloaded versions of unary operators have exactly one parameter, and
overloaded versions of binary operators have exactly two
parameters. In Objective VHDL, the only means of invoking class methods is using the prefix notation, where the
prefix is passed to the method as an implicit parameter.
Thus a unary-operator method effectively has two parameters, and a binary operator method effectively has three
parameters. This is counter to the intention of operator
overloading. The alternative, shown in the complex
number example above, is to declare the arithmetic methods with ordinary identifiers as names. The add method,
for example, would be invoked to perform a := b + c + d as:
function real_part return real;
function imag_part return real;
function cons ( real_part, imag_part : real )
return complex;
function add ( augend : complex ) return complex;
... -- other operations
for variable
procedure set ( real_part, imag_part : real );
end for;
for signal
procedure set ( real_part, imag_part : real );
end for;
end class complex;
a := b.add(c).add(d);
type complex is class body
A further problem arising from the approach to defining
pure ADTs required in Objective VHDL is that there is no
way to construct a value, other than by declaring an object
and invoking methods upon it. This is because the storage
function real_part return real is
begin
return re;
end function real_part;
4
is encapsulated in the class, rather than being external. To
illustrate this problem, consider how we must implement
package body complex_numbers is
a := b + (1 + 2i)
function real_part ( C : complex ) return real is
begin
return C.re;
end function real_part;
Since the representation of complex numbers is hidden,
we must use a method to construct the value (1 + 2i). However, since method invocation requires a prefix object of the
class type, we must create a dummy object for this purpose.
The value of the dummy object is not otherwise used.
function imag_part ( C : complex ) return real is
begin
return C.im;
end function imag_part;
constant dummy : complex;
...
a := b.add( dummy.cons(1.0, 2.0) );
function “&” ( real_part, imag_part : real )
return complex is
begin
return complex’(real_part, imag_part);
end function “&”;
Note that we are not actually using or attempting to update
the value of the constant here; the constant simply exists for
use as a prefix in the method call. An alternative is to declare a variable, and to set it to the value required:
function “+” ( L, R : complex ) return complex is
begin
return complex’( L.re + R.re, L.im + R.im );
end function “+”;
variable value : complex;
...
value.set(1.0, 2.0);
a := b.add(value);
... -- other operations
end package body complex_numbers;
However, this approach cannot be used in contexts where
it is illegal to declare a variable. Both of these approaches
add irrelevant detail and complexity to models.
Examples of use of the ADT are:
use complex_numbers.all;
constant i : complex := complex’(0.0 & 1.0);
variable a, b, c, d : complex;
...
A corollary of being unable to construct values of a pure
ADT is that it is not possible to initialise a constant of the
ADT, other than by use of a dummy object. For example,
to create a constant complex number with the value i, we
would write
a := a + b + c;
a := b + complex’(1.0 & 2.0);
2.3 Assignment and Equality
constant dummy : complex;
constant i : complex := dummy.cons(0.0, 1.0);
In the Objective VHDL Language Definition, the semantics
of signal assignment and update are not well defined.
Hence we must make some assumptions about the intent.
In Section 4.5.2 of the Language Definition it is stated that
processes that cause update of any class attribute of a classtype or classwide-type signal have a driver for the whole
signal. We interpret this to mean that the process has a
single driver, and that each transaction contains a complete
value of a class type. Section 4.6.2 of the Language Definition describes the semantics of signal assignment as involving elementwise assignment from each class attribute of a
waveform element to the corresponding class attribute of
the target. We interpret this to mean assignment to each
class attribute of the new transaction value created in the
driver.
The definition of signal assignment semantics is incomplete, in that it does not specify how transaction list editing
is performed, especially given the absence of a predefined
“=” operator for class types and classwide types. For class
types, we assume elementwise comparison is used for testing equality, as this corresponds to elementwise assignment. For classwide types, it is not clear how Objective
VHDL defines equality for the purposes of transaction list
Pure ADTs are expressed much more simply in SUAVE,
and avoid all of the problems identified here. The difference is that the storage is not encapsulated in the class definition; only the type is encapsulated. Furthermore, since
the objects on which methods are invoked are passed as explicit parameters, it is possible to overload operators as
methods. To illustrate, the complex number ADT can be
expressed in SUAVE as follows:
package complex_numbers is
type complex is private;
function real_part ( C : complex ) return real;
function imag_part ( C : complex ) return real;
function “&” ( real_part, imag_part : real )
return complex;
function “+” ( L, R : complex ) return complex;
... -- other operations
private
type complex is record
re, im : real;
end record complex;
end package complex_numbers;
5
editing. It may be that the language uses the same approach
as SUAVE, namely, first comparing the tags, and if they are
equal, then comparing the corresponding elements defined
for the specific class type. However, this is not stated. The
same concerns about the definition of equality arise in determination of events on signals of class and classwide
types.
language and with the SUAVE extensions for objectorientation. The topic of abstract communication, however, is out of scope for the OOVHDL Study Group, so the
issue are not addressed further in this critique. Instead, we
simply point out concerns with the basic mechanisms
added in Objective VHDL.
In VHDL, the declarations in the declarative part of an
entity are not visible outside the entity and corresponding
architecture bodies. Objective VHDL, on the other hand,
makes subprogram bodies visible in class body entity configurations that name the entity. Presumably this extended
visibility could be defined in terms of visibility by selection. The intention is that subprograms declared in the entity declarative part be treated as methods of the entity. Such
subprograms thus form part of the interface to the entity,
along with its generic and port lists. That the interface can
be dispersed over an entire declarative part, interspersed
with other non-interface declarations, potentially makes
the entity’s interface obscure. It would have been better to
collect the interface subprograms together with the generic
and port lists.
The rules described in Section 4.3.8 of the Objective
VHDL Language Definition imply that the declarative region structure described in Section 4.4.1 is a simplification.
The three declarative regions for constant, variable and signal configurations appear, in the presence of class body entity configurations, to have subregions for each entity
named in class body entity configurations. The relationship between a name declared in the main part of a region
and a homograph in a subregion is not clear. Is the subregion nested within the main region, or is it viewed as a
branch of some form? If the subregion is nested, then the
subprogram names declared within it must be exported in
to the enclosing region in some way to be visible when prefixed by an object name when called. Alternatively, does
the presence of class body entity configurations imply replication of the triple of declarative regions, once per entity
named in the set of class body entity configurations.
A further issue relating to class body entity configurations is the time of binding a subprogram body to a call. If
the binding were to be made statically, then a calling entity
must depend on the design unit containing the class body
definition. That design unit must depend on the entity declaration, since the entities declarations are made visible.
Thus a circular dependency would be created. VHDL does
not allow circular dependencies, so the binding cannot be
made statically. Instead, the binding can only be performed
at elaboration time or dynamically. This is a departure
from VHDL semantics, and a significant complication for
analysers and elaborators.
The rationale stated in Section 4.5.1 of the Language
Definition for not predefining equality and inequality for
class types and class wide types is that to do so “would
break their encapsulation” (or more correctly, their information hiding). We presume this means that to do so
would expose whether elementwise or deep comparison of
dynamically allocated structures is used, or whether the
implementation of a type admitted multiple representations of logically indistinguishable values. If this understanding of the rationale is correct, then it fails in both
cases. In the first case, the information hiding can be
broken by an attempt to declare a signal of the type. If the
declaration is allowed, the type contains no access type elements and so elementwise comparison would be appropriate. If the declaration is disallowed, the type contains at
least one access type element and so deep comparison is required (overriding elementwise comparison) or reference
semantics for the type is used (with elementwise comparison being appropriate). Thus in the first case, there is no
point in avoiding predefined equality. In the second case,
multiple representations of logically indistinguishable values would be exposed by event detection on a signal. If a
signal changed from one representation to another representation of the same logical value, an event would occur,
thus breaking the information hiding of the representation.
So in this case also, there is no point in avoiding predefined
equality.
2.4
Class Body Entity Configurations
The introduction of class body entity configurations in Objective VHDL complicates the scope and visibility rules
further than the complications discussed in Section 2.2.1 of
this critique, and does so in a way that is totally at odds with
the existing language design. Class body entity configurations, together with changes to visibility rules for subprograms in an entity declarative part, were added to support
implementation of remote-procedure-call interfaces to entity instances. The way that this is done is very clumsy. It
would have been better to support remote procedure call as
a first-class language construct, rather than to synthesise it
in an ad hoc fashion. Elsewhere [1, 2], we have argued that
message passing is a more appropriate form of abstract
communication than remote procedure call, and have described the SUAVE language extensions to provide message-passing communication. The SUAVE features are
much more general and integrate cleanly with the existing
3. Design Entity Inheritance
Objective VHDL allows a design entity to inherit the interface and implementation from a parent design entity. A de-
6
rived design entity inherits generics, ports, declarations
and concurrent statements, and possibly adds further generics, ports, declarations and concurrent statements. In
the case of a derived design unit declaring a homograph of
an inherited declaration, the inherited declaration is
hidden. In the case of a derived design unit including a concurrent statement with the same label an inherited concurrent statement, the inherited statement is replaced.
ple, the Q port of the DREG entity had to be declared as a
buffer port to support the subsequent inheritance. Normally the port would be declared as an out port, preventing the
simple form of inheritance shown.) This form of composition would be better expressed using the existing language features for component instantiation. In the
example, the DREGN design entity is simply a composition of a DREG instance and an inversion statement. The
only effective reuse achieved in the example is the reuse of
the port list from the DREG entity.
The intention of design unit inheritance is to support
reuse. A derived design entity reuses the interface, declarations and concurrent statements of the parent. While this
is a laudable goal, the amount of reuse that can be achieved
in practice is limited, especially when compared to the
reuse achieved through inheritance in data classes. In a
data class, methods are somewhat independent of one
another. A derived class can add functionality by adding
methods, and the addition of new methods does not affect
the functionality of inherited methods. A derived class can
also modify functionality by overriding inherited methods,
but care must be taken that the overriding method integrates
with the functionality of the remaining inherited methods.
These considerations make it necessary to question the
need for design entity inheritance. The existing language
mechanisms of component composition and configuration
serve well in many of the cases where design entity inheritance might be used. It is questionable whether the small
degree of reuse achieved in the remaining cases warrants
the complexity added to the language. A collection of examples and cases studies, showing how design entity inheritance can afford significant reuse and make modelling
more tractable, would be persuasive.
4. Genericity
In the case of design entities, concurrent statements are
not independent of one another; they are interconnected by
the signals and ports that they sense and drive. Except in
trivial cases, addition of functionality through addition of
concurrent statements would normally require the new
concurrent statements to be “spliced in” to the signal/port
interconnection structure. This would require deleting inherited port mappings and adding new ones. Objective
VHDL does not support this form of modification to the inherited interconnection structure.
Object-oriented programming languages include typegenericity (parameterisation of classes with formal types)
as a significant means of achieving reuse. Examples of language features for type genericity include generics in Ada
and templates in C++. The designers of Java recognise the
importance of type genericity and intend to add genericity
features in a future revision of Java. Given that much of the
use of VHDL is in the nature of programming (for example,
complex test benches and behavioural models), and that
supporting reuse was a major goal of Objective VHDL, it
is surprising that type-genericity was not included. To add
it now would be a significant language design exercise.
Augmentation of functionality can be achieved, however, if the parent model has been designed to support it.
The parent must be only partially interconnected, or have
“dummy” statements that are intended to be overridden.
Such a design entity would normally be non-instantiable,
and be designed as part of an inheritance hierarchy in a
single design exercise. Contrast this with reuse of a design
entity designed separately, for example, as part of an earlier
project. Such reuse is not well supported by the mechanisms in Objective VHDL. Inherited statements in such
cases must be overridden by statements that largely replicate the inherited statements, but with minor differences in
interconnection or functionality. The register examples in
Section 3 of the Objective VHDL Language Definition illustrate this.
The corresponding language design has already been
done in SUAVE. SUAVE extends the existing feature of generic lists on components and entities by allowing them to
include formal generic types. Actual types are specified
when the components or entities are instantiated. Thus a
given component or entity can be reused for several different actual types. SUAVE further extends the genericity features by allowing generic lists to be specified in package,
subprogram and process declarations. This allows definition of reusable ADTs, classes and active objects. The extended genericity features integrate cleanly with the
features for object-orientation and abstract communication, and interact with them to provide powerful modelling
capabilities.
The trivial cases in which augmentation of function can
be readily achieved are those in which new ports are added,
and the new declarations and concurrent statements are
interconnected only with them and the inherited ports. An
example is the inheritance from the DREG design entity to
form the DREGN design entity in Section 3 of the Objective VHDL Language Definition. (Note that in this exam-
Note that Objective VHDL does allow a simple form of
genericity in class definitions, namely, parameterisation by
generic constants. This language feature is more akin to
discriminated types in Ada than to the existing genericity
features in VHDL.
7
5. Conclusion
In this critique, we have identified a number of aspects of
the Objective VHDL language design that unnecessarily
complicate the language definition and make the language
difficult to use. These problems largely stem from a lack
of careful integration of new features with the semantic
mechanisms of the existing language. The most significant
issue is the choice of a class type encapsulating the storage
of an ADT. From this choice, several negative consequences flow. The designers of Objective VHDL have
based this choice on requirements from potential users,
who expressed a preference for the class-type approach
over the Ada-95-based approach. We believe that this illustrates the importance of collecting usage requirements
from users, as opposed to requirements for specific language features. The task of detailed language design is
complex and requires consideration of deep semantic issues. Users are not always in a position to appreciate the
ramifications of language design decisions and the interactions between semantic mechanisms. Language designers
who are “inculturated” with the language definition are in
the best position to maintain the conceptual integrity of the
language when designing extensions.
[2]
P. J. Ashenden, P. A. Wilsey, and D. E. Martin, “SUAVE: Extending VHDL to Improve Data Modeling Support,” IEEE
Design and Test of Computers, vol. 15, no. 2, pp. 34–44,
1998.
[3]
P. J. Ashenden, P. A. Wilsey, and D. E. Martin, SUAVE Language Description, Dept Computer Science, University of
Adelaide, Adelaide, Australia, Technical Report 99/04
(http://www.cs.adelaide.edu.au/users/petera/suave.html),
1999.
[4]
G. Booch, The Best of Booch. New York, NY: SIGS Books
and Multimedia, 1996.
[5]
F. P. Brooks, Jr., The Mythical Man-Month, Anniversary ed.
Reading, MA: Addison-Wesley, 1995.
[6]
C. A. R. Hoare, “Hints on Programming Language Design,”
in Essays in Computing Science, C. A. R. Hoare and C. B.
Jones, Eds. Herts, UK: Prentice Hall, 1989, pp. 193–216.
[7]
ISO/IEC, Ada 95 Reference Manual. International Standard
ISO/IEC 8652:1995 (E), Berlin, Germany: Springer-Verlag,
1995.
[8]
M. Radetzki, W. Putzke-Röming, and W. Nebel, Objective
VHDL Language Definition, OFFIS Research Institute, Oldenburg, Germany, REQUEST Deliverable 2.1A
(http://eis.informatik.uni-oldenburg.de/research/objective_vhdl.shtml), 1998.
[9]
R. D. Tennent, “Language Design Methods Based on Semantic Principles,” Acta Informatica, vol. 8, , pp. 97–112,
1977.
[10]
P. Wegner, “Dimensions of Object-Based Language Design,” ACM SIGPLAN Notices, vol. 22, no. 12, Proceedings
of OOPSLA ’87, pp. 168–182, 1987.
[11]
N. Wirth, “From Programming Language Design to Computer Construction,” Communications of the ACM, vol. 28,
no. 2, pp. 160–164, 1985.
References
[1]
P. J. Ashenden and P. A. Wilsey, “Extensions to VHDL for
Abstraction of Concurrency and Communication,” Proceedings of Sixth International Symposium on Modeling, Analysis and Simulation of Computer and Telecommunication
Systems (MASCOTS ’98), Montreal, Canada, pp. 301–308,
1998.
8