C. G. wrote:
As regards the quality of Riviera, currently I do mostly VHDL with some
Verilog and SystemC and I don't have any problems. I can't say I share
Paul Uiterlinden's bad experience. Without wanting to start a
competition with Paul about "who can write the most complex (or obscure)
code"
I never said that I strive to write the most complex or even obscure
code. Sorry if I gave you that impression.
I'll just say that my test-benches are generally TLM based with
plenty of abstract data types, access types and unconstrained arrays
i.e. things that you wouldn't normally find in the synthesisable VHDL
subset.
Same here. And to show you that the things that tripped Riviera are
not exactly the rocket science equivalence of VHDL, here are some
samples (code not complete). Note that these are in no way obscene
contrived examples. They are stand-alone testcases extracted from
existing code.
1) Attribute 'HIGH not allowed in certain circumstances:
PROCEDURE p
(
state : INOUT state_type
) IS
ALIAS reg: bit_vector(state.reg.data'LENGTH-1 DOWNTO 0)
IS state.reg.data;
BEGIN
reg := reg(reg'HIGH-1 DOWNTO 0) & '0';
END PROCEDURE p;
2) Dependency exists between package a and package BODY b
A very very basic bug where a use clause of package b caused a
dependency to the BODY of package b, in stead of the PACKAGE.
Because of this I could not use my makefiles without modification.
3) Segmentation violation caused by an index in the formal parameters
in a procedure call.
PROCEDURE p1
(
d : INOUT bit;
e : IN bit;
m : IN m_type
) IS
BEGIN
p2(d_vec(0) => d, e_vec(0) => e, m => m);
END PROCEDURE p1;
4) Segmentation violation caused by a LOOP/NEXT combination
PROCEDURE p
(
a : IN bit_vector
) IS
SUBTYPE c_range IS natural RANGE a'RANGE;
VARIABLE a_prev : bit_vector(a'RANGE);
BEGIN
c_loop: FOR c IN c_range LOOP
NEXT c_loop WHEN a(c) = a_prev(c);
END LOOP c_loop;
END PROCEDURE p;
5) Segmentation violation if a subtype is used as an index
range of a vector.
PROCEDURE p
(
a : OUT bit_vector
) IS
SUBTYPE a_range IS natural RANGE a'RANGE;
BEGIN
a := (a_range => '0');
-- Workaround: use a'RANGE in stead of a_range
END PROCEDURE p;
6) Segmentation violation if a subtype is used as an index of a
for loop, which surrounds a while loop.
PROCEDURE p
(
a : INOUT bit_vector
) IS
SUBTYPE a_range IS natural RANGE a'RANGE;
BEGIN
FOR b IN a_range LOOP
-- Workaround: use a'RANGE in stead of a_range
WHILE a(b) = '0' LOOP
a(b) := NOT a(b);
END LOOP;
END LOOP;
END PROCEDURE p;
7) Hang situation of vcom (100% CPU usage)
TYPE enum_type IS
(
a1, a2, a3, a4, a5,
b1, b2, b3, b4, b5,
c1, c2, c3, c4, c5
);
SUBTYPE enum_subtype IS enum_type RANGE b1 TO b5;
PROCEDURE p
(
a : IN enum_subtype
) IS
BEGIN
CASE a IS
WHEN b2 TO b4 => -- Trouble maker
WHEN b1 | b5 =>
END CASE;
END PROCEDURE p;
Now where is the obscure code? I hope you agree the complexity
of the code shown is quite low. Most of it (if not all) should even
be synthesizable. And it is all in the analyze stage, I never reached
the simulation stage!
As said before, the reaction time of Aldec was amazingly fast.
However, after these issues where fixed, I stumbled on other issues,
preventing me to start the simulation I wanted to use for my
evaluation. That was the point where I did not invest any more time.
I had a single problem with unconstrained arrays while I was
still evaluating but Aldec sent me a patch within two days. I agree
fully with some of the other posters here. I too find Riviera very fast.
I think I am in a position to compare since one of my major customers
expects me to use his (Mentor based) tool base when I am working on his
projects.
So, for what it's worth, that's my detailed summary.
I'm glad it works for you and I thank you for your information.
And let it be absolutely clear: in no way am I trying to put Riviera
in a bad light. All I want to say: YMMV (your mileage may vary). And
in this particular case: MMV (my mileage varies).