From a76a0543879fbadd0cefef8bd259d99b5c7313dc Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 18 Jan 2026 01:32:40 -0800 Subject: [PATCH] Add upstream ip check --- .gitignore | 9 +- init_env.sh | 11 + requirements.txt | 11 + sim/sim.yaml | 2 + sim/verilator.vlt | 3 + src/common/taxi | 2 +- src/common/taxi_sources.list | 342 ++++++++++++++++++ src/sub/upstream_path/sim/sources.list | 7 + .../upstream_path/sim/upstream_ip_check.py | 65 ++++ .../sim/upstream_ip_check_harness.sv | 21 ++ src/sub/upstream_path/sim/upstream_path.yaml | 7 + src/sub/upstream_path/src/sources.list | 1 + .../upstream_path/src/upstream_ip_check.sv | 144 ++++++++ .../upstream_path/{ => src}/upstream_path.sv | 0 14 files changed, 623 insertions(+), 2 deletions(-) create mode 100644 init_env.sh create mode 100644 requirements.txt create mode 100644 sim/verilator.vlt create mode 100644 src/common/taxi_sources.list create mode 100644 src/sub/upstream_path/sim/sources.list create mode 100644 src/sub/upstream_path/sim/upstream_ip_check.py create mode 100644 src/sub/upstream_path/sim/upstream_ip_check_harness.sv create mode 100644 src/sub/upstream_path/sim/upstream_path.yaml create mode 100644 src/sub/upstream_path/src/sources.list create mode 100644 src/sub/upstream_path/src/upstream_ip_check.sv rename src/sub/upstream_path/{ => src}/upstream_path.sv (100%) diff --git a/.gitignore b/.gitignore index e68113e..49616fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ # Draw.io -*.bkp \ No newline at end of file +*.bkp + +# Python +*.pyc +__pycache__/ + +# Simulations +sim_build/ \ No newline at end of file diff --git a/init_env.sh b/init_env.sh new file mode 100644 index 0000000..ecd3b84 --- /dev/null +++ b/init_env.sh @@ -0,0 +1,11 @@ +PYTHON=python3 + +module load verilator +# module load vivado/2024.2 + +$PYTHON -m venv .venv/${HOSTNAME} +source .venv/${HOSTNAME}/bin/activate + +pip install -r requirements.txt + +export TOP_DIR=$(git rev-parse --show-toplevel) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2f76c2c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +scapy +cocotb +cocotbext-axi +cocotbext-eth +cocotbext-pcie +rtl-manifest +build_fpga +fpga-sim +peakrdl +peakrdl-python-regmap +git+https://git.byronlathi.com/bslathi19/PeakRDL-BusDecoder.git@taxi_apb \ No newline at end of file diff --git a/sim/sim.yaml b/sim/sim.yaml index e69de29..a05af8d 100644 --- a/sim/sim.yaml +++ b/sim/sim.yaml @@ -0,0 +1,2 @@ +yaml: + - ../src/sub/upstream_path/sim/upstream_path.yaml \ No newline at end of file diff --git a/sim/verilator.vlt b/sim/verilator.vlt new file mode 100644 index 0000000..3bb36cf --- /dev/null +++ b/sim/verilator.vlt @@ -0,0 +1,3 @@ +`verilator_config + +lint_off -rule TIMESCALEMOD \ No newline at end of file diff --git a/src/common/taxi b/src/common/taxi index 8328f50..62da198 160000 --- a/src/common/taxi +++ b/src/common/taxi @@ -1 +1 @@ -Subproject commit 8328f50673776b7937714f01bcd17dd64a7b8b99 +Subproject commit 62da198a763c65ea4d801a97f679c32d4d420405 diff --git a/src/common/taxi_sources.list b/src/common/taxi_sources.list new file mode 100644 index 0000000..5b36f95 --- /dev/null +++ b/src/common/taxi_sources.list @@ -0,0 +1,342 @@ +taxi/src/cndm_proto/tb/cndm_proto_pcie_us/test_cndm_proto_pcie_us.sv +taxi/src/cndm_proto/rtl/cndm_proto_desc_rd.sv +taxi/src/cndm_proto/rtl/cndm_proto_tx.sv +taxi/src/cndm_proto/rtl/cndm_proto_core.sv +taxi/src/cndm_proto/rtl/cndm_proto_rx.sv +taxi/src/cndm_proto/rtl/cndm_proto_pcie_us.sv +taxi/src/cndm_proto/rtl/cndm_proto_port.sv +taxi/src/cndm_proto/rtl/cndm_proto_cpl_wr.sv +taxi/src/axi/tb/taxi_axi_adapter/test_taxi_axi_adapter.sv +taxi/src/axi/tb/taxi_axi_axil_adapter/test_taxi_axi_axil_adapter.sv +taxi/src/axi/tb/taxi_axil_dp_ram/test_taxi_axil_dp_ram.sv +taxi/src/axi/tb/taxi_axil_crossbar/test_taxi_axil_crossbar.sv +taxi/src/axi/tb/taxi_axi_interconnect/test_taxi_axi_interconnect.sv +taxi/src/axi/tb/taxi_axil_interconnect/test_taxi_axil_interconnect.sv +taxi/src/axi/tb/taxi_axi_ram/test_taxi_axi_ram.sv +taxi/src/axi/tb/taxi_axil_adapter/test_taxi_axil_adapter.sv +taxi/src/axi/tb/taxi_axi_fifo/test_taxi_axi_fifo.sv +taxi/src/axi/tb/taxi_axil_interconnect_1s/test_taxi_axil_interconnect_1s.sv +taxi/src/axi/tb/taxi_axil_ram/test_taxi_axil_ram.sv +taxi/src/axi/tb/taxi_axi_crossbar_1s/test_taxi_axi_crossbar_1s.sv +taxi/src/axi/tb/taxi_axi_interconnect_1s/test_taxi_axi_interconnect_1s.sv +taxi/src/axi/tb/taxi_axi_crossbar/test_taxi_axi_crossbar.sv +taxi/src/axi/tb/taxi_axi_register/test_taxi_axi_register.sv +taxi/src/axi/tb/taxi_axil_register/test_taxi_axil_register.sv +taxi/src/axi/tb/taxi_axil_apb_adapter/test_taxi_axil_apb_adapter.sv +taxi/src/axi/tb/taxi_axil_crossbar_1s/test_taxi_axil_crossbar_1s.sv +taxi/src/axi/tb/taxi_axil_axi_adapter/test_taxi_axil_axi_adapter.sv +taxi/src/axi/rtl/taxi_axil_axi_adapter_wr.sv +taxi/src/axi/rtl/taxi_axil_crossbar_1s_wr.sv +taxi/src/axi/rtl/taxi_axi_crossbar_wr.sv +taxi/src/axi/rtl/taxi_axil_crossbar_wr.sv +taxi/src/axi/rtl/taxi_axi_interconnect_rd.sv +taxi/src/axi/rtl/taxi_axil_ram.sv +taxi/src/axi/rtl/taxi_axi_axil_adapter_rd.sv +taxi/src/axi/rtl/taxi_axil_dp_ram.sv +taxi/src/axi/rtl/taxi_axi_adapter_rd.sv +taxi/src/axi/rtl/taxi_axi_axil_adapter.sv +taxi/src/axi/rtl/taxi_axil_register_wr.sv +taxi/src/axi/rtl/taxi_axi_tie_wr.sv +taxi/src/axi/rtl/taxi_axil_adapter_rd.sv +taxi/src/axi/rtl/taxi_axil_interconnect_1s_rd.sv +taxi/src/axi/rtl/taxi_axil_tie.sv +taxi/src/axi/rtl/taxi_axil_crossbar_rd.sv +taxi/src/axi/rtl/taxi_axil_adapter_wr.sv +taxi/src/axi/rtl/taxi_axil_if.sv +taxi/src/axi/rtl/taxi_axi_tie.sv +taxi/src/axi/rtl/taxi_axil_tie_rd.sv +taxi/src/axi/rtl/taxi_axi_interconnect_wr.sv +taxi/src/axi/rtl/taxi_axil_interconnect_wr.sv +taxi/src/axi/rtl/taxi_axil_apb_adapter.sv +taxi/src/axi/rtl/taxi_axi_interconnect_1s.sv +taxi/src/axi/rtl/taxi_axil_interconnect_rd.sv +taxi/src/axi/rtl/taxi_axi_crossbar_1s.sv +taxi/src/axi/rtl/taxi_axi_crossbar_1s_rd.sv +taxi/src/axi/rtl/taxi_axi_fifo_wr.sv +taxi/src/axi/rtl/taxi_axil_interconnect.sv +taxi/src/axi/rtl/taxi_axil_crossbar_addr.sv +taxi/src/axi/rtl/taxi_axil_tie_wr.sv +taxi/src/axi/rtl/taxi_axi_register_rd.sv +taxi/src/axi/rtl/taxi_axi_interconnect.sv +taxi/src/axi/rtl/taxi_axi_adapter_wr.sv +taxi/src/axi/rtl/taxi_axi_crossbar_addr.sv +taxi/src/axi/rtl/taxi_axil_axi_adapter.sv +taxi/src/axi/rtl/taxi_axil_register_rd.sv +taxi/src/axi/rtl/taxi_axi_ram.sv +taxi/src/axi/rtl/taxi_axil_crossbar.sv +taxi/src/axi/rtl/taxi_axi_crossbar_rd.sv +taxi/src/axi/rtl/taxi_axil_crossbar_1s_rd.sv +taxi/src/axi/rtl/taxi_axi_tie_rd.sv +taxi/src/axi/rtl/taxi_axil_register.sv +taxi/src/axi/rtl/taxi_axi_interconnect_1s_rd.sv +taxi/src/axi/rtl/taxi_axi_axil_adapter_wr.sv +taxi/src/axi/rtl/taxi_axi_crossbar_1s_wr.sv +taxi/src/axi/rtl/taxi_axi_crossbar.sv +taxi/src/axi/rtl/taxi_axi_interconnect_1s_wr.sv +taxi/src/axi/rtl/taxi_axil_interconnect_1s.sv +taxi/src/axi/rtl/taxi_axi_if.sv +taxi/src/axi/rtl/taxi_axi_fifo.sv +taxi/src/axi/rtl/taxi_axil_adapter.sv +taxi/src/axi/rtl/taxi_axi_adapter.sv +taxi/src/axi/rtl/taxi_axil_interconnect_1s_wr.sv +taxi/src/axi/rtl/taxi_axi_register_wr.sv +taxi/src/axi/rtl/taxi_axi_register.sv +taxi/src/axi/rtl/taxi_axil_axi_adapter_rd.sv +taxi/src/axi/rtl/taxi_axi_fifo_rd.sv +taxi/src/axi/rtl/taxi_axil_crossbar_1s.sv +taxi/src/sync/rtl/taxi_sync_reset.sv +taxi/src/sync/rtl/taxi_sync_signal.sv +taxi/src/lfsr/rtl/taxi_lfsr_crc.sv +taxi/src/lfsr/rtl/taxi_lfsr_prbs_gen.sv +taxi/src/lfsr/rtl/taxi_lfsr_scramble.sv +taxi/src/lfsr/rtl/taxi_lfsr.sv +taxi/src/lfsr/rtl/taxi_lfsr_prbs_check.sv +taxi/src/lfsr/rtl/taxi_lfsr_descramble.sv +taxi/src/axis/tb/taxi_axis_register/test_taxi_axis_register.sv +taxi/src/axis/tb/taxi_axis_pipeline_register/test_taxi_axis_pipeline_register.sv +taxi/src/axis/tb/taxi_axis_fifo/test_taxi_axis_fifo.sv +taxi/src/axis/tb/taxi_axis_async_fifo_adapter/test_taxi_axis_async_fifo_adapter.sv +taxi/src/axis/tb/taxi_axis_cobs_decode/test_taxi_axis_cobs_decode.sv +taxi/src/axis/tb/taxi_axis_adapter/test_taxi_axis_adapter.sv +taxi/src/axis/tb/taxi_axis_mux/test_taxi_axis_mux.sv +taxi/src/axis/tb/taxi_axis_concat/test_taxi_axis_concat.sv +taxi/src/axis/tb/taxi_axis_fifo_adapter/test_taxi_axis_fifo_adapter.sv +taxi/src/axis/tb/taxi_axis_demux/test_taxi_axis_demux.sv +taxi/src/axis/tb/taxi_axis_pipeline_fifo/test_taxi_axis_pipeline_fifo.sv +taxi/src/axis/tb/taxi_axis_switch/test_taxi_axis_switch.sv +taxi/src/axis/tb/taxi_axis_cobs_encode/test_taxi_axis_cobs_encode.sv +taxi/src/axis/tb/taxi_axis_async_fifo/test_taxi_axis_async_fifo.sv +taxi/src/axis/tb/taxi_axis_broadcast/test_taxi_axis_broadcast.sv +taxi/src/axis/tb/taxi_axis_arb_mux/test_taxi_axis_arb_mux.sv +taxi/src/axis/rtl/taxi_axis_switch.sv +taxi/src/axis/rtl/taxi_axis_async_fifo.sv +taxi/src/axis/rtl/taxi_axis_broadcast.sv +taxi/src/axis/rtl/taxi_axis_demux.sv +taxi/src/axis/rtl/taxi_axis_async_fifo_adapter.sv +taxi/src/axis/rtl/taxi_axis_cobs_encode.sv +taxi/src/axis/rtl/taxi_axis_tie.sv +taxi/src/axis/rtl/taxi_axis_pipeline_fifo.sv +taxi/src/axis/rtl/taxi_axis_arb_mux.sv +taxi/src/axis/rtl/taxi_axis_cobs_decode.sv +taxi/src/axis/rtl/taxi_axis_pipeline_register.sv +taxi/src/axis/rtl/taxi_axis_fifo_adapter.sv +taxi/src/axis/rtl/taxi_axis_mux.sv +taxi/src/axis/rtl/taxi_axis_concat.sv +taxi/src/axis/rtl/taxi_axis_fifo.sv +taxi/src/axis/rtl/taxi_axis_null_snk.sv +taxi/src/axis/rtl/taxi_axis_if.sv +taxi/src/axis/rtl/taxi_axis_adapter.sv +taxi/src/axis/rtl/taxi_axis_register.sv +taxi/src/axis/rtl/taxi_axis_null_src.sv +taxi/src/prim/rtl/taxi_arbiter.sv +taxi/src/prim/rtl/taxi_penc.sv +taxi/src/zircon/tb/zircon_ip_tx_deparse/test_zircon_ip_tx_deparse.sv +taxi/src/zircon/tb/zircon_ip_len_cksum/test_zircon_ip_len_cksum.sv +taxi/src/zircon/tb/zircon_ip_rx_parse/test_zircon_ip_rx_parse.sv +taxi/src/zircon/rtl/zircon_ip_tx_deparse.sv +taxi/src/zircon/rtl/zircon_ip_tx_ingress.sv +taxi/src/zircon/rtl/zircon_ip_rx_egress.sv +taxi/src/zircon/rtl/zircon_ip_len_cksum.sv +taxi/src/zircon/rtl/zircon_ip_tx_buffer.sv +taxi/src/zircon/rtl/zircon_ip_rx_ingress.sv +taxi/src/zircon/rtl/zircon_ip_rx_parse.sv +taxi/src/zircon/rtl/zircon_ip_tx_egress.sv +taxi/src/dma/tb/taxi_dma_if_pcie_us/test_taxi_dma_if_pcie_us.sv +taxi/src/dma/tb/taxi_dma_if_axi/test_taxi_dma_if_axi.sv +taxi/src/dma/tb/taxi_dma_psdpram_async/test_taxi_dma_psdpram_async.sv +taxi/src/dma/tb/taxi_dma_if_pcie_us_rd/test_taxi_dma_if_pcie_us_rd.sv +taxi/src/dma/tb/taxi_dma_if_axi_rd/test_taxi_dma_if_axi_rd.sv +taxi/src/dma/tb/taxi_axi_cdma/test_taxi_axi_cdma.sv +taxi/src/dma/tb/taxi_dma_psdpram/test_taxi_dma_psdpram.sv +taxi/src/dma/tb/taxi_dma_client_axis_source/test_taxi_dma_client_axis_source.sv +taxi/src/dma/tb/taxi_axi_dma/test_taxi_axi_dma.sv +taxi/src/dma/tb/taxi_dma_if_pcie_us_wr/test_taxi_dma_if_pcie_us_wr.sv +taxi/src/dma/tb/taxi_dma_if_axi_wr/test_taxi_dma_if_axi_wr.sv +taxi/src/dma/tb/taxi_dma_client_axis_sink/test_taxi_dma_client_axis_sink.sv +taxi/src/dma/rtl/taxi_axi_dma_rd.sv +taxi/src/dma/rtl/taxi_dma_if_pcie_us_wr.sv +taxi/src/dma/rtl/taxi_dma_ram_demux_rd.sv +taxi/src/dma/rtl/taxi_dma_desc_if.sv +taxi/src/dma/rtl/taxi_dma_if_pcie_us_rd.sv +taxi/src/dma/rtl/taxi_dma_desc_mux.sv +taxi/src/dma/rtl/taxi_dma_ram_demux_wr.sv +taxi/src/dma/rtl/taxi_axi_cdma.sv +taxi/src/dma/rtl/taxi_dma_client_axis_source.sv +taxi/src/dma/rtl/taxi_dma_psdpram_async.sv +taxi/src/dma/rtl/taxi_dma_ram_demux.sv +taxi/src/dma/rtl/taxi_axi_dma.sv +taxi/src/dma/rtl/taxi_dma_if_mux.sv +taxi/src/dma/rtl/taxi_dma_psdpram.sv +taxi/src/dma/rtl/taxi_dma_client_axis_sink.sv +taxi/src/dma/rtl/taxi_dma_if_mux_rd.sv +taxi/src/dma/rtl/taxi_dma_if_axi_wr.sv +taxi/src/dma/rtl/taxi_axi_dma_wr.sv +taxi/src/dma/rtl/taxi_dma_if_mux_wr.sv +taxi/src/dma/rtl/taxi_dma_if_pcie_us.sv +taxi/src/dma/rtl/taxi_dma_if_axi.sv +taxi/src/dma/rtl/taxi_dma_ram_if.sv +taxi/src/dma/rtl/taxi_dma_if_axi_rd.sv +taxi/src/pcie/tb/taxi_pcie_axil_master/test_taxi_pcie_axil_master.sv +taxi/src/pcie/tb/taxi_pcie_us_axil_master/test_taxi_pcie_us_axil_master.sv +taxi/src/pcie/tb/taxi_pcie_axil_master_minimal/test_taxi_pcie_axil_master_minimal.sv +taxi/src/pcie/rtl/taxi_pcie_us_axil_master.sv +taxi/src/pcie/rtl/taxi_pcie_axil_master.sv +taxi/src/pcie/rtl/taxi_pcie_tlp_if.sv +taxi/src/pcie/rtl/taxi_pcie_us_msi.sv +taxi/src/pcie/rtl/taxi_pcie_axil_master_minimal.sv +taxi/src/xfcp/tb/taxi_xfcp_if_uart/test_taxi_xfcp_if_uart.sv +taxi/src/xfcp/tb/taxi_xfcp_mod_i2c_master/test_taxi_xfcp_mod_i2c_master.sv +taxi/src/xfcp/tb/taxi_xfcp_switch/test_taxi_xfcp_switch.sv +taxi/src/xfcp/tb/taxi_xfcp_mod_axi/test_taxi_xfcp_mod_axi.sv +taxi/src/xfcp/tb/taxi_xfcp_mod_apb/test_taxi_xfcp_mod_apb.sv +taxi/src/xfcp/tb/taxi_xfcp_mod_axil/test_taxi_xfcp_mod_axil.sv +taxi/src/xfcp/rtl/taxi_xfcp_mod_axi.sv +taxi/src/xfcp/rtl/taxi_xfcp_switch.sv +taxi/src/xfcp/rtl/taxi_xfcp_if_uart.sv +taxi/src/xfcp/rtl/taxi_xfcp_mod_axil.sv +taxi/src/xfcp/rtl/taxi_xfcp_mod_apb.sv +taxi/src/xfcp/rtl/taxi_xfcp_mod_i2c_master.sv +taxi/src/xfcp/rtl/taxi_xfcp_mod_stats.sv +taxi/src/math/tb/taxi_mt19937/test_taxi_mt19937.sv +taxi/src/math/rtl/taxi_mt19937.sv +taxi/src/hip/rtl/us/taxi_gt_qpll_reset.sv +taxi/src/hip/rtl/us/taxi_gt_rx_reset.sv +taxi/src/hip/rtl/us/taxi_gt_tx_reset.sv +taxi/src/hip/rtl/us/taxi_mmcm_frac.sv +taxi/src/cndm/board/AS02MC04/fpga/tb/fpga_core/test_fpga_core.sv +taxi/src/cndm/board/AS02MC04/fpga/rtl/fpga_core.sv +taxi/src/cndm/board/AS02MC04/fpga/rtl/fpga.sv +taxi/src/cndm/tb/cndm_micro_pcie_us/test_cndm_micro_pcie_us.sv +taxi/src/cndm/rtl/cndm_micro_core.sv +taxi/src/cndm/rtl/cndm_micro_tx.sv +taxi/src/cndm/rtl/cndm_micro_pcie_us.sv +taxi/src/cndm/rtl/cndm_micro_desc_rd.sv +taxi/src/cndm/rtl/cndm_micro_cpl_wr.sv +taxi/src/cndm/rtl/cndm_micro_rx.sv +taxi/src/cndm/rtl/cndm_micro_port.sv +taxi/src/stats/tb/taxi_stats_collect/test_taxi_stats_collect.sv +taxi/src/stats/tb/taxi_stats_strings_full/test_taxi_stats_strings_full.sv +taxi/src/stats/tb/taxi_stats_counter/test_taxi_stats_counter.sv +taxi/src/stats/rtl/taxi_stats_counter.sv +taxi/src/stats/rtl/taxi_stats_collect.sv +taxi/src/stats/rtl/taxi_stats_strings_full.sv +taxi/src/io/rtl/taxi_ssio_sdr_out_diff.sv +taxi/src/io/rtl/taxi_iddr.sv +taxi/src/io/rtl/taxi_ssio_sdr_in.sv +taxi/src/io/rtl/taxi_ssio_ddr_in.sv +taxi/src/io/rtl/taxi_ssio_sdr_in_diff.sv +taxi/src/io/rtl/taxi_led_sreg.sv +taxi/src/io/rtl/taxi_ssio_ddr_out_diff.sv +taxi/src/io/rtl/taxi_debounce_switch.sv +taxi/src/io/rtl/taxi_ssio_ddr_out.sv +taxi/src/io/rtl/taxi_ssio_sdr_out.sv +taxi/src/io/rtl/taxi_ssio_ddr_in_diff.sv +taxi/src/io/rtl/taxi_oddr.sv +taxi/src/eth/tb/taxi_axis_xgmii_tx_64/test_taxi_axis_xgmii_tx_64.sv +taxi/src/eth/tb/taxi_axis_baser_tx_32/test_taxi_axis_baser_tx_32.sv +taxi/src/eth/tb/taxi_eth_mac_25g_us/test_taxi_eth_mac_25g_us.sv +taxi/src/eth/tb/taxi_mac_ctrl_tx/test_taxi_mac_ctrl_tx.sv +taxi/src/eth/tb/taxi_eth_mac_1g_gmii_fifo/test_taxi_eth_mac_1g_gmii_fifo.sv +taxi/src/eth/tb/taxi_eth_mac_1g_rgmii_fifo/test_taxi_eth_mac_1g_rgmii_fifo.sv +taxi/src/eth/tb/taxi_axis_baser_rx_32/test_taxi_axis_baser_rx_32.sv +taxi/src/eth/tb/taxi_eth_mac_mii/test_taxi_eth_mac_mii.sv +taxi/src/eth/tb/taxi_mac_ctrl_rx/test_taxi_mac_ctrl_rx.sv +taxi/src/eth/tb/taxi_eth_mac_1g_gmii/test_taxi_eth_mac_1g_gmii.sv +taxi/src/eth/tb/taxi_axis_gmii_rx/test_taxi_axis_gmii_rx.sv +taxi/src/eth/tb/taxi_eth_mac_phy_10g_fifo/test_taxi_eth_mac_phy_10g_fifo.sv +taxi/src/eth/tb/taxi_axis_xgmii_rx_32/test_taxi_axis_xgmii_rx_32.sv +taxi/src/eth/tb/taxi_eth_mac_mii_fifo/test_taxi_eth_mac_mii_fifo.sv +taxi/src/eth/tb/taxi_axis_baser_rx_64/test_taxi_axis_baser_rx_64.sv +taxi/src/eth/tb/taxi_eth_mac_1g_rgmii/test_taxi_eth_mac_1g_rgmii.sv +taxi/src/eth/tb/taxi_eth_mac_phy_10g/test_taxi_eth_mac_phy_10g.sv +taxi/src/eth/tb/taxi_axis_xgmii_rx_64/test_taxi_axis_xgmii_rx_64.sv +taxi/src/eth/tb/taxi_axis_gmii_tx/test_taxi_axis_gmii_tx.sv +taxi/src/eth/tb/taxi_eth_mac_1g_fifo/test_taxi_eth_mac_1g_fifo.sv +taxi/src/eth/tb/taxi_eth_mac_10g_fifo/test_taxi_eth_mac_10g_fifo.sv +taxi/src/eth/tb/taxi_axis_xgmii_tx_32/test_taxi_axis_xgmii_tx_32.sv +taxi/src/eth/tb/taxi_axis_baser_tx_64/test_taxi_axis_baser_tx_64.sv +taxi/src/eth/tb/taxi_eth_mac_10g/test_taxi_eth_mac_10g.sv +taxi/src/eth/tb/taxi_eth_mac_1g/test_taxi_eth_mac_1g.sv +taxi/src/eth/rtl/taxi_axis_baser_rx_64.sv +taxi/src/eth/rtl/taxi_eth_mac_1g_gmii_fifo.sv +taxi/src/eth/rtl/taxi_eth_mac_mii_fifo.sv +taxi/src/eth/rtl/taxi_eth_phy_10g_rx_frame_sync.sv +taxi/src/eth/rtl/taxi_xgmii_baser_dec.sv +taxi/src/eth/rtl/taxi_eth_phy_10g_tx.sv +taxi/src/eth/rtl/taxi_eth_phy_10g_rx_ber_mon.sv +taxi/src/eth/rtl/taxi_eth_phy_10g_rx_watchdog.sv +taxi/src/eth/rtl/taxi_axis_baser_rx_32.sv +taxi/src/eth/rtl/taxi_axis_xgmii_rx_32.sv +taxi/src/eth/rtl/taxi_eth_phy_10g_rx.sv +taxi/src/eth/rtl/us/taxi_eth_mac_25g_us.sv +taxi/src/eth/rtl/us/taxi_eth_phy_10g_us_gt_ll.sv +taxi/src/eth/rtl/us/taxi_eth_phy_25g_us_gt_ll.sv +taxi/src/eth/rtl/us/taxi_eth_phy_10g_7_gt.sv +taxi/src/eth/rtl/us/taxi_eth_phy_25g_us_gt_apb.sv +taxi/src/eth/rtl/us/taxi_eth_phy_10g_us_gt.sv +taxi/src/eth/rtl/us/taxi_eth_mac_25g_us_ch.sv +taxi/src/eth/rtl/us/taxi_eth_phy_25g_us_gt.sv +taxi/src/eth/rtl/taxi_eth_mac_1g_fifo.sv +taxi/src/eth/rtl/taxi_xgmii_baser_enc.sv +taxi/src/eth/rtl/taxi_eth_mac_10g_fifo.sv +taxi/src/eth/rtl/taxi_eth_phy_10g_rx_if.sv +taxi/src/eth/rtl/taxi_eth_mac_stats.sv +taxi/src/eth/rtl/taxi_axis_baser_tx_32.sv +taxi/src/eth/rtl/taxi_eth_mac_phy_10g_rx.sv +taxi/src/eth/rtl/taxi_mac_ctrl_rx.sv +taxi/src/eth/rtl/taxi_eth_mac_phy_10g_tx.sv +taxi/src/eth/rtl/taxi_axis_gmii_rx.sv +taxi/src/eth/rtl/taxi_eth_phy_10g.sv +taxi/src/eth/rtl/taxi_axis_xgmii_rx_64.sv +taxi/src/eth/rtl/taxi_axis_xgmii_tx_64.sv +taxi/src/eth/rtl/taxi_rgmii_phy_if.sv +taxi/src/eth/rtl/taxi_eth_phy_10g_tx_if.sv +taxi/src/eth/rtl/taxi_eth_mac_phy_10g.sv +taxi/src/eth/rtl/taxi_axis_xgmii_tx_32.sv +taxi/src/eth/rtl/taxi_mac_pause_ctrl_tx.sv +taxi/src/eth/rtl/taxi_eth_mac_mii.sv +taxi/src/eth/rtl/taxi_eth_mac_1g_gmii.sv +taxi/src/eth/rtl/taxi_mac_ctrl_tx.sv +taxi/src/eth/rtl/taxi_eth_mac_1g_rgmii.sv +taxi/src/eth/rtl/taxi_mac_pause_ctrl_rx.sv +taxi/src/eth/rtl/taxi_eth_mac_1g_rgmii_fifo.sv +taxi/src/eth/rtl/taxi_eth_mac_10g.sv +taxi/src/eth/rtl/taxi_eth_mac_1g.sv +taxi/src/eth/rtl/taxi_mii_phy_if.sv +taxi/src/eth/rtl/taxi_axis_gmii_tx.sv +taxi/src/eth/rtl/taxi_axis_baser_tx_64.sv +taxi/src/eth/rtl/taxi_gmii_phy_if.sv +taxi/src/eth/rtl/taxi_eth_mac_phy_10g_fifo.sv +taxi/src/lss/tb/taxi_i2c_master/test_taxi_i2c_master.sv +taxi/src/lss/tb/taxi_uart/test_taxi_uart.sv +taxi/src/lss/tb/taxi_i2c_slave_apb_master/test_taxi_i2c_slave_apb_master.sv +taxi/src/lss/tb/taxi_i2c_slave_axil_master/test_taxi_i2c_slave_axil_master.sv +taxi/src/lss/tb/taxi_i2c_single_reg/test_taxi_i2c_single_reg.sv +taxi/src/lss/tb/taxi_i2c_slave/test_taxi_i2c_slave.sv +taxi/src/lss/rtl/taxi_mdio_master.sv +taxi/src/lss/rtl/taxi_i2c_slave_axil_master.sv +taxi/src/lss/rtl/taxi_i2c_single_reg.sv +taxi/src/lss/rtl/taxi_i2c_master.sv +taxi/src/lss/rtl/taxi_i2c_slave.sv +taxi/src/lss/rtl/taxi_i2c_slave_apb_master.sv +taxi/src/lss/rtl/taxi_uart_brg.sv +taxi/src/lss/rtl/taxi_i2c_init.sv +taxi/src/lss/rtl/taxi_uart_rx.sv +taxi/src/lss/rtl/taxi_uart.sv +taxi/src/lss/rtl/taxi_uart_tx.sv +taxi/src/ptp/tb/taxi_ptp_td_rel2tod/test_taxi_ptp_td_rel2tod.sv +taxi/src/ptp/rtl/taxi_ptp_clock_cdc.sv +taxi/src/ptp/rtl/taxi_ptp_clock.sv +taxi/src/ptp/rtl/taxi_ptp_td_leaf.sv +taxi/src/ptp/rtl/taxi_ptp_td_phc.sv +taxi/src/ptp/rtl/taxi_ptp_td_rel2tod.sv +taxi/src/ptp/rtl/taxi_ptp_perout.sv +taxi/src/apb/tb/taxi_apb_adapter/test_taxi_apb_adapter.sv +taxi/src/apb/tb/taxi_apb_dp_ram/test_taxi_apb_dp_ram.sv +taxi/src/apb/tb/taxi_apb_ram/test_taxi_apb_ram.sv +taxi/src/apb/tb/taxi_apb_interconnect/test_taxi_apb_interconnect.sv +taxi/src/apb/rtl/taxi_apb_interconnect.sv +taxi/src/apb/rtl/taxi_apb_ram.sv +taxi/src/apb/rtl/taxi_apb_if.sv +taxi/src/apb/rtl/taxi_apb_adapter.sv +taxi/src/apb/rtl/taxi_apb_dp_ram.sv diff --git a/src/sub/upstream_path/sim/sources.list b/src/sub/upstream_path/sim/sources.list new file mode 100644 index 0000000..d18b614 --- /dev/null +++ b/src/sub/upstream_path/sim/sources.list @@ -0,0 +1,7 @@ +../../../../sim/verilator.vlt + +upstream_ip_check_harness.sv + +../src/sources.list + +../../../common/taxi_sources.list \ No newline at end of file diff --git a/src/sub/upstream_path/sim/upstream_ip_check.py b/src/sub/upstream_path/sim/upstream_ip_check.py new file mode 100644 index 0000000..c3a4e63 --- /dev/null +++ b/src/sub/upstream_path/sim/upstream_ip_check.py @@ -0,0 +1,65 @@ +import cocotb +from scapy.layers.l2 import Ether +from scapy.layers.inet import IP, TCP + +from cocotb.handle import Immediate + +from cocotb.clock import Clock +from cocotb.triggers import Timer, RisingEdge + +from cocotbext.axi import AxiStreamBus, AxiStreamSink, AxiStreamSource + + +import logging + + +CLK_PERIOD = 5 + +class TB: + def __init__(self, dut): + self.dut = dut + + self.log = logging.getLogger("cocotb.tb") + self.log.setLevel(logging.INFO) + + cocotb.start_soon(Clock(self.dut.clk, CLK_PERIOD, unit="ns").start()) + + self.s_axis_data = AxiStreamSource(AxiStreamBus.from_prefix(dut.s_axis_data, ""), dut.clk, dut.rst) + self.m_axis_dma = AxiStreamSink(AxiStreamBus.from_prefix(dut.m_axis_dma, ""), dut.clk, dut.rst) + self.m_axis_data = AxiStreamSink(AxiStreamBus.from_prefix(dut.m_axis_data, ""), dut.clk, dut.rst) + + + async def cycle_reset(self): + await self._cycle_reset(self.dut.rst, self.dut.clk) + + + async def _cycle_reset(self, rst, clk): + rst.value = Immediate(0) + await RisingEdge(clk) + await RisingEdge(clk) + rst.value = 1 + await RisingEdge(clk) + await RisingEdge(clk) + rst.value = 0 + await RisingEdge(clk) + await RisingEdge(clk) + + +@cocotb.test +async def test_sanity(dut): + tb = TB(dut) + + await tb.cycle_reset() + + tb.dut.i_dest_ip.value = 0xc0a85715 + + pkt_0 = Ether() / IP(src="127.0.0.1", dst="192.168.87.21") / TCP() / "Hello, world!" + await tb.s_axis_data.send(pkt_0.build()) + pkt_1 = Ether() / IP(src="127.0.0.1", dst="192.168.87.22") / TCP() / "Different Data now!" + await tb.s_axis_data.send(pkt_1.build()) + + recv_pkt_0 = await tb.m_axis_data.recv() + recv_pkt_1 = await tb.m_axis_dma.recv() + + assert recv_pkt_0.tdata == pkt_0.build() + assert recv_pkt_1.tdata == pkt_1.build() diff --git a/src/sub/upstream_path/sim/upstream_ip_check_harness.sv b/src/sub/upstream_path/sim/upstream_ip_check_harness.sv new file mode 100644 index 0000000..91c16a5 --- /dev/null +++ b/src/sub/upstream_path/sim/upstream_ip_check_harness.sv @@ -0,0 +1,21 @@ +module upstream_ip_check_harness(); + +taxi_axis_if #(.DATA_W(32)) s_axis_data(); +taxi_axis_if #(.DATA_W(32)) m_axis_dma(); +taxi_axis_if #(.DATA_W(32)) m_axis_data(); + +logic clk; +logic rst; + +logic [31:0] i_dest_ip; + +upstream_ip_check #(.DATA_W(32)) u_dut ( + .clk (clk), + .rst (rst), + .s_axis_data (s_axis_data), + .m_axis_dma (m_axis_dma), + .m_axis_data (m_axis_data), + .i_dest_ip (i_dest_ip) +); + +endmodule \ No newline at end of file diff --git a/src/sub/upstream_path/sim/upstream_path.yaml b/src/sub/upstream_path/sim/upstream_path.yaml new file mode 100644 index 0000000..7ed8fc5 --- /dev/null +++ b/src/sub/upstream_path/sim/upstream_path.yaml @@ -0,0 +1,7 @@ +tests: + - name: "upstream_ip_check" + toplevel: "upstream_ip_check_harness" + modules: + - "upstream_ip_check" + sources: "sources.list" + waves: True \ No newline at end of file diff --git a/src/sub/upstream_path/src/sources.list b/src/sub/upstream_path/src/sources.list new file mode 100644 index 0000000..719417e --- /dev/null +++ b/src/sub/upstream_path/src/sources.list @@ -0,0 +1 @@ +upstream_ip_check.sv \ No newline at end of file diff --git a/src/sub/upstream_path/src/upstream_ip_check.sv b/src/sub/upstream_path/src/upstream_ip_check.sv new file mode 100644 index 0000000..b980f5a --- /dev/null +++ b/src/sub/upstream_path/src/upstream_ip_check.sv @@ -0,0 +1,144 @@ +// Destination IP address of packet is checked. If it does not match, +// then the packet is either sent to the CPU or dropped. + +module upstream_ip_check #( + parameter DATA_W = 32 //supported values are 32 and 128 +)( + input clk, + input rst, + + taxi_axis_if.snk s_axis_data, + + taxi_axis_if.src m_axis_dma, + taxi_axis_if.src m_axis_data, + + input logic [31:0] i_dest_ip +); + +if (s_axis_data.DATA_W != DATA_W) + $fatal(0, "Error: s_axis_data.DATA_W does not match DATA_W (instance %m)"); + +if (m_axis_dma.DATA_W != DATA_W) + $fatal(0, "Error: m_axis_dma.DATA_W does not match DATA_W (instance %m)"); + +if (m_axis_data.DATA_W != DATA_W) + $fatal(0, "Error: m_axis_data.DATA_W does not match DATA_W (instance %m)"); + +taxi_axis_if #(.DATA_W(DATA_W)) int_axis_data(); + +// eth header is 14 bytes +// ip dest header is 16 bytes after that, or 30 bytes total +// for 32 bit data, this is at 30/4 -> 7.5 cycles in (split over 2 cycles) +// for 128 bit data, this is at 30/16 -> 1.875 cycles (also split over 2 cycles) + +localparam WAIT_CYCLES = DATA_W == 32 ? 10 : 3; + +// Dest IP scanner + +enum logic {SCAN, DRAIN} state, state_next; +logic [4:0] counter, counter_next; + +logic [31:0] temp_dest_ip, temp_dest_ip_next; + +logic [31:0] dest_ip, dest_ip_next; + +assign int_axis_data.tready = '1; + +always_ff @(posedge clk) begin + if (rst) begin + counter <= '0; + state <= SCAN; + temp_dest_ip <= '0; + dest_ip <= '0; + end else begin + counter <= counter_next; + state <= state_next; + temp_dest_ip <= temp_dest_ip_next; + dest_ip <= dest_ip_next; + end +end + +always_comb begin + counter_next = counter; + state_next = state; + temp_dest_ip_next = temp_dest_ip; + dest_ip_next = dest_ip; + + if (s_axis_data.tvalid && s_axis_data.tready) begin + if (state == SCAN) begin + counter_next = counter + 1; + if (DATA_W == 32) begin + if (counter == 7) begin + temp_dest_ip_next[31:16] = {s_axis_data.tdata[23:16], s_axis_data.tdata[31:24]}; + end else if (counter == 8) begin + dest_ip_next = {temp_dest_ip[31:16], s_axis_data.tdata[7:0], s_axis_data.tdata[15:8]}; + state_next = DRAIN; + counter_next = '0; + end + end else if (DATA_W == 128) begin + + end + + end else if (state == DRAIN) begin + if (s_axis_data.tlast) begin + state_next = SCAN; + end + end + end +end + + +// Shift register + +assign s_axis_data.tready = int_axis_data.tready; + +logic [1+1+s_axis_data.KEEP_W+s_axis_data.DATA_W-1:0] data_sr [WAIT_CYCLES]; + +always_ff @(posedge clk) begin + if (s_axis_data.tready) begin + for (int idx = 0; idx < WAIT_CYCLES-1; idx++) begin + data_sr[idx+1] <= data_sr[idx]; + end + data_sr[0] <= {s_axis_data.tvalid, s_axis_data.tlast, s_axis_data.tkeep, s_axis_data.tdata}; + end +end + +assign {int_axis_data.tvalid, int_axis_data.tlast, int_axis_data.tkeep, int_axis_data.tdata} = data_sr[WAIT_CYCLES-1]; + + +// Demux + +logic dest_ip_matches; + +taxi_axis_if #(.DATA_W(DATA_W)) int_axis_demux[2](); + +taxi_axis_tie u_data_tie ( + .s_axis(int_axis_demux[1]), + .m_axis(m_axis_data) +); + +taxi_axis_tie u_dma_tie ( + .s_axis(int_axis_demux[0]), + .m_axis(m_axis_dma) +); + +always_ff @(posedge clk) begin + dest_ip_matches <= dest_ip == i_dest_ip; +end + +taxi_axis_demux #( + .M_COUNT(2) +) u_demux ( + .clk (clk), + .rst (rst), + + .s_axis (int_axis_data), + + .m_axis (int_axis_demux), + + .enable ('1), + .drop ('0), // we could drop here if a bit is set. + .select (dest_ip_matches) +); + +endmodule \ No newline at end of file diff --git a/src/sub/upstream_path/upstream_path.sv b/src/sub/upstream_path/src/upstream_path.sv similarity index 100% rename from src/sub/upstream_path/upstream_path.sv rename to src/sub/upstream_path/src/upstream_path.sv