G
Guenter.Bartsch@googlemai
Guest
Hi everyone,
I am currently working on VHDL RTL synthesis support for zamiacad
(http://zamia.org) and stumbled upon the 2004 revision of the 1076.6
std. Until recently I wasn't aware this revision existed and now I am
slowly making my way through the examples given in the standard. So
far, I came across two questions (more to come, I guess
):
(1) what is the general experience, do the proprietary tools in the
market support the 2004 revision? parts of it, the whole thing? I just
tried a few of the examples in Altera's Quartus II and none of them
worked so I was beginning to wonder whether this might be a failed
standard so far (although I must say I do like some of the ideas they
outline in there). Can anybody recommend a tool that is known to have
good 2004 support?
(2) I do have trouble understanding some of the examples in there -
Example 6 on page 11 in particular. I have come up with my own
algorithm how to implement some of the synthesis rules so far and it
seems to work on most examples _including_ example 6 which is supposed
to be illegal. Basically what i am doing is compute logic expressions
that act as conditions under which certain assignments happen. In
example 6 we have:
if rising_edge(clock) or reset = '1' then
if reset = '1' then
Q <= '0' ; -- assignment 1
else
Q <= D; -- assignment 2
end if;
end if;
so assignment 1 happens when
(clock' || reset) & reset
is true which can be simplified to just
reset
so this is an async assignment of '0' to Q if reset='1'.
for assignment 2 i get
(clk' || reset) & ^reset = clk' & ^reset
which is a sync assignment under the condition that reset='0' (which
could actually be optimized out later since when reset='1' the async
assignment kicks in). so this could be synthesized as a flipflop that
has an asynchroneous reset, I guess? anyone see where I go wrong and
why this example should be illegal?
thanks and best regards,
guenter
I am currently working on VHDL RTL synthesis support for zamiacad
(http://zamia.org) and stumbled upon the 2004 revision of the 1076.6
std. Until recently I wasn't aware this revision existed and now I am
slowly making my way through the examples given in the standard. So
far, I came across two questions (more to come, I guess
(1) what is the general experience, do the proprietary tools in the
market support the 2004 revision? parts of it, the whole thing? I just
tried a few of the examples in Altera's Quartus II and none of them
worked so I was beginning to wonder whether this might be a failed
standard so far (although I must say I do like some of the ideas they
outline in there). Can anybody recommend a tool that is known to have
good 2004 support?
(2) I do have trouble understanding some of the examples in there -
Example 6 on page 11 in particular. I have come up with my own
algorithm how to implement some of the synthesis rules so far and it
seems to work on most examples _including_ example 6 which is supposed
to be illegal. Basically what i am doing is compute logic expressions
that act as conditions under which certain assignments happen. In
example 6 we have:
if rising_edge(clock) or reset = '1' then
if reset = '1' then
Q <= '0' ; -- assignment 1
else
Q <= D; -- assignment 2
end if;
end if;
so assignment 1 happens when
(clock' || reset) & reset
is true which can be simplified to just
reset
so this is an async assignment of '0' to Q if reset='1'.
for assignment 2 i get
(clk' || reset) & ^reset = clk' & ^reset
which is a sync assignment under the condition that reset='0' (which
could actually be optimized out later since when reset='1' the async
assignment kicks in). so this could be synthesized as a flipflop that
has an asynchroneous reset, I guess? anyone see where I go wrong and
why this example should be illegal?
thanks and best regards,
guenter