On Friday, August 1, 2014 1:28:28 AM UTC+12, Sean Durkin wrote:
> In case anyone's still interested:
>
> This gets even worse in Vivado. Not even driving a std_ulogic from two
> different places causes an error or warning during synthesis... The best
> you can do is to receive a critical warning, but only under certain
> circumstances (as it turns out, it makes a difference if one of the
> drivers drives a constant value or not, for whatever reason...).
>
> I've reported it to Xilinx, but as of now they don't believe me that
> this is a problem:
>
>
http://tinyurl.com/lkzgsgj
>
Your test case you provided to Xilinx demonstrates your issue admirably.
There's actually support for Xilinx's position in the now withdrawn 1076.6-2004,
Section 5, Verification methodology:
"... The process of verifying synthesis results using simulation consists of
applying equivalent inputs to both the original model and synthesized model and
then comparing their outputs to ensure that they are equivalent. Equivalent in
this context means that a synthesis tool shall produce a circuit that is
equivalent at the input, output, and bidirectional ports of the model. ..."
This issue here is that shall is directive. See 1.3 Terminology:
"The word shall indicates mandatory requirements strictly to be followed in
order to conform to the standard and from which no deviation is permitted
(shall equals is required to)."
And note that synthesis only deals with a subset of VHDL:
See 1.1 Scope:
" This standard defines a subset of very high-speed integrated circuit hardware
description language (VHDL) that ensures portability of VHDL descriptions
between register transfer level synthesis tools. Synthesis tools may be
compliant and yet have features beyond those required by this standard. This
standard defines how the semantics of VHDL shall be used, for example, to model
level-sensitive and edge-sensitive logic. It also describes the syntax of the
language with reference to what shall be supported and what shall not be sup-
ported for interoperability.
Use of this standard should minimize the potential for functional simulation
mismatches between models before they are synthesized and after they are
synthesized."
There is no requirement that a synthesis tool provide a valid synthesis output
for an invalid model.
See the title page:
"...
The subset of the VHDL language, which is synthesizable, is described, and
nonsynthesizable VHDL constructs are identified that should be ignored or
flagged as errors."
There are only two errors defined in 1076.6, 6.3 Three-state logic and busses
and 7.1 Attributes. The one on three-state logic pivots on guarded assignment.
And your test case is invalid, you can't have multiple drivers for unresolved
types.
And back to 5. Verification methodology:
"...
The input stimulus shall comply with the following criteria:
a) Input data does not contain metalogical or high-impedance values.
b) Input data may only contain 'H' and 'L' on inputs that are converted to '1'
and '0', respectively."
There's no requirement that any metavalue on internal_sig be evaluated for
matching behavior in top. Resolution can be ignored.
The underlying issue here is that your model is invalid and your asking Xilinx
detect errors where they've never been required to and historically (prior to
reconfigurable FPGAs) it would have been imprudent to synthesize and implement
hardware based on an invalid model. The cost implications would have demanded
you simulate first where the invalid model would be filtered out.
When Daniel also mentions similar issues with a second synthesis vendor the
message here is that you need an RTL synthesis standard, and that if
resurrected 1076.6 might be updated to require further error detection.
Until then you have no leverage. And any standard on synthesis would represent
a consensus between vendors (the same ones you're collectively complaining
about.)