package util is
   type logger is protected
      procedure log(msg : string; sev : severity_level);
   end protected;
end package;

library ieee;
   use ieee.std_logic_1164.all;

   use work.util.logger;

package factory is
   generic(
      type tpe;
      generic1 : natural;
      generic2 : string
   );
   shared variable foo : logger;

   type bus_rec is record
      clk : std_logic;
      rst : std_logic;
      element1 : tpe;
      element2 : std_logic;
      element3 : std_logic_vector(generic1 downto 0);
   end record;

   type bus_rec_arr is array (natural range <>) of bus_rec;

   port view master of bus_rec is -- port view or port bus?
      element1 => in;
      element2 => out;
   end port view master;

   port view slave of bus_rec is
      element1 => out;
      element2 => in;
   end port view master;

end package;

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

entity e_sub is
   generic(
      package f is new work.factory generic map(<>)
   );
   port(
      bus_r : f.master for f.bus_rec;
      bus_r_slaves : /*  */ f.bus_rec_arr
   );
end;

library ieee; 
   use ieee.std_logic_1164.all;

entity e is
   generic(
      package f is new work.factory generic map(<>)
   );
   port(
      bus_r : /*  */ f.bus_rec;
      bus_r_slaves : /*  */ f.bus_rec_arr
   );
end entity e;

architecture RTL of e is
begin
   e_sub_inst : entity work.e_sub
   generic map(f => f)
   port map(
      bus_r => bus_r,
      bus_r_slaves => bus_r_slaves
   );
end architecture RTL;

library ieee;
   use ieee.std_logic_1164.all;

entity top is
end entity;

architecture RTL of top is
   package factory is new work.factory generic map (
      tpe => integer,
      generic1 => 10,
      generic2 => "foobar"
   );
 
   use factory.all;

   signal clk, rst : std_logic;
   signal clk2 : std_logic;
   signal m : bus_rec;
 
   port master_bus : bus_rec; -- master or slave modifier not required?
   port slave_busses : bus_rec_arr(0 to 10);
begin
 
   --------------------------------------------------------------------------
   -- Association operations: How do these signals/ports connect?
 
   -- Option 1: Can we dynamically reassociate signals to one another?
   clk2 <=> clk;
   m.clk <=> clk ; 
 
   -- Option 2: How about a port map to associate true signals to the port
   master_bus_inst : /* view */ master_bus port map (
      clk => rst,
      rst => rst,
      others => new
    )
 
      -- Option 3: Hybrid, a mapping operator but the port is still different
      -- than a signal.
      master_bus <=> m;
      master_bus <=> (
      clk => rst,
      rst => rst,
      others => new
   );
   --------------------------------------------------------------------------
 
 
   lbl : for i in 0 to 10 generate
      slave_bus_inst : slave_busses(i) port map (
         clk => clk,
         rst => rst,
         others => new
         -- elementx => master_bus.foo ???
      )
   end generate lbl;
 
   e_inst : entity work.e
      generic map(
         f => factory
      );
      port map(
         bus_r => master_bus,
         bus_r_slaves => slave_busses
      );
end architecture RTL;
 
--------------------------------------------------------------------------
-- This is more discussion of association, not necessarily directly
-- relating to interfaces.
entity clk_extractor is
   port ( WB_SYS : in t_wb_sys; o : out std_logic);
end entity clk_extractor;

architecture Behavioral of clk_extractor is
   port internal : std_logic;
begin
   internal <=> WB_SYS.CLK_I;
   internal <=> o;
end architecture Behavioral;

entity model is 
   port (A : bus1 ; B : bus1 ; ...) ;
end entity model ; 

architecture behav of model is 
begin
   I <=> A
Topic revision: r2 - 2016-08-19 - 12:44:23 - BrentHahoe
 
Copyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback