From 9690351031dc5eb9baa7f2978ef1e27596402fca Mon Sep 17 00:00:00 2001
From: Miguel Jimenez Lopez <miguel.jimenez@sevensols.com>
Date: Wed, 10 Jul 2019 17:55:10 +0200
Subject: [PATCH] wr_nic_wrapper: Add NIC wrapper block code.

wr_nic_wrapper: Fix copyright issues.
---
 modules/wr_nic/Manifest.py            |   4 +-
 modules/wr_nic/wr_nic_wrapper.vhd     | 228 ++++++++++++++++++++++++++
 modules/wr_nic/wr_nic_wrapper_pkg.vhd | 204 +++++++++++++++++++++++
 3 files changed, 435 insertions(+), 1 deletion(-)
 create mode 100644 modules/wr_nic/wr_nic_wrapper.vhd
 create mode 100644 modules/wr_nic/wr_nic_wrapper_pkg.vhd

diff --git a/modules/wr_nic/Manifest.py b/modules/wr_nic/Manifest.py
index ae674984..f24707d4 100644
--- a/modules/wr_nic/Manifest.py
+++ b/modules/wr_nic/Manifest.py
@@ -9,5 +9,7 @@ files  = [  "nic_constants_pkg.vhd" ,
                                                 "nic_bw_throttling.vhd",
 						"nic_wbgen2_pkg.vhd",
 						"xwr_nic.vhd",
-						"wr_nic.vhd"];
+						"wr_nic.vhd",
+						"wr_nic_wrapper.vhd",
+						"wr_nic_wrapper_pkg.vhd"];
 
diff --git a/modules/wr_nic/wr_nic_wrapper.vhd b/modules/wr_nic/wr_nic_wrapper.vhd
new file mode 100644
index 00000000..10b03137
--- /dev/null
+++ b/modules/wr_nic/wr_nic_wrapper.vhd
@@ -0,0 +1,228 @@
+-------------------------------------------------------------------------------
+-- Title      : White Rabbit NIC wrapper
+-- Project    : WR PTP Core
+-- URL        : http://www.ohwr.org/projects/wr-cores/wiki/Wrpc_core
+-------------------------------------------------------------------------------
+-- File       : wr_nic_wrapper.vhd
+-- Company    : Seven Solutions
+-- Standard   : VHDL'93
+-------------------------------------------------------------------------------
+-- Description: Wrapper for WR NIC modules: NIC, VIC, TxTSU and a Wishbone
+-- Crossbar.
+-------------------------------------------------------------------------------
+--
+-- Copyright (c) 2019 CERN (www.cern.ch)
+--
+-- GNU LESSER GENERAL PUBLIC LICENSE
+--
+-- This source file is free software; you can redistribute it   
+-- and/or modify it under the terms of the GNU Lesser General   
+-- Public License as published by the Free Software Foundation; 
+-- either version 2.1 of the License, or (at your option) any   
+-- later version.                                               
+--
+-- This source is distributed in the hope that it will be       
+-- useful, but WITHOUT ANY WARRANTY; without even the implied   
+-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      
+-- PURPOSE.  See the GNU Lesser General Public License for more 
+-- details.                                                     
+--
+-- You should have received a copy of the GNU Lesser General    
+-- Public License along with this source; if not, download it   
+-- from http://www.gnu.org/licenses/lgpl-2.1.html
+-- 
+-------------------------------------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+library work;
+use work.gencores_pkg.all;
+use work.wrcore_pkg.all;
+use work.wishbone_pkg.all;
+use work.wr_fabric_pkg.all;
+use work.endpoint_pkg.all;
+use work.wr_nic_wrapper_pkg.all;
+
+entity wr_nic_wrapper is
+  generic(
+    -- Number of peripheral interrupt lines
+    g_num_irqs  : integer := 3;
+    -- Number of ports for the TxTSU module
+    g_num_ports : integer := 1
+  );
+  port(
+    ---------------------------------------------------------------------------
+    -- Global ports (Clocks & Resets)
+    ---------------------------------------------------------------------------
+    -- System clock
+    clk_sys_i              : in std_logic;
+    -- Global reset (active low)
+    resetn_i               : in std_logic;
+
+    ---------------------------------------------------------------------------
+    -- External WB slave interface
+    ---------------------------------------------------------------------------
+    ext_slave_i            : in  t_wishbone_slave_in;
+    ext_slave_o            : out t_wishbone_slave_out;
+
+    ---------------------------------------------------------------------------
+    -- NIC fabric data buses
+    ---------------------------------------------------------------------------
+    nic_snk_i              : in  t_wrf_sink_in;
+    nic_snk_o              : out t_wrf_sink_out;
+    nic_src_i              : in  t_wrf_source_in;
+    nic_src_o              : out t_wrf_source_out;
+
+    -- PPS-related signal for NIC core
+    pps_p_i                : in std_logic := '0';
+    pps_valid_i            : in std_logic := '0';
+
+    ---------------------------------------------------------------------------
+    -- VIC ports (peripheral interrupts lines and global interrupt output)
+    ---------------------------------------------------------------------------
+    vic_irqs_i             : in std_logic_vector(g_num_irqs-1 downto 0);
+    vic_int_o              : out std_logic;
+    
+    ---------------------------------------------------------------------------
+    -- TxTSU ports (Timestamp trigger and acknowlegdement signal)
+    ---------------------------------------------------------------------------
+    txtsu_timestamps_i     : in  t_txtsu_timestamp_array(g_num_ports-1 downto 0);
+    txtsu_timestamps_ack_o : out std_logic_vector(g_num_ports -1 downto 0)
+  );
+end entity wr_nic_wrapper;
+
+architecture struct of wr_nic_wrapper is
+  -----------------------------------------------------------------------------
+  -- Constants
+  -----------------------------------------------------------------------------
+
+  -- NIC constants
+  constant c_NIC_INTERFACE_MODE      : t_wishbone_interface_mode := PIPELINED;
+  constant c_NIC_ADDRESS_GRANULARITY : t_wishbone_address_granularity := BYTE;
+  constant c_NIC_SRC_CYC_ON_STALL    : boolean := true;
+  constant c_NIC_PORT_MASK_BITS      : integer := g_num_ports+1;
+  constant c_NIC_RMON_EVENTS_PP      : integer := 1;
+
+  -- VIC constants
+  constant c_VIC_INTERFACE_MODE      : t_wishbone_interface_mode := PIPELINED;
+  constant c_VIC_ADDRESS_GRANULARITY : t_wishbone_address_granularity := BYTE;
+  constant c_VIC_EXTRA_IRQS          : integer := 3;
+  constant c_VIC_NUM_IRQS            : integer := g_num_irqs+c_VIC_EXTRA_IRQS;
+  constant c_VIC_IRQ_TXTSU           : integer := 0;
+  constant c_VIC_IRQ_NIC             : integer := 1;
+  constant c_VIC_IRQ_PPS             : integer := 2;
+
+  -- TxTSU constants
+  constant c_TXTSU_NUM_PORTS           : integer := g_num_ports;
+  constant c_TXTSU_INTERFACE_MODE      : t_wishbone_interface_mode := PIPELINED;
+  constant c_TXTSU_ADDRESS_GRANULARITY : t_wishbone_address_granularity := BYTE;
+
+  -----------------------------------------------------------------------------
+  -- Signals
+  -----------------------------------------------------------------------------
+
+  -- Wishbone crossbar buses
+  signal cbar_slave_i  : t_wishbone_slave_in_array(c_NIC_WRAPPER_XBAR_NUM_MASTERS-1 downto 0);
+  signal cbar_slave_o  : t_wishbone_slave_out_array(c_NIC_WRAPPER_XBAR_NUM_MASTERS-1 downto 0);
+  signal cbar_master_i : t_wishbone_master_in_array(c_NIC_WRAPPER_XBAR_NUM_SLAVES-1 downto 0);
+  signal cbar_master_o : t_wishbone_master_out_array(c_NIC_WRAPPER_XBAR_NUM_SLAVES-1 downto 0);
+
+  -- Interrupts
+  signal txtsu_int     : std_logic;
+  signal nic_int       : std_logic;
+  signal vic_vec_int_i : std_logic_vector(c_VIC_NUM_IRQS-1 downto 0);
+
+begin  -- architecture struct
+
+  -----------------------------------------------------------------------------
+  -- Wishbone Crossbar
+  -----------------------------------------------------------------------------
+  cmp_wb_xbar : xwb_sdb_crossbar
+    generic map(
+      g_num_masters => c_NIC_WRAPPER_XBAR_NUM_MASTERS,
+      g_num_slaves  => c_NIC_WRAPPER_XBAR_NUM_SLAVES,
+      g_registered  => c_NIC_WRAPPER_XBAR_REGISTERED,
+      g_wraparound  => c_NIC_WRAPPER_XBAR_WRAPAROUND,
+      g_layout      => c_nic_wrapper_xbar_layout,
+      g_sdb_addr    => c_nic_wrapper_xbar_sdb_address)
+    port map(
+      clk_sys_i  => clk_sys_i,
+      rst_n_i    => resetn_i,
+      slave_i    => cbar_slave_i,
+      slave_o    => cbar_slave_o,
+      master_i   => cbar_master_i,
+      master_o   => cbar_master_o);
+
+  -- Assign slave interface of the WB crossbar to external port
+  cbar_slave_i(c_NIC_WRAPPER_XBAR_MASTER_EXT) <= ext_slave_i;
+  ext_slave_o                                 <= cbar_slave_o(c_NIC_WRAPPER_XBAR_MASTER_EXT);
+
+  -----------------------------------------------------------------------------
+  -- WR-NIC module
+  -----------------------------------------------------------------------------
+  cmp_nic : xwr_nic
+    generic map(
+      g_interface_mode      => c_NIC_INTERFACE_MODE,
+      g_address_granularity => c_NIC_ADDRESS_GRANULARITY,
+      g_src_cyc_on_stall    => c_NIC_SRC_CYC_ON_STALL,
+		g_port_mask_bits      => c_NIC_PORT_MASK_BITS,
+		g_rmon_events_pp      => c_NIC_RMON_EVENTS_PP)
+    port map(
+      clk_sys_i           => clk_sys_i,
+      rst_n_i             => resetn_i,
+		pps_p_i             => pps_p_i,
+      pps_valid_i         => pps_valid_i,
+      snk_i               => nic_snk_i,
+      snk_o               => nic_snk_o,
+      src_i               => nic_src_i,
+      src_o               => nic_src_o,
+      rtu_dst_port_mask_o => open,
+      rtu_prio_o          => open,
+      rtu_drop_o          => open,
+      rtu_rsp_valid_o     => open,
+      rtu_rsp_ack_i       => '1',
+      wb_i                => cbar_master_o(c_NIC_WRAPPER_XBAR_SLAVE_NIC),
+      wb_o                => cbar_master_i(c_NIC_WRAPPER_XBAR_SLAVE_NIC),
+      int_o               => nic_int,
+      rmon_events_o       => open);
+
+  -----------------------------------------------------------------------------
+  -- Wishbone VIC controller
+  -----------------------------------------------------------------------------
+  cmp_vic : xwb_vic
+    generic map(
+      g_interface_mode      => c_VIC_INTERFACE_MODE,
+      g_address_granularity => c_VIC_ADDRESS_GRANULARITY,
+      g_num_interrupts      => c_VIC_NUM_IRQS)
+    port map(
+      clk_sys_i    => clk_sys_i,
+      rst_n_i      => resetn_i,
+      slave_i      => cbar_master_o(c_NIC_WRAPPER_XBAR_SLAVE_VIC),
+      slave_o      => cbar_master_i(c_NIC_WRAPPER_XBAR_SLAVE_VIC),
+      irqs_i       => vic_vec_int_i,
+      irq_master_o => vic_int_o);
+
+  vic_vec_int_i(c_VIC_IRQ_TXTSU) <= txtsu_int;
+  vic_vec_int_i(c_VIC_IRQ_NIC)   <= nic_int;
+  vic_vec_int_i(c_VIC_IRQ_PPS)   <= pps_p_i;
+  vic_vec_int_i(c_VIC_NUM_IRQS-1 downto c_VIC_EXTRA_IRQS) <= vic_irqs_i;
+
+  -----------------------------------------------------------------------------
+  -- TxTSU module
+  -----------------------------------------------------------------------------
+  cmp_txtsu : xwr_tx_tsu
+    generic map(
+      g_num_ports           => c_TXTSU_NUM_PORTS,
+      g_interface_mode      => c_TXTSU_INTERFACE_MODE,
+      g_address_granularity => c_TXTSU_ADDRESS_GRANULARITY)
+    port map(
+      clk_sys_i           => clk_sys_i,
+      rst_n_i             => resetn_i,
+      timestamps_i        => txtsu_timestamps_i,
+      timestamps_ack_o    => txtsu_timestamps_ack_o,
+      wb_i                => cbar_master_o(c_NIC_WRAPPER_XBAR_SLAVE_TXTSU),
+      wb_o                => cbar_master_i(c_NIC_WRAPPER_XBAR_SLAVE_TXTSU),
+      int_o               => txtsu_int);
+
+end architecture struct;
diff --git a/modules/wr_nic/wr_nic_wrapper_pkg.vhd b/modules/wr_nic/wr_nic_wrapper_pkg.vhd
new file mode 100644
index 00000000..6e3e7131
--- /dev/null
+++ b/modules/wr_nic/wr_nic_wrapper_pkg.vhd
@@ -0,0 +1,204 @@
+-------------------------------------------------------------------------------
+-- Title      : WR-NIC Wrapper package
+-- Project    : WR PTP Core
+-- URL        : http://www.ohwr.org/projects/wr-cores/wiki/Wrpc_core
+-------------------------------------------------------------------------------
+-- File       : wr_nic_wrapper_pkg.vhd
+-- Company    : Seven Solutions
+-- Standard   : VHDL'93
+-------------------------------------------------------------------------------
+--
+-- Copyright (c) 2019 CERN (www.cern.ch)
+--
+-- GNU LESSER GENERAL PUBLIC LICENSE
+--
+-- This source file is free software; you can redistribute it   
+-- and/or modify it under the terms of the GNU Lesser General   
+-- Public License as published by the Free Software Foundation; 
+-- either version 2.1 of the License, or (at your option) any   
+-- later version.                                               
+--
+-- This source is distributed in the hope that it will be       
+-- useful, but WITHOUT ANY WARRANTY; without even the implied   
+-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      
+-- PURPOSE.  See the GNU Lesser General Public License for more 
+-- details.                                                     
+--
+-- You should have received a copy of the GNU Lesser General    
+-- Public License along with this source; if not, download it   
+-- from http://www.gnu.org/licenses/lgpl-2.1.html
+-- 
+-------------------------------------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+library work;
+use work.gencores_pkg.all;
+use work.wrcore_pkg.all;
+use work.wishbone_pkg.all;
+use work.wr_fabric_pkg.all;
+use work.endpoint_pkg.all;
+
+package wr_nic_wrapper_pkg is
+
+  -----------------------------------------------------------------------------
+  -- Components
+  -----------------------------------------------------------------------------
+
+  -- Network Interface Core (NIC) component
+  component xwr_nic
+  generic(
+    g_interface_mode      : t_wishbone_interface_mode      := CLASSIC;
+    g_address_granularity : t_wishbone_address_granularity := WORD;
+    g_src_cyc_on_stall    : boolean := false;
+    g_port_mask_bits      : integer := 32; --should be num_ports+1
+    g_rmon_events_pp      : integer := 1);
+  port (
+    clk_sys_i : in std_logic;
+    rst_n_i   : in std_logic;
+    pps_p_i     : in std_logic;
+    pps_valid_i : in std_logic;
+    snk_i : in  t_wrf_sink_in;
+    snk_o : out t_wrf_sink_out;
+    src_i : in  t_wrf_source_in;
+    src_o : out t_wrf_source_out;
+    rtu_dst_port_mask_o : out std_logic_vector(g_port_mask_bits-1 downto 0);
+    rtu_prio_o          : out std_logic_vector(2 downto 0);
+    rtu_drop_o          : out std_logic;
+    rtu_rsp_valid_o     : out std_logic;
+    rtu_rsp_ack_i       : in  std_logic;
+    wb_i : in  t_wishbone_slave_in;
+    wb_o : out t_wishbone_slave_out;
+    int_o: out std_logic;
+    rmon_events_o : out std_logic_vector(g_port_mask_bits*g_rmon_events_pp-1 downto 0));
+  end component;
+
+  -- Transimission TimeStamp Unit (TxTSU) component
+  component xwr_tx_tsu
+  generic(
+    g_num_ports           : integer                        := 10;
+    g_interface_mode      : t_wishbone_interface_mode      := CLASSIC;
+    g_address_granularity : t_wishbone_address_granularity := WORD);
+  port(
+    clk_sys_i        : in  std_logic;
+    rst_n_i          : in  std_logic;
+    timestamps_i     : in  t_txtsu_timestamp_array(g_num_ports-1 downto 0);
+    timestamps_ack_o : out std_logic_vector(g_num_ports -1 downto 0);
+    wb_i             : in  t_wishbone_slave_in;
+    wb_o             : out t_wishbone_slave_out;
+    int_o            : out std_logic);
+  end component;
+  
+  component wr_nic_wrapper
+  generic(
+    -- Number of peripheral interrupt lines
+    g_num_irqs  : integer := 3;
+    -- Number of ports for the TxTSU module
+    g_num_ports : integer := 1
+  );
+  port(
+    ---------------------------------------------------------------------------
+    -- Global ports (Clocks & Resets)
+    ---------------------------------------------------------------------------
+    -- System clock
+    clk_sys_i              : in std_logic;
+    -- Global reset (active low)
+    resetn_i               : in std_logic;
+
+    ---------------------------------------------------------------------------
+    -- External WB slave interface
+    ---------------------------------------------------------------------------
+    ext_slave_i            : in  t_wishbone_slave_in;
+    ext_slave_o            : out t_wishbone_slave_out;
+
+    ---------------------------------------------------------------------------
+    -- NIC fabric data buses
+    ---------------------------------------------------------------------------
+    nic_snk_i              : in  t_wrf_sink_in;
+    nic_snk_o              : out t_wrf_sink_out;
+    nic_src_i              : in  t_wrf_source_in;
+    nic_src_o              : out t_wrf_source_out;
+
+    -- PPS-related signal for NIC core
+    pps_p_i                : in std_logic := '0';
+    pps_valid_i            : in std_logic := '0';
+
+    ---------------------------------------------------------------------------
+    -- VIC ports (peripheral interrupts lines and global interrupt output)
+    ---------------------------------------------------------------------------
+    vic_irqs_i             : in std_logic_vector(g_num_irqs-1 downto 0);
+    vic_int_o              : out std_logic;
+    
+    ---------------------------------------------------------------------------
+    -- TxTSU ports (Timestamp trigger and acknowlegdement signal)
+    ---------------------------------------------------------------------------
+    txtsu_timestamps_i     : in  t_txtsu_timestamp_array(g_num_ports-1 downto 0);
+    txtsu_timestamps_ack_o : out std_logic_vector(g_num_ports -1 downto 0)
+  );
+  end component;
+  
+  -----------------------------------------------------------------------------
+  -- Constants
+  -----------------------------------------------------------------------------
+
+  -- SDB constants for NIC and TxTSU
+  constant c_xwr_nic_sdb : t_sdb_device := (
+    abi_class     => x"0000", -- undocumented device
+    abi_ver_major => x"01",
+    abi_ver_minor => x"01",
+    wbd_endian    => c_sdb_endian_big,
+    wbd_width     => x"7", -- 8/16/32-bit port granularity
+    sdb_component => (
+    addr_first    => x"0000000000000000",
+    addr_last     => x"000000000000ffff",  -- I think this is overestimated (orig. 1ffff, wrsw_hdl. ffff)
+    product => (
+    vendor_id     => x"000000000000CE42", -- CERN
+    device_id     => x"00000012",
+    version       => x"00000001",
+    date          => x"20000101",         -- UNKNOWN
+    name          => "WR-NIC             ")));
+
+  constant c_xwr_txtsu_sdb : t_sdb_device := (
+    abi_class     => x"0000", -- undocumented device
+    abi_ver_major => x"01",
+    abi_ver_minor => x"01",
+    wbd_endian    => c_sdb_endian_big,
+    wbd_width     => x"7", -- 8/16/32-bit port granularity
+    sdb_component => (
+    addr_first    => x"0000000000000000",
+    addr_last     => x"00000000000000ff",
+    product => (
+    vendor_id     => x"000000000000CE42", -- CERN
+    device_id     => x"00000014",
+    version       => x"00000001",
+    date          => x"20120316",
+    name          => "WR-TXTSU           ")));
+	 
+  -- WB Crossbar constants
+  constant c_NIC_WRAPPER_XBAR_REGISTERED  : boolean := true;
+  constant c_NIC_WRAPPER_XBAR_WRAPAROUND  : boolean := true;
+
+  constant c_NIC_WRAPPER_XBAR_NUM_MASTERS : integer := 1;
+  constant c_NIC_WRAPPER_XBAR_MASTER_EXT  : integer := 0;
+
+  constant c_NIC_WRAPPER_XBAR_NUM_SLAVES  : integer := 3;
+  constant c_NIC_WRAPPER_XBAR_SLAVE_NIC   : integer := 0;
+  constant c_NIC_WRAPPER_XBAR_SLAVE_VIC   : integer := 1;
+  constant c_NIC_WRAPPER_XBAR_SLAVE_TXTSU : integer := 2;
+
+  -- Crossbar memory layout
+  constant c_nic_wrapper_xbar_layout : t_sdb_record_array(c_NIC_WRAPPER_XBAR_NUM_SLAVES-1 downto 0) := (
+     c_NIC_WRAPPER_XBAR_SLAVE_NIC => f_sdb_embed_device(c_xwr_nic_sdb , x"00000000"),
+     c_NIC_WRAPPER_XBAR_SLAVE_VIC => f_sdb_embed_device(c_xwb_vic_sdb , x"00010000"),
+     c_NIC_WRAPPER_XBAR_SLAVE_TXTSU => f_sdb_embed_device(c_xwr_txtsu_sdb , x"00010100")
+  );
+  -- Crossbar SDB entry address
+  constant c_nic_wrapper_xbar_sdb_address : t_wishbone_address := x"00011000";
+  constant c_nic_wrapper_xbar_bridge_sdb  : t_sdb_bridge       :=
+    f_xwb_bridge_layout_sdb(true, c_nic_wrapper_xbar_layout, c_nic_wrapper_xbar_sdb_address);
+
+end wr_nic_wrapper_pkg;
+
+package body wr_nic_wrapper_pkg is
+end package body wr_nic_wrapper_pkg;
-- 
GitLab