[vhdl-200x] AW: Interfaces with normal, conjugated and monitor flavours

From: Lehmann, Patrick <patrick.lehmann@tu-dresden.de>
Date: Wed Feb 18 2015 - 12:21:48 PST
Hello John,

I would suggest to use a record definition like syntax to define interfaces:
type i_fifo is interface
  valid : out std_logic;
  data : out std_logic_vector(7 downto 0);
  ack : in std_logic;
end interface;

Do you have plans to allow generic interfaces?
In my example i_fifo defines a typical fifo interface. But fifos can have 
different widths.
What about this synthax?

type i_fifo is interface
  generic (BITS : positive);
  port (
    valid : out std_logic;
    data : out std_logic_vector(BITS - 1 downto 0);
    ack : in std_logic
  );
end interface;

Putting interfaces into interfaces is nice, but can have some drawbacks. Let's 
assume a fifo-interface
with frame markers (like LocalLink). In your example it would look like this:

type i_framed is interface
  fifo : interface i_fifo;
  sof  : out std_logic;
  eof  : out std_logic;
end interface i_framed;

signal myFramed : i_framed;
signal myData : std_logic_vector(7 downto 0);

If you want to access data, you have to write:
myData <= myFramed.fifo.data;

What is your opinion on interface extensions (inheritance):
type i_framed is interface
  extend (i_fifo);
  port (
    sof  : out std_logic;
    eof  : out std_logic
  );
end interface;

And here is a signal declaration:
signal myFramed : i_framed(BITS => 8);


Regards
    Patrick


Von: owner-vhdl-200x@eda.org [mailto:owner-vhdl-200x@eda.org] Im Auftrag von 
John.Aasen@kongsberg.com
Gesendet: Mittwoch, 18. Februar 2015 15:40
An: vhdl-200x@eda.org
Betreff: [vhdl-200x] Interfaces with normal, conjugated and monitor flavours

There are multiple suggested extensions for ports.

http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/BlockInterfaces
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/PackageAsInterface
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/InterfaceConstructandPortModeConfigurations
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/NewBusModeForBidirectionalPortSignals
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/ProtectedTypesPublicSignal
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/ProtectedTypeEntity

But I still want to suggest a way of modelling ports that is based on the 
concepts from SysML (http://www.omgsysml.org/) which I believe match very well 
with VHDL.

In SysML a port can typed with an interface. This interface may contain flows 
with directions, i.e. in, out or inout, or other interfaces.
When connecting two ports the directions will be reversed on one side. To 
avoid needing two definitions of the interface, SysML uses the concept of a 
conjugated port. The conjugated port will invert the direction of the flows: 
in becomes out, out becomes in while inout stays inout. In addition it is 
allowed to create ports-of-ports to represent bundles of information.

This allows a single interface definition to be used on both sides of a 
connection, and it is no longer necessary to define for example a master and a 
slave interface with the same signals but the opposite direction.
This is useful both in testbenches and in designs

Example (Similar to 
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/BlockInterfaces)

-- Single definition of the interface
-- Directions defined as seen from the CPU (master)
-- slaves will need a conjugated  version of the interface
-- Which end is normal and which is conjugated is a convention
interface i_cpu_bus is
  adr : out   std_logic_vector(15 downto 0);  --Address
  dat : inout std_logic_vector(15 downto 0);  --Data between master and slave
  cs  : out std_logic_vector(7 downto 0);  -- ChipSelect-bus from master
  we  : out std_logic;    --Write enable from master
  en  : out std_logic;    --Enable from master
  ack : in std_logic;    --Acknowledge from slave
  err : in std_logic;    --Error from slave
end interface;

--Master entity
entity master is
  port (
    clk : in std_logic;
    bus : interface i_cpu_bus
    );
end entity;

--Slave entity - reverses direction for 'in' and 'out' interface elements
entity slave is
  port (
    clk : in std_logic;
    bus : conjugated i_cpu_bus
  );

-- bus monitor - all interface elements are 'in'
  port (
    clk : in std_logic;
    bus : monitor i_cpu_bus
  );

--Top level
  signal cpu_bus : t_cpu_bus;

  i_master : master
    port map (
      clk => clk,
      bus => cpu_bus
      );

  i_slave : slave
    port map (
      clk => clk,
      bus => cpu_bus
    );

  i_monitor : monitor
    port map (
      clk => clk,
      bus => cpu_bus
    );


Hierarchical interfaces
use 'normal' VHDL syntax to build ports-of-ports and arrays-of-ports, or 
combination

interface i_cpu_bus_vec is array (natural range <>) of i_cpu_bus;

interface i_foo
  sof  : in std_logic;
  eof  : in std_logic;
  data : in std_logic_vector(7 downto 0);
end interface i_foo;

interface i_bar
  req : in std_logic;
  ack : out std_logic;
end interface i_bar;

interface i_baz
  handshake : interface i_bar;
  packet : conjugated i_foo;
  cpu_vec : i_cpu_bus_vec(3 downto 0);
end interface;



-- use port configurations to disconnect unused elements
-- I am not sure that this is a good syntax, but we need something to
-- avoid connecting elements and pick out elements / vectors of arrays
-- Alternative might be some kind of port configuration
-- see
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/InterfaceConstructandPortModeConfigurations

entity slave is
  port (
    clk : in std_logic;
    bus : conjugated i_cpu_bus
  );

  i_slave : slave
    port map (
      clk => clk,
      bus => cpu_bus(cs => cs(c_SlaveId),  -- pick single element,
         -- type of cs becomes the base type of the vector,
         -- i.e. std_logic
                     data => data(7 downto 0),  -- pick a slice,
         -- range of data becomes sub_range std_logic_vector(7 downto
0)
                     we => open)  -- unused port (read-only slave)

    );

Alternative - limit width in entity
entity slave is
  generic (
    c_SlaveId : integer);          -- Selects CS element
  port (
    clk : in std_logic;
    bus : conjugated i_cpu_bus(cs => cs(c_SlaveId),
                               data => data(7 downto 0),
                               we => open)
  );



Final notes:

Records with direction might be used instead of interface. See
http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/NewBusModeForBidirectionalPortSignals#3_Assignments_can_be_to_a_record
for how a modification to a record assignment may be used to handle partial 
assignments to the elements in a record or interface.
The main point of the proposal is to use normal, conjugated and monitor ports 
and have a single definition of an interface.

I also propose that this interface also may be used instead of a type or 
subtype to define signals or variables in a design / testbench.

John Aasen

________________________________________

CONFIDENTIALITY
This e-mail and any attachment contain KONGSBERG information which may be 
proprietary, confidential or subject to export regulations, and is only meant 
for the intended recipient(s). Any disclosure, copying, distribution or use is 
prohibited, if not otherwise explicitly agreed with KONGSBERG. If received in 
error, please delete it immediately from your system and notify the sender 
properly.

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Wed Feb 18 12:22:29 2015

This archive was generated by hypermail 2.1.8 : Wed Feb 18 2015 - 12:23:01 PST