VUnit / vunit

VUnit is a unit testing framework for VHDL/SystemVerilog
http://vunit.github.io/
Other
697 stars 250 forks source link

GHDL fails with exit code 4294967295 #980

Closed hcommin closed 4 months ago

hcommin commented 6 months ago

This minimal VUnit testbench succeeds with Modelsim, but fails with GHDL. However, when I try to reproduce the error with standalone GHDL (without VUnit), it seems to work fine.

Here is the minimal VUnit testbench:

library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

library vunit_lib;
    context vunit_lib.vunit_context;

entity tb is
    generic(
        runner_cfg : string
    );
end tb;

architecture sim of tb is

    type SlvArray_t is array(integer range<>) of std_logic_vector;
    type UnsignedArray_t is array(integer range<>) of unsigned;

    constant a : UnsignedArray_t(0 to 0)(0 downto 0) := (others => (others => '0'));
    constant b : SlvArray_t := SlvArray_t(a);

begin

    process
    begin
        test_runner_setup(runner, runner_cfg);

        while test_suite loop
            if run("test") then
            end if;
        end loop;

        test_runner_cleanup(runner);
        wait;
    end process;

end sim;

It produces this output, indicating return code 4294967295:

$ python run.py --simulator=ghdl --simulator-path=$GHDL_PATH --log-level debug

...

  DEBUG - Waiting for process with pid=8356 to stop
  DEBUG - Process with pid=8356 terminated with code=4294967295
fail (P=0 S=0 F=1 T=1) lib.tb.test (1.9 seconds)

This is my attempt at a standalone testbench:

library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

entity tb is
end tb;

architecture sim of tb is

    type SlvArray_t is array(integer range<>) of std_logic_vector;
    type UnsignedArray_t is array(integer range<>) of unsigned;

    constant a : UnsignedArray_t(0 to 1)(7 downto 0) := (others => (others => '0'));
    constant b : SlvArray_t := SlvArray_t(a);

begin

    process
    begin
        std.env.stop;
    end process;

end sim;

This seems to run correctly with GHDL and return code 0 (EXIT_SUCCESS):

$ ghdl -a --std=08 tb.vhd
$ ghdl --elab-run --std=08 tb
simulation stopped @0ms
$ echo $?
0

I never saw this issue before, and I recently updated to quite a new version of GHDL:

$ ghdl --version
GHDL 4.0.0-dev (3.0.0.r147.g6c56631a7) [Dunoon edition]
 Compiled with GNAT Version: 13.1.0
 llvm 16.0.2 code generator
LarsAsplund commented 6 months ago

Running this myself with Python 3.12.0, Windows 10 and

GHDL 4.0.0-dev (3.0.0.r636.g1ec1eb6d9) [Dunoon edition]
 Compiled with GNAT Version: 13.2.0
 static elaboration, mcode code generator

results in a pass. I think this is related to what build and version you're using for GHDL so I suggest that you open an issue on their side.

LarsAsplund commented 4 months ago

@hcommin Has this been resolved?

hcommin commented 4 months ago

@LarsAsplund No, I was not able to resolve it and I had to drop GHDL so I could move forward with my project. It's a shame because GHDL is really great when it works. (Unlimited parallel instances with no license fees).

LarsAsplund commented 4 months ago

Ok, in that case I will close this issue. As an alternative you can also try the open source NVC simulator. That will also give you unlimited number of licenses.