ghdl icon indicating copy to clipboard operation
ghdl copied to clipboard

Generic array of generic type

Open DBLouis opened this issue 7 years ago • 7 comments
trafficstars

Description I want to make a multiplexer with generic data and control signal size.

Expected behaviour It does not compile.

Context

  • OS: Debian buster
  • Origin: Debian buster GCC Docker image
******************** GHDL Bug occurred ***************************
Please report this bug on https://github.com/ghdl/ghdl/issues
GHDL release: 0.36-dev (v0.35-367-g9d3b26ba) [Dunoon edition]
Compiled with GNAT Version: 7.3.0
Target: x86_64-linux-gnu
In directory: /home/louis/work/
Command line:
/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/ghdl1 --std=08 -P/usr/local/lib/ghdl/ieee/v08/ -P/usr/local/lib/ghdl/ -quiet -o multiplexer.s multiplexer.vhdl
Exception CONSTRAINT_ERROR raised
Exception information:
raised CONSTRAINT_ERROR : sem_inst.adb:81 index check failed
Call stack traceback locations:
0x66bb59 0x66df77 0x6452fc 0x66b76b 0x63b863 0x6bc4bc 0x6bb357 0x5f6228 0xabdbed 0x5f05f7 0x5fafc9 0x725969 0x5eeb98 0x7f76d5978b15 0x5f26c8 0xfffffffffffffffe
******************************************************************
#>> mux.vhd
library ieee;
use ieee.std_logic_1164.all;

package mux is
  generic (
    MUX_DATA_SIZE : natural
  );
  subtype mux_data is std_logic_vector(MUX_DATA_SIZE-1 downto 0);
  type mux_data_array is array (natural range <>) of mux_data;
end package;

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

entity multiplexer is
  generic (
    MUX_DATA_SIZE : natural;
    MUX_CTRL_SIZE : natural;
    package mux_g is new work.mux generic map (MUX_DATA_SIZE => MUX_DATA_SIZE)
  );
  port (
    MUX_CTRL : in std_logic_vector(MUX_CTRL_SIZE-1 downto 0);
    MUX_IN : in mux_g.mux_data_array(0 to 2**MUX_CTRL_SIZE-1);
    MUX_OUT : out mux_g.mux_data
  );
end entity;

architecture multiplexer_arch of multiplexer is
begin
  MUX_OUT <= MUX_IN(to_integer(unsigned(MUX_CTRL)));
end architecture;

#>> sim.sh
ghdl -a mux.vhd
ghdl --elab-run mux

#>> run.sh
docker run --rm -tv /$(pwd):/src:z -w //src ghdl/ghdl:buster-gcc-7.2.0 sh -c ./sim.sh

#>> end

Checklist Before submitting your issue, please review the following checklist:

  • [x] Add GHDL Bug occurred log block
  • [x] Add a MWE
  • [x] Try the latest version

DBLouis avatar Nov 16 '18 07:11 DBLouis

Generic map aspect in interface package declaration are not yet supported.

tgingold avatar Nov 17 '18 03:11 tgingold

In addition, interface package declarations are also not yet supported in entities...

tgingold avatar Nov 17 '18 03:11 tgingold

Is there any way I can achieve what I want to do?

DBLouis avatar Nov 17 '18 07:11 DBLouis

You can use an unbounded array of std_logic_vector (but the support of it is still WIP in ghdl).

tgingold avatar Nov 17 '18 07:11 tgingold

Please see my answer on CodeReview about 4 different solutions on generic multiplexers for the std_logic datatype.

If you also want to have the type generic, you may need to wait for VHDL-2008 and partially for VHDL-2018 support in tools.

Paebbels avatar Nov 17 '18 10:11 Paebbels

I can analyze but not elaborate the provided MWE with a recent version of GHDL:

# ghdl --version
GHDL 1.0-dev (0.37.0.r1270.gb65ee8c3) [Dunoon edition]
 Compiled with GNAT Version: 10.2.0
 llvm code generator
Written by Tristan Gingold.

Copyright (C) 2003 - 2020 Tristan Gingold.
GHDL is free software, covered by the GNU General Public License.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# ghdl -e --std=08 mux
error: "mux" is neither an entity nor a configuration
C:\msys64\mingw64\bin\ghdl.exe: compilation error

# ghdl -e --std=08 multiplexer
error: entity "multiplexer" cannot be at the top of a design
mux.vhd:20:13: (package interface "mux_g" is a package generic)
C:\msys64\mingw64\bin\ghdl.exe: compilation error

eine avatar Jan 17 '21 18:01 eine

Yes, the reproducer is incomplete.

tgingold avatar Jan 17 '21 18:01 tgingold