Re: [vhdl-200x] Directional records proposal

From: Brent Hayhoe <Brent.Hayhoe@Aftonroy.com>
Date: Sun Jul 15 2012 - 06:39:04 PDT

It's really great to see so much interest in this topic. It's something that I
had hoped would have made it into the 2008 revision as this problem has been
bugging me for a long time.

I feared that it had been subsumed into the interface concept, which I believe
in itself could be an excellent addition to introduce into VHDL, but I believe
the record I/O problem should be solved in its own right and also not limited to
just a master and slave port concepts.

Forgive me if am I re-covering old ground, but I think the problem is not with
the record type itself, instead it resides within the port mode structure and
can be solved by the addition of a new mode (which seems to have been alluded to
in some posts).

I'd like to suggest looking at the problem from this different angle and so
given our record type definition:

    type cpu_bus_r is
      record
        adr_vl : std_logic_vector(15 downto 0); --Address
        dat_vl : std_logic_vector(15 downto 0); --Data from master to slave
        we_l : std_logic; --Write enable from master
        en_l : std_logic; --Enable from master
        sdt_vl : std_logic_vector(15 downto 0); --Data from slave to master
        ack_l : std_logic; --Acknowledge from slave
        err_l : std_logic; --Error from slave

      end record cpu_bus_r;

we need a new a new port mode of, let's say 'record' (being a kind of
hierarchical mode):

    entity master is
      port (
        clk_i : in std_logic;
        bus_r : record (
          adr_vl : out std_logic_vector(15 downto 0);
          dat_vl : out std_logic_vector(15 downto 0);
          we_l : out std_logic;
          en_l : out std_logic;
          sdt_vl : in std_logic_vector(15 downto 0);
          ack_l : in std_logic;
          err_l : in std_logic
          ) cpu_bus_r;
        rst_i : in std_logic
       );
    end entity master;

    entity slave is
      port (
        clk_i : in std_logic;
        bus_rio : record (
          adr_vl : in std_logic_vector(15 downto 0);
          dat_vl : in std_logic_vector(15 downto 0);
          we_l : in std_logic;
          en_l : in std_logic;
          sdt_vl : out std_logic_vector(15 downto 0);
          ack_l : out std_logic;
          err_l : out std_logic
          ) cpu_bus_r;
        rst_i : in std_logic
       );
    end entity slave;

which then leads to instantiations as shown:

    signal clk_s : std_logic;
    signal cpu_bus_rs : cpu_bus_r;
    signal rst_s : std_logic;

    master_inst : master
      port map (
        clk_i => clk_s,
        bus_rio => cpu_bus_rs,
        rst_i => rst_s
      );

    slave_inst : slave
      port map (
        clk_i => clk_s,
        bus_rio => cpu_bus_rs,
        rst_i => rst_s
      );

I can imagine this may cause problems for compiler designers, but from a user
perspective I think it will cover all problem areas.

Functions could still use the existing format, as all ports by definition are
inputs and procedures would use the same new structure as entities (with the
'record' sub-modes being limited to 'in', 'out' or 'inout').

This does make the entity/component (and procedure) declarations more verbose,
but the instantiations will be quite compact. It should also allow recursive
record types to be mapped.

The instantiation mappings could still be expanded to individual element
mappings (cf. existing record or array elements), but we could also consider
another new mode type to allow an unconnected mapping for a particular record
element in an object that does not use that element.

The open keyword will work as a mapping, but the object then has to define an
unused 'out' element to be instantiated as 'open'. A new sub-mode of unconnected
would mean the port of that record would not have to be assigned or read from
within the object, but just defined in the declaration e.g.

    entity slave2 is
      port (
        clk_i : in std_logic;
        bus_rio : record (
          adr_vl : in std_logic_vector(15 downto 0);
          dat_vl : in std_logic_vector(15 downto 0);
          we_l : in std_logic;
          en_l : in std_logic;
          sdt_vl : out std_logic_vector(15 downto 0);
          ack_l : out std_logic;
          err_l : unconn std_logic
          ) cpu_bus_r;
        rst_i : in std_logic
       );
    end entity slave2;

Let's see what you all think.

Apologies for my verbosity and I hope I'm not talking complete hogwash!

-- 
Regards,
         Brent Hayhoe.
Aftonroy Limited                            Telephone: +44 (0)20-8449-1852
135 Lancaster Road,
New Barnet,                                    Mobile: +44 (0)79-6647-2574
Herts., EN4 8AJ,  U.K.                          Email: Brent.Hayhoe@Aftonroy.com
Registered Number: 1744190 England.
Registered Office:
4th Floor, Imperial House,
15 Kingsway,
London, WC2B 6UN, U.K.
Received on Sun Jul 15 06:39:14 2012

This archive was generated by hypermail 2.1.8 : Sun Jul 15 2012 - 06:39:51 PDT