From 229786e3afbddd98a819698238e096c9e4f5bde3 Mon Sep 17 00:00:00 2001 From: "joachim.schmidt" <joachim.schmidt@hesge.ch> Date: Mon, 25 Oct 2021 09:12:24 +0200 Subject: [PATCH] Update Scalp Register Editor --- config/scalp_fast_router_registers.json | 163 ++++++ config/scalp_router_regbank.json | 125 +++++ config/scalp_router_regbank_wd.json | 38 ++ config/scalp_safe_firmware_reg_bank.json | 29 + config/template_regbank.json | 65 +++ .../src/hdl/scalp_fast_router_registers.vhd | 408 ++++++++++++++ src/__pycache__/regedit.cpython-37.pyc | Bin 0 -> 9858 bytes src/__pycache__/regedit.cpython-39.pyc | Bin 0 -> 10389 bytes src/__pycache__/utils.cpython-37.pyc | Bin 0 -> 1488 bytes src/__pycache__/utils.cpython-39.pyc | Bin 0 -> 1512 bytes src/regedit.py | 499 ++++++++++++++++++ src/regedit.pyc | Bin 0 -> 5323 bytes src/regedit_creator.py | 121 +++++ src/templates/hdl/template_regbank.vhd | 310 +++++++++++ src/utils.py | 47 ++ src/utils.pyc | Bin 0 -> 1808 bytes 16 files changed, 1805 insertions(+) create mode 100644 config/scalp_fast_router_registers.json create mode 100644 config/scalp_router_regbank.json create mode 100644 config/scalp_router_regbank_wd.json create mode 100644 config/scalp_safe_firmware_reg_bank.json create mode 100644 config/template_regbank.json create mode 100644 output/scalp_fast_router_registers/1.4/src/hdl/scalp_fast_router_registers.vhd create mode 100644 src/__pycache__/regedit.cpython-37.pyc create mode 100644 src/__pycache__/regedit.cpython-39.pyc create mode 100644 src/__pycache__/utils.cpython-37.pyc create mode 100644 src/__pycache__/utils.cpython-39.pyc create mode 100644 src/regedit.py create mode 100644 src/regedit.pyc create mode 100755 src/regedit_creator.py create mode 100644 src/templates/hdl/template_regbank.vhd create mode 100644 src/utils.py create mode 100644 src/utils.pyc diff --git a/config/scalp_fast_router_registers.json b/config/scalp_fast_router_registers.json new file mode 100644 index 0000000..a9f357b --- /dev/null +++ b/config/scalp_fast_router_registers.json @@ -0,0 +1,163 @@ +{ + "config" : { + "entity_name" : "scalp_fast_router_registers", + "entity_version" : "1.4", + "entity_reg_io_access" : true, + "block_name" : "ScalpFastRouterRegisters", + "bd_name" : "/scalp_axi4lite_0/SAXILitexDIO", + "bd_interface" : "SAXILitexDIO", + "bd_slave_segment" : "SAXILiteAddr", + "bd_master_base_address" : "0x43C00000", + "bd_range" : "4K" + }, + "register_bank" : [ + { + "register_status_active" : true, + "register_name" : "LocalNetAddr", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "rw", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "RGBLed0", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "rw", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "RGBLed1", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "rw", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "DMAFifoTXWrDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "DMAFifoTXRrDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "DMAFifoTXStatus", + "register_size" : "32", + "register_type" : "stat", + "register_access_mode" : "ro", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "TX_PROG_EMPTY" : 1, + "TX_PROG_FULL" : 1, + "RESERVED" : 30 + } + }, + { + "register_status_active" : true, + "register_name" : "DMAFifoRXWrDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "DMAFifoRXRrDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "DMAFifoRXStatus", + "register_size" : "32", + "register_type" : "stat", + "register_access_mode" : "ro", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "RX_PROG_EMPTY" : 1, + "RX_PROG_FULL" : 1, + "RESERVED" : 30 + } + }, + { + "register_status_active" : true, + "register_name" : "QoSPhyStatus", + "register_size" : "32", + "register_type" : "stat", + "register_access_mode" : "ro", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "NORTH" : 1, + "EAST" : 1, + "SOUTH" : 1, + "WEST" : 1, + "TOP" : 1, + "BOTTOM" : 1, + "LOCAL" : 1, + "RESERVED" : 25 + } + }, + { + "register_status_active" : true, + "register_name" : "QoSDMAInitOcpCtrl", + "register_size" : "32", + "register_type" : "ocp", + "register_access_mode" : "wo", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "NORTH" : 1, + "EAST" : 1, + "SOUTH" : 1, + "WEST" : 1, + "TOP" : 1, + "BOTTOM" : 1, + "LOCAL" : 1, + "RESERVED" : 25 + } + }, + { + "register_status_active" : true, + "register_name" : "QoSDMAInitStatus", + "register_size" : "32", + "register_type" : "stat", + "register_access_mode" : "ro", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "NORTH" : 1, + "EAST" : 1, + "SOUTH" : 1, + "WEST" : 1, + "TOP" : 1, + "BOTTOM" : 1, + "LOCAL" : 1, + "RESERVED" : 25 + } + } + ] +} diff --git a/config/scalp_router_regbank.json b/config/scalp_router_regbank.json new file mode 100644 index 0000000..1455881 --- /dev/null +++ b/config/scalp_router_regbank.json @@ -0,0 +1,125 @@ +{ + "config" : { + "entity_name" : "scalp_router_regbank", + "entity_version" : "0.1", + "entity_reg_io_access" : true, + "block_name" : "ScalpRouterRegBank", + "bd_name" : "/scalp_axi4lite_0/SAXILitexDIO", + "bd_interface" : "SAXILitexDIO", + "bd_slave_segment" : "SAXILiteAddr", + "bd_master_base_address" : "0x43C00000", + "bd_range" : "4K" + }, + "register_bank" : [ + { + "register_status_active" : true, + "register_name" : "ScalpPacketWriteData", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "rw", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "ScalpPacketReadData", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "ScalpPacketCtrl", + "register_size" : "32", + "register_type" : "ctrl", + "register_access_mode" : "wo", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "WRITE_VALID" : 1, + "WRITE_LAST" : 1, + "WRITE_READY" : 1, + "WRITE_NEXT" : 1, + "RESET_ALL_FIFO" : 1, + "WRITE_H0" : 1, + "WRITE_H1" : 1, + "WRITE_H2" : 1, + "WRITE_PLD" : 1, + "WRITE_NEW_PACKET" : 1, + "READ_NEXT" : 1, + "READ_NEW_PACKET" : 1, + "RESERVED" : 20 + } + }, + { + "register_status_active" : true, + "register_name" : "ScalpPacketStatus", + "register_size" : "32", + "register_type" : "stat", + "register_access_mode" : "ro", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "READ_VALID" : 1, + "READ_LAST" : 1, + "TX_PROG_FULL" : 1, + "RX_PROG_FULL" : 1, + "READ_WAIT_NEXT" : 1, + "RESERVED" : 27 + } + }, + { + "register_status_active" : true, + "register_name" : "TXWrDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "TXRdDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "RXWrDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "RXRdDataCnt", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "ro", + "register_multifield" : false, + "register_initial_value" : 0 + }, + { + "register_status_active" : true, + "register_name" : "LocNetAddr", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "rw", + "register_multifield" : false, + "register_initial_value" : 0, + "register_fields" : { + "SCALP_ADDR_X" : 8, + "SCALP_ADDR_Y" : 8, + "SCALP_ADDR_Z" : 8, + "RESERVED" : 8 + } + } + ] +} diff --git a/config/scalp_router_regbank_wd.json b/config/scalp_router_regbank_wd.json new file mode 100644 index 0000000..6822ed6 --- /dev/null +++ b/config/scalp_router_regbank_wd.json @@ -0,0 +1,38 @@ +{ + "reg1" : + [ + { + "bits" : 16, + "name" : "ScalpPacketWriteData", + "type" : 1, + "attr" : [ + "reg_type : data", + "reg_access_mode : rw", + "reg_address: 0x43C00000" + ] + }, + { + "bits" : 16, + "name" : "ScalpPacketWriteData", + "type" : 1 + } + ], + "reg2" : + [ + { + "bits" : 16, + "name" : "ScalpPacketReadData", + "type" : 1, + "attr" : [ + "reg_type : data", + "reg_access_mode : ro", + "reg_address: 0x43C00004" + ] + }, + { + "bits" : 16, + "name" : "ScalpPacketReadData", + "type" : 1 + } + ] +} diff --git a/config/scalp_safe_firmware_reg_bank.json b/config/scalp_safe_firmware_reg_bank.json new file mode 100644 index 0000000..a089a2d --- /dev/null +++ b/config/scalp_safe_firmware_reg_bank.json @@ -0,0 +1,29 @@ +{ + "config" : { + "entity_name" : "scalp_safe_firmware_reg_bank", + "entity_version" : "0.2", + "entity_reg_io_access" : true, + "block_name" : "ScalpSafeFirmwareRegBank", + "bd_name" : "/scalp_axi4lite_0/SAXILitexDIO", + "bd_interface" : "SAXILitexDIO", + "bd_slave_segment" : "SAXILiteAddr", + "bd_master_base_address" : "0x43C10000", + "bd_range" : "4K" + }, + "register_bank" : [ + { + "register_status_active" : true, + "register_name" : "RgbLedsCtrl", + "register_size" : "32", + "register_type" : "ctrl", + "register_access_mode" : "rw", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "RgbLed1" : 3, + "RgbLed2" : 3, + "Unused" : 26 + } + } + ] +} diff --git a/config/template_regbank.json b/config/template_regbank.json new file mode 100644 index 0000000..9e89085 --- /dev/null +++ b/config/template_regbank.json @@ -0,0 +1,65 @@ +{ + "config" : { + "entity_name" : "scalp_safe_firmware_reg_bank", + "entity_version" : "0.1", + "entity_reg_io_access" : true, + "block_name" : "ScalpSafeFirmwareRegBank", + "bd_name" : "/scalp_axi4lite_0/SAXILitexDIO", + "bd_interface" : "SAXILitexDIO", + "bd_slave_segment" : "SAXILiteAddr", + "bd_master_base_address" : "0x43C00000", + "bd_range" : "256" + }, + "register_bank" : [ + { + "register_status_active" : true, + "register_name" : "RgbLedsCtrl", + "register_size" : "32", + "register_type" : "ctrl", + "register_access_mode" : "rw", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "RgbLed1" : 3, + "RgbLed2" : 3, + "Unused" : 26 + } + }, + { + "register_status_active" : true, + "register_name" : "Ctrl1", + "register_size" : "32", + "register_type" : "ctrl", + "register_access_mode" : "wo", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "f0" : 1, + "f1" : 1, + "f2" : 30 + } + }, + { + "register_status_active" : true, + "register_name" : "Status", + "register_size" : "32", + "register_type" : "stat", + "register_access_mode" : "ro", + "register_multifield" : true, + "register_initial_value" : 0, + "register_fields" : { + "f0" : 1, + "f1" : 31 + } + }, + { + "register_status_active" : true, + "register_name" : "Data1", + "register_size" : "32", + "register_type" : "data", + "register_access_mode" : "rw", + "register_multifield" : false, + "register_initial_value" : 255 + } + ] +} diff --git a/output/scalp_fast_router_registers/1.4/src/hdl/scalp_fast_router_registers.vhd b/output/scalp_fast_router_registers/1.4/src/hdl/scalp_fast_router_registers.vhd new file mode 100644 index 0000000..77109ca --- /dev/null +++ b/output/scalp_fast_router_registers/1.4/src/hdl/scalp_fast_router_registers.vhd @@ -0,0 +1,408 @@ +-- THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +-- scalp_regedit v0.1 - 05.2021 +-- Author : Joachim Schmidt <joachim.schmidt@hesge.ch> + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.std_logic_unsigned.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_misc.all; + +library unisim; +use unisim.vcomponents.all; + +entity scalp_fast_router_registers is + + generic ( + C_AXI4_ARADDR_SIZE : integer range 0 to 32 := 32; + C_AXI4_RDATA_SIZE : integer range 0 to 32 := 32; + C_AXI4_RRESP_SIZE : integer range 0 to 2 := 2; + C_AXI4_AWADDR_SIZE : integer range 0 to 32 := 32; + C_AXI4_WDATA_SIZE : integer range 0 to 32 := 32; + C_AXI4_WSTRB_SIZE : integer range 0 to 4 := 4; + C_AXI4_BRESP_SIZE : integer range 0 to 2 := 2; + C_AXI4_ADDR_SIZE : integer range 0 to 32 := 12; + C_AXI4_DATA_SIZE : integer range 0 to 32 := 32); + + port ( + -- Clock and reset + SAxiClkxCI : in std_ulogic; + SAxiRstxRANI : in std_ulogic; + -- AXI4 Lite + -- Read Channel + -- Read Address Channel + SAxiARAddrxDI : in std_ulogic_vector((C_AXI4_ARADDR_SIZE - 1) downto 0); + SAxiARValidxSI : in std_ulogic; + SAxiARReadyxSO : out std_ulogic; + -- Read Data Channel + SAxiRDataxDO : out std_ulogic_vector((C_AXI4_RDATA_SIZE - 1) downto 0); + SAxiRRespxDO : out std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0); + SAxiRValidxSO : out std_ulogic; + SAxiRReadyxSI : in std_ulogic; + -- Write Channel + -- Write Address Channel + SAxiAWAddrxDI : in std_ulogic_vector((C_AXI4_AWADDR_SIZE - 1) downto 0); + SAxiAWValidxSI : in std_ulogic; + SAxiAWReadyxSO : out std_ulogic; + -- Write Data Channel + SAxiWDataxDI : in std_ulogic_vector((C_AXI4_WDATA_SIZE - 1) downto 0); + SAxiWStrbxDI : in std_ulogic_vector((C_AXI4_WSTRB_SIZE - 1) downto 0); + SAxiWValidxSI : in std_ulogic; + SAxiWReadyxSO : out std_ulogic; + -- Write Response Channel + SAxiBRespxDO : out std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0); + SAxiBValidxSO : out std_ulogic; + SAxiBReadyxSI : in std_ulogic; + -- Registers list IO + LocalNetAddrxDO : out std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + RGBLed0xDO : out std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + RGBLed1xDO : out std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + DMAFifoTXWrDataCntxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + DMAFifoTXRrDataCntxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + DMAFifoTXStatusxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + DMAFifoRXWrDataCntxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + DMAFifoRXRrDataCntxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + DMAFifoRXStatusxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + QoSPhyStatusxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + QoSDMAInitOcpCtrlxDO : out std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0); + QoSDMAInitStatusxDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0)); + +end scalp_fast_router_registers; + +architecture behavioral of scalp_fast_router_registers is + + -- Constants + constant C_AXI4_RRESP_OKAY : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "00"; + constant C_AXI4_RRESP_EXOKAY : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "01"; + constant C_AXI4_RRESP_SLVERR : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "10"; + constant C_AXI4_RRESP_DECERR : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "11"; + constant C_AXI4_BRESP_OKAY : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "00"; + constant C_AXI4_BRESP_EXOKAY : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "01"; + constant C_AXI4_BRESP_SLVERR : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "10"; + constant C_AXI4_BRESP_DECERR : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "11"; + + -- Signals + -- Clock and reset + signal SAxiClkxC : std_ulogic := '0'; + signal SAxiRstxRAN : std_ulogic := '0'; + -- AXI4 Lite + signal SAxiARReadyxS : std_ulogic := '0'; + signal SAxiRValidxS : std_ulogic := '0'; + signal SAxiBValidxS : std_ulogic := '0'; + signal SAxiWReadyxS : std_ulogic := '0'; + signal SAxiAWReadyxS : std_ulogic := '0'; + signal WrAddrxDN : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + signal WrAddrxDP : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + -- Signals of access to the register bank + signal RdAddrxD : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + signal RdDataxD : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := (others => '0'); + signal RdValidxS : std_ulogic := '0'; + signal WrAddrxD : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + signal WrDataxD : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := (others => '0'); + signal WrValidxS : std_ulogic := '0'; + -- Registers list + signal LocalNetAddrPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal LocalNetAddrPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal RGBLed0PortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal RGBLed0PortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal RGBLed1PortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal RGBLed1PortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoTXWrDataCntPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoTXWrDataCntPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoTXRrDataCntPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoTXRrDataCntPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoTXStatusPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoTXStatusPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoRXWrDataCntPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoRXWrDataCntPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoRXRrDataCntPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoRXRrDataCntPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoRXStatusPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal DMAFifoRXStatusPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal QoSPhyStatusPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal QoSPhyStatusPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal QoSDMAInitOcpCtrlPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal QoSDMAInitOcpCtrlPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal QoSDMAInitStatusPortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + signal QoSDMAInitStatusPortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x"00000000"; + + -- Attributes + attribute mark_debug : string; + attribute keep : string; + -- + -- attribute mark_debug of : signal is "true"; + -- attribute keep of : signal is "true"; + +begin + + assert C_AXI4_RDATA_SIZE = C_AXI4_DATA_SIZE + report "RDATA and DATA vectors must be the same" severity failure; + + assert C_AXI4_ARADDR_SIZE >= C_AXI4_ADDR_SIZE + report "ARADDR and ADDR vectors must be the same" severity failure; + + assert C_AXI4_WDATA_SIZE = C_AXI4_DATA_SIZE + report "WDATA and DATA vectors must be the same" severity failure; + + assert C_AXI4_AWADDR_SIZE >= C_AXI4_ADDR_SIZE + report "AWADDR and ADDR vectors must be the same" severity failure; + + EntityIOxB : block is + begin -- block EntityIOxB + + -- Clock and reset + SAxiClkxAS : SAxiClkxC <= SAxiClkxCI; + SAxiRstxAS : SAxiRstxRAN <= SAxiRstxRANI; + -- Read Channel + SAxiARReadyxAS : SAxiARReadyxSO <= SAxiARReadyxS; + SAxiRValidxAS : SAxiRValidxSO <= SAxiRValidxS; + SAxiRDataxAS : SAxiRDataxDO <= RdDataxD; + RdValidxAS : RdValidxS <= SAxiARValidxSI; + RdAddrxAS : RdAddrxD((C_AXI4_ADDR_SIZE - 1) downto 0) <= SAxiARAddrxDI((C_AXI4_ADDR_SIZE - 1) downto 0); + SAxiRRespxAS : SAxiRRespxDO <= C_AXI4_RRESP_OKAY; + -- Write Channel + SAxiBRespxAS : SAxiBRespxDO <= C_AXI4_BRESP_OKAY; + SAxiBValidxAS : SAxiBValidxSO <= SAxiBValidxS; + SAxiWReadyxAS : SAxiWReadyxSO <= SAxiWReadyxS; + SAxiAWReadyxAS : SAxiAWReadyxSO <= SAxiAWReadyxS; + WrValidxAS : WrValidxS <= SAxiWValidxSI; + WrDataxAS : WrDataxD <= SAxiWDataxDI; + WrAddrOutxAS : WrAddrxD <= WrAddrxDP; + WrAddrxAS : WrAddrxDN((C_AXI4_ADDR_SIZE - 1) downto 0) <= SAxiAWAddrxDI((C_AXI4_ADDR_SIZE - 1) downto 0) when + SAxiAWValidxSI = '1' else + WrAddrxDP((C_AXI4_ADDR_SIZE - 1) downto 0); + + end block EntityIOxB; + + AXI4LitexB : block is + begin -- block AXI4LitexB + + ReadChannelxB : block is + begin -- block ReadChannelxB + + ReadAddrChanxP : process (SAxiClkxC, SAxiRstxRAN) is + + variable StateAfterResetxS : boolean := true; + + begin -- process ReadAddrChanxP + if SAxiRstxRAN = '0' then + SAxiARReadyxS <= '0'; + StateAfterResetxS := true; + elsif rising_edge(SAxiClkxC) then + if StateAfterResetxS = true then + SAxiARReadyxS <= '1'; + StateAfterResetxS := false; + else + SAxiARReadyxS <= SAxiARReadyxS; + end if; + + if SAxiARValidxSI = '1' then + SAxiARReadyxS <= '0'; + end if; + + if SAxiARReadyxS <= '0' and SAxiRReadyxSI = '1' then + SAxiARReadyxS <= '1'; + end if; + end if; + end process ReadAddrChanxP; + + ReadDataChanxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process ReadDataChanxP + if SAxiRstxRAN = '0' then + SAxiRValidxS <= '0'; + elsif rising_edge(SAxiClkxC) then + SAxiRValidxS <= SAxiRValidxS; + + if SAxiARValidxSI = '1' and SAxiARReadyxS = '1' then + SAxiRValidxS <= '1'; + end if; + + if SAxiRValidxS = '1' and SAxiRReadyxSI = '1' then + SAxiRValidxS <= '0'; + end if; + end if; + end process ReadDataChanxP; + + end block ReadChannelxB; + + WriteChannelxB : block is + begin --block WriteChannelxB + + WrAddrRegxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process WrAddrRegxP + if SAxiRstxRAN = '0' then + WrAddrxDP <= (others => '0'); + elsif rising_edge(SAxiClkxC) then + WrAddrxDP <= WrAddrxDN; + end if; + end process WrAddrRegxP; + + WriteAddrChanxP : process (SAxiClkxC, SAxiRstxRAN) is + + variable StateAfterResetxS : boolean := true; + + begin -- process WriteAddrChanxP + if SAxiRstxRAN = '0' then + SAxiAWReadyxS <= '0'; + StateAfterResetxS := true; + elsif rising_edge(SAxiClkxC) then + if StateAfterResetxS = true then + SAxiAWReadyxS <= '1'; + StateAfterResetxS := false; + else + SAxiAWReadyxS <= SAxiAWReadyxS; + end if; + + if SAxiAWValidxSI = '1' then + SAxiAWReadyxS <= '0'; + end if; + + if SAxiWValidxSI = '1' then + SAxiAWReadyxS <= '1'; + end if; + end if; + end process WriteAddrChanxP; + + WriteDataChanxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process WriteDataChanxP + if SAxiRstxRAN = '0' then + SAxiWReadyxS <= '0'; + elsif rising_edge(SAxiClkxC) then + SAxiWReadyxS <= SAxiWReadyxS; + + if SAxiAWValidxSI = '1' and SAxiAWReadyxS = '1' then + SAxiWReadyxS <= '1'; + end if; + + if SAxiWValidxSI = '1' and SAxiWReadyxS = '1' then + SAxiWReadyxS <= '0'; + end if; + end if; + end process WriteDataChanxP; + + WriteRespChanxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process WriteRespChanxP + if SAxiRstxRAN = '0' then + SAxiBValidxS <= '0'; + elsif rising_edge(SAxiClkxC) then + SAxiBValidxS <= SAxiBValidxS; + + if SAxiWValidxSI = '1' and SAxiWReadyxS = '1' then + SAxiBValidxS <= '1'; + end if; + + if SAxiBValidxS = '1' and SAxiBReadyxSI = '1' then + SAxiBValidxS <= '0'; + end if; + end if; + end process WriteRespChanxP; + + end block WriteChannelxB; + + end block AXI4LitexB; + + ScalpFastRouterRegistersxB : block is + begin -- block ScalpFastRouterRegistersxB + + WriteRegPortxP : process (DMAFifoRXRrDataCntxDI, DMAFifoRXStatusxDI, + DMAFifoRXWrDataCntxDI, DMAFifoTXRrDataCntxDI, + DMAFifoTXStatusxDI, DMAFifoTXWrDataCntxDI, + LocalNetAddrPortxDP, + QoSDMAInitOcpCtrlPortxDP, + QoSDMAInitStatusxDI, QoSPhyStatusxDI, + RGBLed0PortxDP, RGBLed1PortxDP, WrAddrxD, + WrDataxD, WrValidxS) is + begin -- process WriteRegPortxP + LocalNetAddrPortxDN <= LocalNetAddrPortxDP; + LocalNetAddrxDO <= LocalNetAddrPortxDP; + RGBLed0PortxDN <= RGBLed0PortxDP; + RGBLed0xDO <= RGBLed0PortxDP; + RGBLed1PortxDN <= RGBLed1PortxDP; + RGBLed1xDO <= RGBLed1PortxDP; + DMAFifoTXWrDataCntPortxDN <= DMAFifoTXWrDataCntxDI; + DMAFifoTXRrDataCntPortxDN <= DMAFifoTXRrDataCntxDI; + DMAFifoTXStatusPortxDN <= DMAFifoTXStatusxDI; + DMAFifoRXWrDataCntPortxDN <= DMAFifoRXWrDataCntxDI; + DMAFifoRXRrDataCntPortxDN <= DMAFifoRXRrDataCntxDI; + DMAFifoRXStatusPortxDN <= DMAFifoRXStatusxDI; + QoSPhyStatusPortxDN <= QoSPhyStatusxDI; + QoSDMAInitOcpCtrlPortxDN <= (others => '0'); + QoSDMAInitOcpCtrlxDO <= QoSDMAInitOcpCtrlPortxDP; + QoSDMAInitStatusPortxDN <= QoSDMAInitStatusxDI; + + if WrValidxS = '1' then + case WrAddrxD is + when x"000" => LocalNetAddrPortxDN <= WrDataxD; + when x"004" => RGBLed0PortxDN <= WrDataxD; + when x"008" => RGBLed1PortxDN <= WrDataxD; + when x"028" => QoSDMAInitOcpCtrlPortxDN <= WrDataxD; + + when others => null; + end case; + end if; + end process WriteRegPortxP; + + ReadRegPortxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process ReadRegPortxP + if SAxiRstxRAN = '0' then + RdDataxD <= (others => '0'); + elsif rising_edge(SAxiClkxC) then + RdDataxD <= RdDataxD; + + if RdValidxS = '1' then + case RdAddrxD is + when x"000" => RdDataxD <= LocalNetAddrPortxDP; + when x"004" => RdDataxD <= RGBLed0PortxDP; + when x"008" => RdDataxD <= RGBLed1PortxDP; + when x"00C" => RdDataxD <= DMAFifoTXWrDataCntPortxDP; + when x"010" => RdDataxD <= DMAFifoTXRrDataCntPortxDP; + when x"014" => RdDataxD <= DMAFifoTXStatusPortxDP; + when x"018" => RdDataxD <= DMAFifoRXWrDataCntPortxDP; + when x"01C" => RdDataxD <= DMAFifoRXRrDataCntPortxDP; + when x"020" => RdDataxD <= DMAFifoRXStatusPortxDP; + when x"024" => RdDataxD <= QoSPhyStatusPortxDP; + when x"02C" => RdDataxD <= QoSDMAInitStatusPortxDP; + + when others => RdDataxD <= (others => '0'); + end case; + end if; + end if; + end process ReadRegPortxP; + + UpdateRegBankxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process UpdateRegBankxP + if SAxiRstxRAN = '0' then + LocalNetAddrPortxDP <= x"00000000"; + RGBLed0PortxDP <= x"00000000"; + RGBLed1PortxDP <= x"00000000"; + DMAFifoTXWrDataCntPortxDP <= x"00000000"; + DMAFifoTXRrDataCntPortxDP <= x"00000000"; + DMAFifoTXStatusPortxDP <= x"00000000"; + DMAFifoRXWrDataCntPortxDP <= x"00000000"; + DMAFifoRXRrDataCntPortxDP <= x"00000000"; + DMAFifoRXStatusPortxDP <= x"00000000"; + QoSPhyStatusPortxDP <= x"00000000"; + QoSDMAInitOcpCtrlPortxDP <= x"00000000"; + QoSDMAInitStatusPortxDP <= x"00000000"; + + elsif rising_edge(SAxiClkxC) then + LocalNetAddrPortxDP <= LocalNetAddrPortxDN; + RGBLed0PortxDP <= RGBLed0PortxDN; + RGBLed1PortxDP <= RGBLed1PortxDN; + DMAFifoTXWrDataCntPortxDP <= DMAFifoTXWrDataCntPortxDN; + DMAFifoTXRrDataCntPortxDP <= DMAFifoTXRrDataCntPortxDN; + DMAFifoTXStatusPortxDP <= DMAFifoTXStatusPortxDN; + DMAFifoRXWrDataCntPortxDP <= DMAFifoRXWrDataCntPortxDN; + DMAFifoRXRrDataCntPortxDP <= DMAFifoRXRrDataCntPortxDN; + DMAFifoRXStatusPortxDP <= DMAFifoRXStatusPortxDN; + QoSPhyStatusPortxDP <= QoSPhyStatusPortxDN; + QoSDMAInitOcpCtrlPortxDP <= QoSDMAInitOcpCtrlPortxDN; + QoSDMAInitStatusPortxDP <= QoSDMAInitStatusPortxDN; + + end if; + end process UpdateRegBankxP; + + end block ScalpFastRouterRegistersxB; + +end behavioral; diff --git a/src/__pycache__/regedit.cpython-37.pyc b/src/__pycache__/regedit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffac352e8a0f7e3acd66d8249097a395639f65a2 GIT binary patch literal 9858 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 PGcj_ou`ogOKuKl*!ux|$ literal 0 HcmV?d00001 diff --git a/src/__pycache__/regedit.cpython-39.pyc b/src/__pycache__/regedit.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba26ce636beb11fd1851799ba1e213ce91d94cb7 GIT binary patch literal 10389 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 bNj)Re3pP0xCYJv!tWbS_*f_wfziey(d}{?( literal 0 HcmV?d00001 diff --git a/src/__pycache__/utils.cpython-37.pyc b/src/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f799f3b1c198f5722eca2c153a77dba09bcb219 GIT binary patch literal 1488 zcmZ?b<>g{vU|^_e;!4=T!octt#DQTZ1_lNP1_p-W7zPH06owSW9EK<e%^1Z9<}*bx zfobL_W-!eX#hSvD!ra0T#g@X7!rH<R#h${J!rsCV#gW31!r8(Q#hJpD!rj6U#g)R7 z!rQ_S#ht<!%%I8l5@e@eG9!p$U|;~ztPBhc&LG=e7#J8z7*ZHhm`WIH7@8SVn8g`H z7{nQx85u$1EHw<`3@NN|K8mUoMu>O{LokCTo8K))u3wD0FWDFv7^;|cbrq_Z6?Anq znQpNb6lLa>++xm2&C_Iz;w;H5$w`ebE-6~cP{hu_!0^jcKO;XkRX;0V-z7h}G&eP` zq*y<oC_gK;q*&i0wIDN5zc@KDry#xnB$iwP<rSr-r>10<=oc3y>z9^f<`nA{RNmrE z$t*6&Nvw<qTfzzQAjmlkj1r6jj71=RGBgmt6f-Oo1i+z?#jt>JA;SWu6vl<1aAWeT z;#G}Q%~ef_SM^Z!RSni;zQvJ}Sdv<jnVTBLoR?o7#Zg>Rlm_C0eS$=AFfcIO;z>^} zi3iDoe9H%N3@FkW7>l?W7#Na4mV;aYaup~Xz|m0vN(_uOjN%L_OyUf+%q0v97;Bgp zGS;%xFo2?_mbHYbh9QNenW>hogsFx#g|(Tfmc2r$hHU}!LIxLxSg~4;8ukS&H7pBQ zYnW;{7BVelWMn9`31=u_Tfkn!0OFN!Ea0qRtzlTm#K-`Rx?hYMzZf-tF)H6;EV{*5 zuE}+asVMapdvbnmL1s?sEtdR()Vy1qMX8A?IhlE>#kW|?i!w`6Z!s5_Cf#DnFTTZA zl$x7gmU@e=I0F<HQ7j;yCTA39T4qjad_iJK#x3@O#FCQKqP!^XqSS(%#AI+1h~g>& zOM@hCF&0E|mZatu#Dg?NF{fqbMX{vimzLaO0a=P3xFR4`@i4QXh6{oMSqK!WOgxNS zOdO0{j9iR-Okzx2j774bKnJCLkTi$}MF2R^L76m#aRCD;c!C);nf$8Qs;vwxB5E}m zZ?UE27v(0FXfobnElbQPO+|MGM@DLeu~BhJkpjqSX#9fM$zV1E0|N^K0|UqguvMTO zU&2trxPS>vGM6weU@2j!VQgkx$heTPnK6Y?ngK-DGNmw;u+}g&gHi%BC?(V|FJOZ@ zkj3vM$j~b0YAb^(rifZi_FK%L9LAJa5XF+5nwb;DT2fS+mmI~Clb>#Mi@CU@s7Q{1 zfkBg{NFJ0fIg(Q1ixTtFQ*W^pXI7;~v7~`ifYKnuci_a!3G<kdGRSA(Y{aC-D8N*t z4hl$^??5y>ASFPB9b*l{0)~YQ*=$7upyDTmDHxK<nEgWBG#PKPWT#dZYckzpNy$tu zxy78FS_!cfY(2#0<c!qh?D*`|N-YKkhGK}#Jd7+%McN=w@DzbUvj`N`MdAz$3`LR* z3=C1Md8N4pl|>-8g7Y~zkAdSH95Y}?gY_fXhOm;uCO1E&G$+*#<dtF(1_lNWMkr+B OVC7)u;OAiGU<UxV`%3cw literal 0 HcmV?d00001 diff --git a/src/__pycache__/utils.cpython-39.pyc b/src/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..930bb0c26d9058b76a5a095ef87174e1d5b9e354 GIT binary patch literal 1512 zcmYe~<>g{vU|^_e;!4=T!octt#6iYP3=9ko3=9m#F$@e0DGVu$ISf${nlXwI%x8*X z0@KV<%wU=&iZz8Pg}H?xiY<jDg|&qtiamubg}sF#iX(+1g|meriZg{Pg}a3ziYtXD zg|~$viaUidm_d{8CCFaCWJVAL#UM5-0|SFI$OSG83=Aa<DU2yhC5$x;&5S9`;tV1T z;tb7<j39BA8U}HO6jnGNMO6wTL_CEdm_d`x?-nE1FGk&$YzzzxRm{4&3RTPsy1JT7 zw^$2`GV@AqG3TV_X);D}mSmRXq{bJQ6s=?^VrO7r_~ogek)NBYpOvrglAm0fo0?Zr ztRGO6pOsottnZOpkeR4ooSc|b5MKZiOD=)(ic-^4Q!-2Ri;I%=OG`3yiuDRAZ}FyN z78m3sR>p%Z;RJaQ<QxV@2}S|NA`m|r8VGQT85R-(;E>2-SircDVF6PL<3dpQG5J;T zsz$2js;0!NdZ_xU25U0k;z&s>NiE6DO^ssC%P+shQCw1#2I7K!gG6vJFfiQWNlz__ z2g!nb%m;E1DDoK?i+C6q7?MGj!(0M#9Vk4&(UJp77>qTH;tVNF;taLSB@7D~YnT@@ z*0R(vfTF0DwS=jLA%&%xsg|vTsfIO$wVA1wy@qW8^Fjs}hFGy$jvDp_EHx|(SZkPS zI2JN3WMpJ0v?^g+z+S@uVwZ3%;H+V-VOYq-$N-JLUyK^R7&U(}D&Jx(y2V(o$#sjV zDD@V5a(-?>W=`rYmi&U$yjz?_sfj5$nR%(jw^+-IGD}i#F&CF6-D1iwzQtCQnwwvi zdW)?%0~8-oEFhjHXB1~zW=?8+L1Ib9E%t)Ml9JS-yeRIX)PkJEWN<Qw;wl15gCuS- z7DREDq~;dHgEU1kr)B0vv83gfmfT_iS&AOGA|O@qFtebB3xWb!2o$PJJd9jS9E@Cy zT#P(SB1~M2MRK4(2c>_IGzf#(phy4*Iw;eoFfL#K1yL}ACX-(kTeX#eMMSM8<1Mzd z{G!~%5>3WitYwKgrK#vn;mAm>Fg7YKDN+Dg4~=6*kab`-$Swv31{MYe29Paa>p&$y z2}23v0wyrYT*A13rG%k|v6*op<3h$}#uP?r1`u7#l)_ZPTEo-~N)61Q)KJ5`fDP(M z7QdGuL#vpptqiJ|B5F0+Z!v>%8&h6E6iaeyW=<4qNl|HDauiEWe!9^u=Hil~B6$V| z22B>QOK))`rNkE{=B20JVkyq7N{wPk1E~O|Lx>N-iI@}SIU{9|@4#7#NsUo}sYnCe zhalg=15^T32r||%EMQp3P{vRskir<ukirxUNpZ}6A#R$Cw^*`MD~mOmZn30fCYRh| z&Q7g_SPXUo#P;Nj)a2~=?9@sv1_p*=i0wR#EKEf@Adm1AfkLzh6yrr83yY)}7#N~h z^Gb6IDvMMY7#P6$9-QC6@m~ar6|lp>`jKoySjl0No1apelWGU@O0ft70|N&m6f$wJ Naxio7b1-wT0|2OlN~{0? literal 0 HcmV?d00001 diff --git a/src/regedit.py b/src/regedit.py new file mode 100644 index 0000000..17ffdf0 --- /dev/null +++ b/src/regedit.py @@ -0,0 +1,499 @@ +#!/usr/bin/python3 + +import os +import sys +import utils +import shutil +import time +import numpy as np +from utils import * + +# Default directories +PRJ_CONF_DIR = os.path.join("..", "config") +PRJ_OUT_DIR = os.path.join("..", "output") +SRC_DIR = "src" +HDL_DIR = "hdl" +LINUX_DIR = "linux" +BAREMETAL_DIR = "baremetal" +TEMPLATE_HDL_DIR = os.path.join(".", "templates", "hdl") +HDL_FILE_EXT = ".vhd" +TEMPLATE_HDL_FILE = "template_regbank" + HDL_FILE_EXT + +BD_RANGE = { + "128" : 0, + "256" : 1, + "512" : 2, + "1K" : 3, + "2K" : 4, + "4K" : 5, + "8K" : 6, + "16K" : 7, + "32K" : 8, + "64K" : 9, + "128K" : 10, + "256K" : 11, + "512K" : 12, + "1M" : 13, + "2M" : 14, + "4M" : 15, + "8M" : 16, + "16M" : 17, + "32M" : 18, + "64M" : 19, + "128M" : 20, + "256M" : 21, + "512M" : 22, + "1G" : 24 +} + +BD_RANGE_CONV = { + "128" : 128, + "256" : 256, + "512" : 512, + "1K" : 1024, + "2K" : 2048, + "4K" : 4096, + "8K" : 8192, + "16K" : 16384, + "32K" : 32768, + "64K" : 65536, + "128K" : 131072, + "256K" : 262144, + "512K" : 524288, + "1M" : 1048576, + "2M" : 2097152, + "4M" : 4194304, + "8M" : 8388608, + "16M" : 16777216, + "32M" : 33554432, + "64M" : 67108864, + "128M" : 134217728, + "256M" : 268435456, + "512M" : 536870912, + "1G" : 1073741824 +} + +#EGISTER_STATUS_ACTIVE = { +#} + +DEFAULT_REGISTER_SIZE = "32" +REGISTER_SIZE = { + DEFAULT_REGISTER_SIZE : 0 +} + +REGISTER_TYPE = { + "ctrl" : 0, + "stat" : 1, + "data" : 2, + "ocp" : 3 +} + +REGISTER_ACCESS_MODE = { + "ro" : 0, + "wo" : 1, + "rw" : 2 +} + +class regedit_gen : + def __init__(self, entity_name = None, entity_version = "0.1", entity_reg_io_access = False, block_name = None, bd_name = None, + bd_interface = None, bd_slave_segment = None, bd_master_base_address = "0x40000000", + bd_range = "128", register_bank = None) : + + self.entity_name = entity_name + self.entity_version = entity_version + self.entity_reg_io_access = entity_reg_io_access + self.block_name = block_name + self.bd_name = bd_name + self.bd_interface = bd_interface + self.bd_slave_segment = bd_slave_segment + self.bd_master_base_address = bd_master_base_address + self.bd_range = bd_range + self.register_bank = register_bank + self.data_size = "32" + # Directories + self.prj_out_dir = PRJ_OUT_DIR + self.src_dir = None + self.hdl_dir = None + self.linux_dir = None + self.baremetal_dir = None + # Others + self.registers_list = "" + self.registers_list_c2n = "" + self.registers_list_n2c = "" + self.registers_list_init_cv = "" + self.registers_list_cv = "" + self.registers_list_cv_cnt = 0 + self.registers_list_ad_cnt = 0 + self.registers_list_wa = "" + self.registers_list_ra = "" + self.registers_list_entity_io = "" + + if entity_name is None : + try : + self.entity_name = utils.get_time_str() + + if not self.entity_name : + raise ValueError("Empty string") + except ValueError as e : + print(e) + + self.dir_name = self.prj_out_dir + "/" + self.entity_name + "/" + self.entity_version + + try : + if type(self.entity_reg_io_access) is not bool : + self.entity_reg_io_access = False + raise ValueError("Is not a boolean value") + except ValueError as e : + print(e) + + if block_name is None : + try : + self.block_name = utils.get_time_str() + + if not self.block_name : + raise ValueError("Empty string") + except ValueError as e : + print(e) + + if bd_name is None : + try : + self.bd_name = utils.get_time_str() + + if not self.bd_name : + raise ValueError("Empty string") + except ValueError as e : + print(e) + + if bd_interface is None : + try : + self.bd_interface = utils.get_time_str() + + if not self.bd_interface : + raise ValueError("Empty string") + except ValueError as e : + print(e) + + if bd_slave_segment is None : + try : + self.bd_slave_segment = utils.get_time_str() + + if not self.bd_slave_segment : + raise ValueError("Empty string") + except ValueError as e : + print(e) + + if check_key(BD_RANGE, bd_range) is False : + print("#Error - __init__() : " + bd_range + " is not a valid value...") + sys.exit(-1) + + if register_bank is None : + print("#Error - __init__() : the register bank is not defined in the config file...") + sys.exit(-1) + + print("> Register bank directory : " + self.dir_name) + print("> Register bank name : " + self.entity_name) + print("> Register bank version : " + self.entity_version) + print("> Block name : " + self.block_name) + print("> Size of the register bank : " + str(len(self.register_bank))) + print("> Addtional information about block design") + print("> Bd name : " + self.bd_name) + print("> Bd interface : " + self.bd_interface) + print("> Bd slave segment : " + self.bd_slave_segment) + print("> Bd master base address : " + self.bd_master_base_address) + print("> Bd range : " + self.bd_range) + + def create_dir(self) : + if not os.path.exists(self.dir_name) : + os.makedirs(self.dir_name) + print("\ncreate_dir() : " + self.dir_name + " directory created...") + + self.src_dir = os.path.join(self.dir_name, SRC_DIR) + os.makedirs(self.src_dir) + print("create_dir() : " + self.src_dir + " directory created...") + + self.hdl_dir = os.path.join(self.src_dir, HDL_DIR) + os.makedirs(self.hdl_dir) + print("create_dir() : " + self.hdl_dir + " directory created...") + + self.linux_dir = os.path.join(self.src_dir, LINUX_DIR) + os.makedirs(self.linux_dir) + print("create_dir() : " + self.linux_dir + " directory created...") + + self.baremetal_dir = os.path.join(self.src_dir, BAREMETAL_DIR) + os.makedirs(self.baremetal_dir) + print("create_dir() : " + self.baremetal_dir + " directory created...") + + return 0 + else : + print("#Error - create_dir() : " + self.dir_name + " Directory already exists...") + return -1 + + return 0 + + def copy_hdl_template_file(self, file_name) : + in_file_name = os.path.join(TEMPLATE_HDL_DIR, TEMPLATE_HDL_FILE) + out_file_name = os.path.join(self.hdl_dir, file_name + HDL_FILE_EXT) + + addr_size = int(np.trunc(np.log2(int(BD_RANGE_CONV[self.bd_range])))) + + if addr_size < 8 : + addr_size = str(8) + elif addr_size > 8 and addr_size < 12 : + addr_size = str(12) + elif addr_size > 12 and addr_size < 16 : + addr_size = str(16) + elif addr_size > 16 and addr_size < 20 : + addr_size = str(20) + elif addr_size > 20 and addr_size < 24 : + addr_size = str(24) + elif addr_size > 24 and addr_size < 28 : + addr_size = str(28) + elif addr_size > 28 and addr_size < 32 : + addr_size = str(32) + else : + addr_size = str(addr_size) + + print("copy_hdl_template_file() : Copy " + in_file_name + " to " + out_file_name) + shutil.copy(in_file_name, out_file_name) + + utils.file_replace_pattern(out_file_name, "<entity_name>", self.entity_name) + utils.file_replace_pattern(out_file_name, "<data_size>", self.data_size) + utils.file_replace_pattern(out_file_name, "<addr_size>", addr_size) + utils.file_replace_pattern(out_file_name, "<block_name>", self.block_name) + + first_call = True + + for i in range(len(self.register_bank)) : + ret = self.read_register(self.register_bank[i], i, first_call) + first_call = False + + if ret < 0 : + sys.exit(-1) + + utils.file_replace_pattern(out_file_name, "<registers_list>", self.registers_list) + utils.file_replace_pattern(out_file_name, "<registers_list_current_to_next>", self.registers_list_c2n) + utils.file_replace_pattern(out_file_name, "<registers_list_next_to_current>", self.registers_list_n2c) + utils.file_replace_pattern(out_file_name, "<registers_list_init_current_value>", self.registers_list_init_cv) + utils.file_replace_pattern(out_file_name, "<registers_list_current_value>", self.registers_list_cv) + utils.file_replace_pattern(out_file_name, "<registers_list_write_access>", self.registers_list_wa) + utils.file_replace_pattern(out_file_name, "<registers_list_read_access>", self.registers_list_ra) + utils.file_replace_pattern(out_file_name, "<registers_list_entity_io>", self.registers_list_entity_io) + + return 0 + + def read_register(self, register, idx, first_call) : + print("Register " + str(idx)) + #addr = idx * 4 + #print("Address : 0x" + hex32str2(addr, self.bd_range)) + + try : + self.register_status_active = register["register_status_active"] + except KeyError as e : + print("KeyError : {}".format(e)) + self.register_status_active = None + return -1 + + print("\tregister_status_active = " + str(self.register_status_active)) + + try : + self.register_name = register["register_name"] + except KeyError as e : + print("KeyError : {}".format(e)) + self.register_name = utils.get_time_str() + + print("\tregister_name = " + self.register_name) + + try : + self.register_size = register["register_size"] + except KeyError as e : + print("KeyError : {}".format(e)) + self.register_size = DEFAULT_REGISTER_SIZE; + + if check_key(REGISTER_SIZE, self.register_size) is False : + print("#Error - read_register() : " + self.register_size + " is not a valid value...") + return -1 + + print("\tregister_size = " + self.register_size) + + try : + self.register_type = register["register_type"] + except KeyError as e : + print("KeyError : {}".format(e)) + self.register_type = None + return -1 + + if check_key(REGISTER_TYPE, self.register_type) is False : + print("#Error - read_register() : " + self.register_type + " is not a valid value...") + return -1 + + print("\tregister_type = " + self.register_type) + + try : + self.register_access_mode = register["register_access_mode"] + except KeyError as e : + print("KeyError : {}".format(e)) + self.register_access_mode = None + return -1 + + if check_key(REGISTER_ACCESS_MODE, self.register_access_mode) is False : + print("#Error - read_register() : " + self.register_access_mode + " is not a valid value...") + return -1 + + print("\tregister_access_mode = " + self.register_access_mode) + + if self.register_type == "ocp" and self.register_access_mode != "wo" : + print("#Error - read_register() : Registers of type ocp are accessible only in wo mode.") + return -1 + + try : + self.register_multifield = register["register_multifield"] + except KeyError as e : + print("KeyError : {}".format(e)) + self.register_multifield = None + return -1 + + print("\tregister_multifield = " + str(self.register_multifield)) + + try : + self.register_initial_value = register["register_initial_value"] + except KeyError as a : + print("KeyError : {}".format(e)) + self.register_initial_value = None + return -1 + + print("\tregister_initial_value = " + hex32str(self.register_initial_value)) + + if self.register_multifield is True : + try : + self.register_fields = register["register_fields"] + except KeyError as e : + print("KeyError : {}".format(e)) + self.register_fields = None + return -1 + + print("\tregister_fields = ") + for key in self.register_fields : + print("\t\tname = " + key + " : size = " + str(self.register_fields[key])) + + if self.register_status_active == True : + registers_list_entity_io = "" + + if first_call == True : + print("\n\nFIRST CALL\n\n") + registers_list_entity_io = ";\n\t\t-- Registers list IO" + + if self.register_access_mode == "rw" or self.register_access_mode == "wo" : + if first_call == True : + registers_list_entity_io = registers_list_entity_io + "\n\t\t" + self.register_name + "xDO : out std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0)" + else : + registers_list_entity_io = registers_list_entity_io + ";\n\t\t" + self.register_name + "xDO : out std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0)" + elif self.register_access_mode == "ro" : + if first_call == True : + registers_list_entity_io = registers_list_entity_io + "\n\t\t" + self.register_name + "xDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0)" + else : + registers_list_entity_io = registers_list_entity_io + ";\n\t\t" + self.register_name + "xDI : in std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0)" + + self.registers_list_entity_io = self.registers_list_entity_io + registers_list_entity_io + + if self.registers_list is not "" : + self.registers_list = self.registers_list + "\t" + + self.registers_list = self.registers_list + \ + "signal " + self.register_name + "PortxDN : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x\"" + \ + hex32str(self.register_initial_value) + "\";\n" + \ + "\tsignal " + self.register_name + "PortxDP : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := x\"" + \ + hex32str(self.register_initial_value) + "\";\n" + + if self.registers_list_c2n is not "" : + self.registers_list_c2n = self.registers_list_c2n + "\t\t\t" + + if self.register_status_active == True and self.register_access_mode == "ro" : + self.registers_list_c2n = self.registers_list_c2n + \ + self.register_name + "PortxDN <= " + self.register_name + "xDI;\n" + else : + if self.register_type == "ocp" : + self.registers_list_c2n = self.registers_list_c2n + \ + self.register_name + "PortxDN <= (others => '0');\n" + else : + self.registers_list_c2n = self.registers_list_c2n + \ + self.register_name + "PortxDN <= " + self.register_name + "PortxDP;\n" + self.registers_list_c2n = self.registers_list_c2n + \ + self.register_name + "xDO <= " + self.register_name + "PortxDP;\n" + + if self.registers_list_n2c is not "" : + self.registers_list_n2c = self.registers_list_n2c + "\t\t\t\t" + + self.registers_list_n2c = self.registers_list_n2c + \ + self.register_name + "PortxDP <= " + self.register_name + "PortxDN;\n" + + if self.registers_list_init_cv is not "" : + self.registers_list_init_cv = self.registers_list_init_cv + "\t\t\t\t" + + self.registers_list_init_cv = self.registers_list_init_cv + \ + self.register_name + "PortxDP <= x\"" + \ + hex32str(self.register_initial_value) + "\";\n" + + if self.registers_list_cv_cnt > 0 and np.mod(self.registers_list_cv_cnt, 3) == 0 : + self.registers_list_cv = self.registers_list_cv + "\n\t\t\t\t\t\t\t\t" + + if self.register_status_active == True and self.register_access_mode == "ro" : + self.registers_list_cv = self.registers_list_cv + \ + self.register_name + "xDI" + else : + self.registers_list_cv = self.registers_list_cv + \ + self.register_name + "PortxDP" + + if self.registers_list_cv_cnt < len(self.register_bank) - 1 : + self.registers_list_cv = self.registers_list_cv + "," + + self.registers_list_cv_cnt = self.registers_list_cv_cnt + 1 + + + addr = self.registers_list_ad_cnt * 4 + print(self.bd_range) + print(BD_RANGE_CONV[self.bd_range]) + print("Register address : 0x" + hex32str2(addr, str(BD_RANGE_CONV[self.bd_range]))) + + if self.register_type == "ctrl" : + addr1 = (self.registers_list_ad_cnt + 1) * 4 + addr2 = (self.registers_list_ad_cnt + 2) * 4 + + if self.register_access_mode == "rw" or self.register_access_mode == "wo" : + if self.registers_list_wa is not "" : + self.registers_list_wa = self.registers_list_wa + "\t\t\t\t\t" + + self.registers_list_wa = self.registers_list_wa + \ + "when x\"" + hex32str2(addr, str(BD_RANGE_CONV[self.bd_range])) + "\" => " + self.register_name + "PortxDN <= WrDataxD;\n" + self.registers_list_wa = self.registers_list_wa + \ + "\t\t\t\t\twhen x\"" + hex32str2(addr1, str(BD_RANGE_CONV[self.bd_range])) + "\" => " + \ + self.register_name + "PortxDN <= " + self.register_name + "PortxDP or WrDataxD;\n" + self.registers_list_wa = self.registers_list_wa + \ + "\t\t\t\t\twhen x\"" + hex32str2(addr2, str(BD_RANGE_CONV[self.bd_range])) + "\" => " + \ + self.register_name + "PortxDN <= " + self.register_name + "PortxDP and not WrDataxD;\n" + + if self.register_access_mode == "rw" or self.register_access_mode == "ro" : + if self.registers_list_ra is not "" : + self.registers_list_ra = self.registers_list_ra + "\t\t\t\t\t\t" + + self.registers_list_ra = self.registers_list_ra + \ + "when x\"" + hex32str2(addr, str(BD_RANGE_CONV[self.bd_range])) + "\" => RdDataxD <= " + self.register_name + "PortxDP;\n" + + self.registers_list_ad_cnt = self.registers_list_ad_cnt + 3 + else : + if self.register_access_mode == "rw" or self.register_access_mode == "wo" : + if self.registers_list_wa is not "" : + self.registers_list_wa = self.registers_list_wa + "\t\t\t\t\t" + + self.registers_list_wa = self.registers_list_wa + \ + "when x\"" + hex32str2(addr, str(BD_RANGE_CONV[self.bd_range])) + "\" => " + self.register_name + "PortxDN <= WrDataxD;\n" + + if self.register_access_mode == "rw" or self.register_access_mode == "ro" : + if self.registers_list_ra is not "" : + self.registers_list_ra = self.registers_list_ra + "\t\t\t\t\t\t" + + self.registers_list_ra = self.registers_list_ra + \ + "when x\"" + hex32str2(addr, str(BD_RANGE_CONV[self.bd_range])) + "\" => RdDataxD <= " + self.register_name + "PortxDP;\n" + + self.registers_list_ad_cnt = self.registers_list_ad_cnt + 1 + + return 0 diff --git a/src/regedit.pyc b/src/regedit.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f576278b49c5bf51046c02fa66443660c3f1ba2c GIT binary patch literal 5323 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 literal 0 HcmV?d00001 diff --git a/src/regedit_creator.py b/src/regedit_creator.py new file mode 100755 index 0000000..40e4871 --- /dev/null +++ b/src/regedit_creator.py @@ -0,0 +1,121 @@ +#!/usr/bin/python3 + +import os +import sys +import getopt +import json +from utils import display_title +from regedit import * + +VERSION = "0.1" +# Default directories + +def help() : + print("Usage : ") + print("$ python3 regedit_creator <opt>") + print("Option : ") + print("\t-h || --help\tDisplay help") + print("\t-c || --config_file <json_file>\tUse a JSON file for the register bank configuration") + +if __name__ == "__main__" : + json_data = None + + display_title(" Register Bank Creator v{} ".format(VERSION)) + + try : + opts, args = getopt.getopt(sys.argv[1:], "hc:", ["help", "config_file="]) + except getopt.GetoptError : + help() + sys.exit(-1) + if not opts : + help() + sys.exit(-1) + + for opt, arg in opts : + if opt in ("-h", "--help") : + help() + sys.exit() + elif opt in ("-c", "--config_file") : + print("> Load register bank information from " + arg) + + with open(arg) as f : + json_data = json.load(f) + + # Get config + #if "config" in json_data : + try : + config = json_data["config"] + except KeyError as e : + print("KeyError : {}".format(e)) + sys.exit(-1) + + try : + entity_name = config["entity_name"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + entity_version = config["entity_version"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + entity_reg_io_access = config["entity_reg_io_access"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + block_name = config["block_name"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + bd_name = config["bd_name"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + bd_interface = config["bd_interface"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + bd_slave_segment = config["bd_slave_segment"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + bd_master_base_address = config["bd_master_base_address"] + except KeyError as e : + print("KeyError : {}".format(e)) + + try : + bd_range = config["bd_range"] + except KeyError as e : + print("KeyError : {}".format(e)) + + # Get register bank + try : + register_bank = json_data["register_bank"] + except KeyError as e : + print("KeyError : {}".format(e)) + print("#Error - __main__() : the register bank is not defined in the config file...") + sys.exit(-1) + + if len(register_bank) == 0 : + print("Error : Empty register bank"); + sys.exit(-1) + + try : + regedit_prj = regedit_gen(entity_name, entity_version, entity_reg_io_access, block_name, + bd_name, bd_interface, bd_slave_segment, bd_master_base_address, + bd_range, register_bank) + except ValueError as e : + print(e) + else : + ret = regedit_prj.create_dir() + + if ret == 0 : + print("\n> " + entity_name + " register bank directory tree successfully created") + + ret = regedit_prj.copy_hdl_template_file(entity_name) diff --git a/src/templates/hdl/template_regbank.vhd b/src/templates/hdl/template_regbank.vhd new file mode 100644 index 0000000..fa97b19 --- /dev/null +++ b/src/templates/hdl/template_regbank.vhd @@ -0,0 +1,310 @@ +-- THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +-- scalp_regedit v0.1 - 05.2021 +-- Author : Joachim Schmidt <joachim.schmidt@hesge.ch> + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.std_logic_unsigned.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_misc.all; + +library unisim; +use unisim.vcomponents.all; + +entity <entity_name> is + + generic ( + C_AXI4_ARADDR_SIZE : integer range 0 to 32 := 32; + C_AXI4_RDATA_SIZE : integer range 0 to 32 := <data_size>; + C_AXI4_RRESP_SIZE : integer range 0 to 2 := 2; + C_AXI4_AWADDR_SIZE : integer range 0 to 32 := 32; + C_AXI4_WDATA_SIZE : integer range 0 to 32 := <data_size>; + C_AXI4_WSTRB_SIZE : integer range 0 to 4 := 4; + C_AXI4_BRESP_SIZE : integer range 0 to 2 := 2; + C_AXI4_ADDR_SIZE : integer range 0 to 32 := <addr_size>; + C_AXI4_DATA_SIZE : integer range 0 to 32 := <data_size>); + + port ( + -- Clock and reset + SAxiClkxCI : in std_ulogic; + SAxiRstxRANI : in std_ulogic; + -- AXI4 Lite + -- Read Channel + -- Read Address Channel + SAxiARAddrxDI : in std_ulogic_vector((C_AXI4_ARADDR_SIZE - 1) downto 0); + SAxiARValidxSI : in std_ulogic; + SAxiARReadyxSO : out std_ulogic; + -- Read Data Channel + SAxiRDataxDO : out std_ulogic_vector((C_AXI4_RDATA_SIZE - 1) downto 0); + SAxiRRespxDO : out std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0); + SAxiRValidxSO : out std_ulogic; + SAxiRReadyxSI : in std_ulogic; + -- Write Channel + -- Write Address Channel + SAxiAWAddrxDI : in std_ulogic_vector((C_AXI4_AWADDR_SIZE - 1) downto 0); + SAxiAWValidxSI : in std_ulogic; + SAxiAWReadyxSO : out std_ulogic; + -- Write Data Channel + SAxiWDataxDI : in std_ulogic_vector((C_AXI4_WDATA_SIZE - 1) downto 0); + SAxiWStrbxDI : in std_ulogic_vector((C_AXI4_WSTRB_SIZE - 1) downto 0); + SAxiWValidxSI : in std_ulogic; + SAxiWReadyxSO : out std_ulogic; + -- Write Response Channel + SAxiBRespxDO : out std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0); + SAxiBValidxSO : out std_ulogic; + SAxiBReadyxSI : in std_ulogic<registers_list_entity_io>); + +end <entity_name>; + +architecture behavioral of <entity_name> is + + -- Constants + constant C_AXI4_RRESP_OKAY : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "00"; + constant C_AXI4_RRESP_EXOKAY : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "01"; + constant C_AXI4_RRESP_SLVERR : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "10"; + constant C_AXI4_RRESP_DECERR : std_ulogic_vector((C_AXI4_RRESP_SIZE - 1) downto 0) := "11"; + constant C_AXI4_BRESP_OKAY : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "00"; + constant C_AXI4_BRESP_EXOKAY : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "01"; + constant C_AXI4_BRESP_SLVERR : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "10"; + constant C_AXI4_BRESP_DECERR : std_ulogic_vector((C_AXI4_BRESP_SIZE - 1) downto 0) := "11"; + + -- Signals + -- Clock and reset + signal SAxiClkxC : std_ulogic := '0'; + signal SAxiRstxRAN : std_ulogic := '0'; + -- AXI4 Lite + signal SAxiARReadyxS : std_ulogic := '0'; + signal SAxiRValidxS : std_ulogic := '0'; + signal SAxiBValidxS : std_ulogic := '0'; + signal SAxiWReadyxS : std_ulogic := '0'; + signal SAxiAWReadyxS : std_ulogic := '0'; + signal WrAddrxDN : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + signal WrAddrxDP : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + -- Signals of access to the register bank + signal RdAddrxD : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + signal RdDataxD : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := (others => '0'); + signal RdValidxS : std_ulogic := '0'; + signal WrAddrxD : std_ulogic_vector((C_AXI4_ADDR_SIZE - 1) downto 0) := (others => '0'); + signal WrDataxD : std_ulogic_vector((C_AXI4_DATA_SIZE - 1) downto 0) := (others => '0'); + signal WrValidxS : std_ulogic := '0'; + -- Registers list + <registers_list> + -- Attributes + attribute mark_debug : string; + attribute keep : string; + -- + -- attribute mark_debug of : signal is "true"; + -- attribute keep of : signal is "true"; + +begin + + assert C_AXI4_RDATA_SIZE = C_AXI4_DATA_SIZE + report "RDATA and DATA vectors must be the same" severity failure; + + assert C_AXI4_ARADDR_SIZE >= C_AXI4_ADDR_SIZE + report "ARADDR and ADDR vectors must be the same" severity failure; + + assert C_AXI4_WDATA_SIZE = C_AXI4_DATA_SIZE + report "WDATA and DATA vectors must be the same" severity failure; + + assert C_AXI4_AWADDR_SIZE >= C_AXI4_ADDR_SIZE + report "AWADDR and ADDR vectors must be the same" severity failure; + + EntityIOxB : block is + begin -- block EntityIOxB + + -- Clock and reset + SAxiClkxAS : SAxiClkxC <= SAxiClkxCI; + SAxiRstxAS : SAxiRstxRAN <= SAxiRstxRANI; + -- Read Channel + SAxiARReadyxAS : SAxiARReadyxSO <= SAxiARReadyxS; + SAxiRValidxAS : SAxiRValidxSO <= SAxiRValidxS; + SAxiRDataxAS : SAxiRDataxDO <= RdDataxD; + RdValidxAS : RdValidxS <= SAxiARValidxSI; + RdAddrxAS : RdAddrxD((C_AXI4_ADDR_SIZE - 1) downto 0) <= SAxiARAddrxDI((C_AXI4_ADDR_SIZE - 1) downto 0); + SAxiRRespxAS : SAxiRRespxDO <= C_AXI4_RRESP_OKAY; + -- Write Channel + SAxiBRespxAS : SAxiBRespxDO <= C_AXI4_BRESP_OKAY; + SAxiBValidxAS : SAxiBValidxSO <= SAxiBValidxS; + SAxiWReadyxAS : SAxiWReadyxSO <= SAxiWReadyxS; + SAxiAWReadyxAS : SAxiAWReadyxSO <= SAxiAWReadyxS; + WrValidxAS : WrValidxS <= SAxiWValidxSI; + WrDataxAS : WrDataxD <= SAxiWDataxDI; + WrAddrOutxAS : WrAddrxD <= WrAddrxDP; + WrAddrxAS : WrAddrxDN((C_AXI4_ADDR_SIZE - 1) downto 0) <= SAxiAWAddrxDI((C_AXI4_ADDR_SIZE - 1) downto 0) when + SAxiAWValidxSI = '1' else + WrAddrxDP((C_AXI4_ADDR_SIZE - 1) downto 0); + + end block EntityIOxB; + + AXI4LitexB : block is + begin -- block AXI4LitexB + + ReadChannelxB : block is + begin -- block ReadChannelxB + + ReadAddrChanxP : process (SAxiClkxC, SAxiRstxRAN) is + + variable StateAfterResetxS : boolean := true; + + begin -- process ReadAddrChanxP + if SAxiRstxRAN = '0' then + SAxiARReadyxS <= '0'; + StateAfterResetxS := true; + elsif rising_edge(SAxiClkxC) then + if StateAfterResetxS = true then + SAxiARReadyxS <= '1'; + StateAfterResetxS := false; + else + SAxiARReadyxS <= SAxiARReadyxS; + end if; + + if SAxiARValidxSI = '1' then + SAxiARReadyxS <= '0'; + end if; + + if SAxiARReadyxS <= '0' and SAxiRReadyxSI = '1' then + SAxiARReadyxS <= '1'; + end if; + end if; + end process ReadAddrChanxP; + + ReadDataChanxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process ReadDataChanxP + if SAxiRstxRAN = '0' then + SAxiRValidxS <= '0'; + elsif rising_edge(SAxiClkxC) then + SAxiRValidxS <= SAxiRValidxS; + + if SAxiARValidxSI = '1' and SAxiARReadyxS = '1' then + SAxiRValidxS <= '1'; + end if; + + if SAxiRValidxS = '1' and SAxiRReadyxSI = '1' then + SAxiRValidxS <= '0'; + end if; + end if; + end process ReadDataChanxP; + + end block ReadChannelxB; + + WriteChannelxB : block is + begin --block WriteChannelxB + + WrAddrRegxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process WrAddrRegxP + if SAxiRstxRAN = '0' then + WrAddrxDP <= (others => '0'); + elsif rising_edge(SAxiClkxC) then + WrAddrxDP <= WrAddrxDN; + end if; + end process WrAddrRegxP; + + WriteAddrChanxP : process (SAxiClkxC, SAxiRstxRAN) is + + variable StateAfterResetxS : boolean := true; + + begin -- process WriteAddrChanxP + if SAxiRstxRAN = '0' then + SAxiAWReadyxS <= '0'; + StateAfterResetxS := true; + elsif rising_edge(SAxiClkxC) then + if StateAfterResetxS = true then + SAxiAWReadyxS <= '1'; + StateAfterResetxS := false; + else + SAxiAWReadyxS <= SAxiAWReadyxS; + end if; + + if SAxiAWValidxSI = '1' then + SAxiAWReadyxS <= '0'; + end if; + + if SAxiWValidxSI = '1' then + SAxiAWReadyxS <= '1'; + end if; + end if; + end process WriteAddrChanxP; + + WriteDataChanxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process WriteDataChanxP + if SAxiRstxRAN = '0' then + SAxiWReadyxS <= '0'; + elsif rising_edge(SAxiClkxC) then + SAxiWReadyxS <= SAxiWReadyxS; + + if SAxiAWValidxSI = '1' and SAxiAWReadyxS = '1' then + SAxiWReadyxS <= '1'; + end if; + + if SAxiWValidxSI = '1' and SAxiWReadyxS = '1' then + SAxiWReadyxS <= '0'; + end if; + end if; + end process WriteDataChanxP; + + WriteRespChanxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process WriteRespChanxP + if SAxiRstxRAN = '0' then + SAxiBValidxS <= '0'; + elsif rising_edge(SAxiClkxC) then + SAxiBValidxS <= SAxiBValidxS; + + if SAxiWValidxSI = '1' and SAxiWReadyxS = '1' then + SAxiBValidxS <= '1'; + end if; + + if SAxiBValidxS = '1' and SAxiBReadyxSI = '1' then + SAxiBValidxS <= '0'; + end if; + end if; + end process WriteRespChanxP; + + end block WriteChannelxB; + + end block AXI4LitexB; + + <block_name>xB : block is + begin -- block <block_name>xB + + WriteRegPortxP : process (WrAddrxD, WrDataxD, WrValidxS, + <registers_list_current_value>) is + begin -- process WriteRegPortxP + <registers_list_current_to_next> + if WrValidxS = '1' then + case WrAddrxD is + <registers_list_write_access> + when others => null; + end case; + end if; + end process WriteRegPortxP; + + ReadRegPortxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process ReadRegPortxP + if SAxiRstxRAN = '0' then + RdDataxD <= (others => '0'); + elsif rising_edge(SAxiClkxC) then + RdDataxD <= RdDataxD; + + if RdValidxS = '1' then + case RdAddrxD is + <registers_list_read_access> + when others => RdDataxD <= (others => '0'); + end case; + end if; + end if; + end process ReadRegPortxP; + + UpdateRegBankxP : process (SAxiClkxC, SAxiRstxRAN) is + begin -- process UpdateRegBankxP + if SAxiRstxRAN = '0' then + <registers_list_init_current_value> + elsif rising_edge(SAxiClkxC) then + <registers_list_next_to_current> + end if; + end process UpdateRegBankxP; + + end block <block_name>xB; + +end behavioral; diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..c53058a --- /dev/null +++ b/src/utils.py @@ -0,0 +1,47 @@ +#!/usr/bin/python + +import datetime +import re +import os +import shutil +import numpy as np + +def display_title(title_str): + print("\n" + ("-" * (len(title_str) + 6))) + print("-- " + title_str + " --") + print(("-" * (len(title_str) + 6)) + "\n") + +def get_time_str(): + return datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + +def file_replace_pattern(file_path, pattern, replace_str): + # create the regex pattern + re_pattern = "(" + pattern + ")" + p = re.compile(re_pattern) + # create a temp file to apply the pattern + temp_file = file_path + "#" + fin = open(file_path, "r") + fout = open(temp_file, "w") + for line in fin.readlines(): + # substitute the pattern + fout.write(p.sub(replace_str, line)) + # replace the input file by the processed temp file + os.remove(file_path) + shutil.move(temp_file, file_path) + +def hex32str(value): + return "{:08X}".format(value) + +def hex32str2(value, bd_range): + + size = int(np.ceil(int(np.trunc(np.log2(int(bd_range)))) / 4)) + fstr = "{:0" + str(size) + "X}" + + return fstr.format(value) + +def check_key(dict, key) : + + if key in dict.keys() : + return True + else : + return False diff --git a/src/utils.pyc b/src/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a619c405da5902cadb37e8dcf7bd563c7018e5f3 GIT binary patch literal 1808 zcmZSn%*(Z4HCsY50~9bZFfceUFfbG+GB7ZtFfgPrGUPBYM8VmN3{i|QaVCZ+CK#KU zA&QwHg^8hsfgy^8A%z*tU}Z>Q0W;VbQdq$Zc7_x-FoOeRa<B$F0|P_m|NsC0`z13n zFff2H3j+g#Gsp$@AQv!#3@u?`s9|7eW(1ilE+X#kk-`EJ5Km!c0CAWYP!*&wf`u6v zf;HF}7#RGDLB?{GfJog;kVr8z0|SGut^$}=(ACudNtJ*Eb5ipl98LxXhLX&ZoYeT@ zk|GUI;DCu@PX-1C{fzwFRQ;@ceV6>?(%jU%l4AXUqWrAXl45<2)Pl@J{o>@roPziQ zkXUjFlvk9Ro|=+bqF-E;tY2D^nNzG+P+7tY@?vIjK~7?2JlHl4kjFtzWMC9$<Yh#O z7I2`5f!xKwkj21|#mLaiz>viR3dm+ghF}d))cF;Ij8u(O%~ef_SM^Z!RSnhv`KttE za7toHYDs2pD%hua`Q>22;*z2?kRaH52!hHU<zZl8NKY+^2iXJ)QIIQ(K@MhMOa{3R z6x^(^h@S=u6-I^{Mh5W|CI<0ZW>EZQF*4LJgVI1P3n=bWm>I-tSs6;0z#JBaW+sMO zHZYeJl-598c7_UFh8i}8EM`zZxx~sd)N(M?urp+_Fx0RxWU(^TFfr6{fOIx9GB6ef zF@%?}F=VlW3<L?3a4=+XGSskw`AiIqDe&|JPDvVIQWH!ngUKQ=S+2naiXxETic(8J z={q?;w;(eowFH!~^9xe*N<f}1N=;13$;?YFE&+MFyeP8-5-r80NhKh?`NbumWKfiv zn_rd+W)^3Fk`34tkeCL@6tGcgnK`NP1&JjYVA~23OG;9U@=CZF7#NCD3vv>Z!AZCT z<f<aDI<Pb-#TS6Jm!#$v#DmNLCyTVqJg^mM`K2Xb2FQ^#OBNyw3=ANv<6$m^x?TX3 z4TM0sj){+vpNWf+pOK$Ym`Rq2ml0l0fI<nJC3qppB@0$az;Xg8{Hm=CEFx+lSsKJo z%P-1JEP?Pr0biDwQ<_RM?}0L1MrwtzQE^F;JjhERH#0CMgD4mVdqJ83?0AqD7(r>g zNSL97ks-K*i6I!A>_D;Q2g%5w6qS)!9G{(9367tTqS91w8gfg_DNY3!0$}l!%;XYq zjAo}+(#(UPG?<)`nw$-CjuHa{Loq0j8JPGPS(v~HGzgUFgFrD9B+S6T5F`pBKp8#= z<c}Z)5LX#QXfiM`Ae;$iQMm{LMTSjoeoARhsvXD$#h^sS!w7~<oUEM8ocx^307j69 AEC2ui literal 0 HcmV?d00001 -- GitLab