From 7e15c4a12f94dd4e8d79bc03b08bf025cf324a77 Mon Sep 17 00:00:00 2001
From: Matthew Wishek
Date: Sat, 25 Oct 2025 23:17:28 -0600
Subject: [PATCH 01/60] Switch from desyrdl to peakrdl for sysrdl
---
prbs | 2 +-
rdl/Makefile | 43 +-
rdl/cocotb/desyrdl/addrmap_ch0.py | 117 -
rdl/msk_top_regs.h | 369 -
rdl/msk_top_regs.pl | 40 -
rdl/msk_top_regs.rdl | 408 -
rdl/msk_top_regs_desy.rdl | 208 -
rdl/outputs/c-header/msk_top_regs.h | 362 +
rdl/{ => outputs/docs}/msk_top_regs.md | 122 +-
rdl/{ => outputs/docs}/msk_top_regs.pdf | Bin 115023 -> 113089 bytes
rdl/outputs/python/msk_top_regs/__init__.py | 1 +
rdl/outputs/python/msk_top_regs/example.py | 13 +
.../python/msk_top_regs/lib/__init__.py | 114 +
.../python/msk_top_regs/lib/async_memory.py | 626 +
.../lib/async_register_and_field.py | 1230 ++
rdl/outputs/python/msk_top_regs/lib/base.py | 942 +
.../python/msk_top_regs/lib/base_field.py | 549 +
.../python/msk_top_regs/lib/base_register.py | 229 +
.../python/msk_top_regs/lib/callbacks.py | 363 +
.../python/msk_top_regs/lib/field_encoding.py | 80 +
rdl/outputs/python/msk_top_regs/lib/memory.py | 752 +
.../msk_top_regs/lib/register_and_field.py | 1189 ++
.../msk_top_regs/lib/utility_functions.py | 83 +
.../python/msk_top_regs/reg_model/__init__.py | 1 +
.../msk_top_regs/reg_model/msk_top_regs.py | 9451 +++++++++
.../python/msk_top_regs/sim/__init__.py | 1 +
.../python/msk_top_regs/sim/msk_top_regs.py | 175 +
.../python/msk_top_regs/sim_lib}/__init__.py | 0
.../python/msk_top_regs/sim_lib/_callbacks.py | 79 +
.../python/msk_top_regs/sim_lib/base.py | 34 +
.../msk_top_regs/sim_lib/dummy_callbacks.py | 256 +
.../python/msk_top_regs/sim_lib/field.py | 154 +
.../python/msk_top_regs/sim_lib/memory.py | 159 +
.../python/msk_top_regs/sim_lib/register.py | 211 +
.../python/msk_top_regs/sim_lib/simulator.py | 500 +
.../python/msk_top_regs/tests/__init__.py | 1 +
.../tests/_msk_top_regs_sim_test_base.py | 50 +
.../tests/_msk_top_regs_test_base.py | 121 +
.../msk_top_regs/tests/test_msk_top_regs.py | 16576 ++++++++++++++++
.../tests/test_sim_msk_top_regs.py | 7518 +++++++
rdl/outputs/rtl/msk_top_regs.vhd | 2321 +++
rdl/outputs/rtl/msk_top_regs_pkg.vhd | 432 +
rdl/src/axi4lite_intf_pkg.vhd | 42 +
rdl/src/msk_top_regs.rdl | 552 +
rdl/src/reg_utils.vhd | 232 +
rdl/src/regblock_udps.rdl | 54 +
sim/Makefile | 17 +-
sim/desyrdl | 1 -
sim/msk_test.py | 164 +-
sim/msk_top_nvc.gtkw | 619 +-
sim/msk_top_regs | 1 +
src/cdc_resync.vhd | 103 +
src/msk_top.vhd | 2 -
src/msk_top_csr.vhd | 211 +-
54 files changed, 46432 insertions(+), 1448 deletions(-)
delete mode 100644 rdl/cocotb/desyrdl/addrmap_ch0.py
delete mode 100644 rdl/msk_top_regs.h
delete mode 100755 rdl/msk_top_regs.pl
delete mode 100644 rdl/msk_top_regs.rdl
delete mode 100644 rdl/msk_top_regs_desy.rdl
create mode 100644 rdl/outputs/c-header/msk_top_regs.h
rename rdl/{ => outputs/docs}/msk_top_regs.md (87%)
rename rdl/{ => outputs/docs}/msk_top_regs.pdf (60%)
create mode 100644 rdl/outputs/python/msk_top_regs/__init__.py
create mode 100644 rdl/outputs/python/msk_top_regs/example.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/__init__.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/async_memory.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/async_register_and_field.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/base.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/base_field.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/base_register.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/callbacks.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/field_encoding.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/memory.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/register_and_field.py
create mode 100644 rdl/outputs/python/msk_top_regs/lib/utility_functions.py
create mode 100644 rdl/outputs/python/msk_top_regs/reg_model/__init__.py
create mode 100644 rdl/outputs/python/msk_top_regs/reg_model/msk_top_regs.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim/__init__.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim/msk_top_regs.py
rename rdl/{cocotb/desyrdl => outputs/python/msk_top_regs/sim_lib}/__init__.py (100%)
create mode 100644 rdl/outputs/python/msk_top_regs/sim_lib/_callbacks.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim_lib/base.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim_lib/dummy_callbacks.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim_lib/field.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim_lib/memory.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim_lib/register.py
create mode 100644 rdl/outputs/python/msk_top_regs/sim_lib/simulator.py
create mode 100644 rdl/outputs/python/msk_top_regs/tests/__init__.py
create mode 100644 rdl/outputs/python/msk_top_regs/tests/_msk_top_regs_sim_test_base.py
create mode 100644 rdl/outputs/python/msk_top_regs/tests/_msk_top_regs_test_base.py
create mode 100644 rdl/outputs/python/msk_top_regs/tests/test_msk_top_regs.py
create mode 100644 rdl/outputs/python/msk_top_regs/tests/test_sim_msk_top_regs.py
create mode 100644 rdl/outputs/rtl/msk_top_regs.vhd
create mode 100644 rdl/outputs/rtl/msk_top_regs_pkg.vhd
create mode 100644 rdl/src/axi4lite_intf_pkg.vhd
create mode 100644 rdl/src/msk_top_regs.rdl
create mode 100644 rdl/src/reg_utils.vhd
create mode 100644 rdl/src/regblock_udps.rdl
delete mode 120000 sim/desyrdl
create mode 120000 sim/msk_top_regs
create mode 100644 src/cdc_resync.vhd
diff --git a/prbs b/prbs
index 48d9d49..8e42b3e 160000
--- a/prbs
+++ b/prbs
@@ -1 +1 @@
-Subproject commit 48d9d49b0380a4eb18c13c230182dede94462a28
+Subproject commit 8e42b3ea00644cea5ae34b4ebba2e062bdc58be3
diff --git a/rdl/Makefile b/rdl/Makefile
index c9f51ae..901e45d 100644
--- a/rdl/Makefile
+++ b/rdl/Makefile
@@ -1,21 +1,36 @@
-all: msk_top_regs.pdf msk_top_regs.h msk_top_regs_desy.rdl gen_files_cocotb.txt gen_files_vhdl.txt
+#all: msk_top_regs.pdf msk_top_regs.h msk_top_regs_desy.rdl gen_files_cocotb.txt gen_files_vhdl.txt
-gen_files_cocotb.txt : msk_top_regs_desy.rdl
- desyrdl -i msk_top_regs_desy.rdl -f cocotb
+SRCS = src/regblock_udps.rdl src/msk_top_regs.rdl
-gen_files_vhdl.txt : msk_top_regs_desy.rdl
- desyrdl -i msk_top_regs_desy.rdl -f vhdl
+OUTDOCS = outputs/docs
+OUTRTL = outputs/rtl
+OUTPYTHON = outputs/python
+OUTCHEADER = outputs/c-header
-msk_top_regs_desy.rdl : msk_top_regs.rdl msk_top_regs.pl
- rm msk_top_regs_desy.rdl
- ./msk_top_regs.pl msk_top_regs.rdl > msk_top_regs_desy.rdl
+all: $(OUTDOCS)/msk_top_regs.pdf \
+ $(OUTDOCS)/msk_top_regs.md \
+ $(OUTRTL)/msk_top_regs.vhd \
+ $(OUTPYTHON)/__init__.py \
+ $(OUTCHEADER)/msk_top_regs.h
-msk_top_regs.md: msk_top_regs.rdl
- peakrdl markdown msk_top_regs.rdl -o msk_top_regs.md
+$(OUTDOCS)/msk_top_regs.md: $(SRCS)
+ peakrdl markdown $(SRCS) -o $(OUTDOCS)/msk_top_regs.md
-msk_top_regs.h: msk_top_regs.rdl
- peakrdl c-header msk_top_regs.rdl -o msk_top_regs.h
+$(OUTCHEADER)/msk_top_regs.h: $(SRCS)
+ peakrdl c-header $(SRCS) -o outputs/c-header/msk_top_regs.h
-msk_top_regs.pdf: msk_top_regs.md
- pandoc -o msk_top_regs.pdf msk_top_regs.md
+$(OUTRTL)/msk_top_regs.vhd: $(SRCS)
+ peakrdl regblock-vhdl $(SRCS) -o $(OUTRTL) --cpuif axi4-lite
+
+$(OUTDOCS)/msk_top_regs.pdf: $(OUTDOCS)/msk_top_regs.md
+ pandoc -o $(OUTDOCS)/msk_top_regs.pdf $(OUTDOCS)/msk_top_regs.md
+
+$(OUTPYTHON)/__init__.py: $(SRCS)
+ peakrdl python $(SRCS) --async -o $(OUTPYTHON)
+
+clean:
+ rm outputs/docs/*
+ rm outputs/c-header/*
+ rm -r outputs/python/*
+ rm outputs/rtl/*
\ No newline at end of file
diff --git a/rdl/cocotb/desyrdl/addrmap_ch0.py b/rdl/cocotb/desyrdl/addrmap_ch0.py
deleted file mode 100644
index 300f4d6..0000000
--- a/rdl/cocotb/desyrdl/addrmap_ch0.py
+++ /dev/null
@@ -1,117 +0,0 @@
-
-import numpy as np
-import logging
-
-logging.basicConfig(level=logging.NOTSET)
-logger = logging.getLogger()
-logger.setLevel(logging.INFO)
-
-
-
-class AddrmapItem ():
- def __init__(self, name, bus, address, size, bits, fixp, signed, access):
- self.name = name
- self.bus = bus
- self.address = address
- self.size = size
- self.bits = bits
- self.fixp = fixp
- self.access = access
- self.scaling = 1;
- if fixp == "IEEE754":
- self.dtype = np.float32
- elif fixp == 0 and signed == 0:
- self.dtype = np.uint32
- elif fixp == 0 and signed == 1:
- self.dtype = np.int32
- else:
- self.scaling = 1/pow(2, fixp)
- self.dtype = np.float32
-
- async def read(self, count, offset):
- data = await self.bus.read_dwords(self.address+offset*4, count)
- return np.array(data * self.scaling, dtype=self.dtype)
-
- async def read_raw(self, count, offset):
- data = await self.bus.read_dwords(self.address+offset*4, count)
- return np.array(data, dtype=np.uint32)
-
- async def write(self, value, offset):
- val_np = np.array(value)
- if val_np.size > 1:
- data = np.uint32(np.round(val_np / self.scaling)).tolist()
- else:
- data = []
- data.append(np.uint32(np.round(val_np / self.scaling)).tolist())
- await self.bus.write_dwords(self.address+offset*4, data)
-
- async def write_raw(self, value, offset):
- val_np = np.array(value)
- if val_np.size > 1:
- data = np.uint32(np.round(val_np)).tolist()
- else:
- data = []
- data.append(np.uint32(np.round(val_np)).tolist())
- await self.bus.write_dwords(self.address+offset*4, data)
-
-class Addrmap:
- def __init__(self, bus):
- self.addrmap ={}
- self.addrmap['msk_top_regs.Hash_ID_Low'] = AddrmapItem("msk_top_regs.Hash_ID_Low", bus, 0, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.Hash_ID_High'] = AddrmapItem("msk_top_regs.Hash_ID_High", bus, 4, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.MSK_Init'] = AddrmapItem("msk_top_regs.MSK_Init", bus, 8, 4, 3, 0, 0, "RW")
- self.addrmap['msk_top_regs.MSK_Control'] = AddrmapItem("msk_top_regs.MSK_Control", bus, 12, 4, 5, 0, 0, "RW")
- self.addrmap['msk_top_regs.MSK_Status'] = AddrmapItem("msk_top_regs.MSK_Status", bus, 16, 4, 4, 0, 0, "RO")
- self.addrmap['msk_top_regs.Tx_Bit_Count'] = AddrmapItem("msk_top_regs.Tx_Bit_Count", bus, 20, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.Tx_Enable_Count'] = AddrmapItem("msk_top_regs.Tx_Enable_Count", bus, 24, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.Fb_FreqWord'] = AddrmapItem("msk_top_regs.Fb_FreqWord", bus, 28, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.TX_F1_FreqWord'] = AddrmapItem("msk_top_regs.TX_F1_FreqWord", bus, 32, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.TX_F2_FreqWord'] = AddrmapItem("msk_top_regs.TX_F2_FreqWord", bus, 36, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.RX_F1_FreqWord'] = AddrmapItem("msk_top_regs.RX_F1_FreqWord", bus, 40, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.RX_F2_FreqWord'] = AddrmapItem("msk_top_regs.RX_F2_FreqWord", bus, 44, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.LPF_Config_0'] = AddrmapItem("msk_top_regs.LPF_Config_0", bus, 48, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.LPF_Config_1'] = AddrmapItem("msk_top_regs.LPF_Config_1", bus, 52, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.Tx_Data_Width'] = AddrmapItem("msk_top_regs.Tx_Data_Width", bus, 56, 4, 8, 0, 0, "RW")
- self.addrmap['msk_top_regs.Rx_Data_Width'] = AddrmapItem("msk_top_regs.Rx_Data_Width", bus, 60, 4, 8, 0, 0, "RW")
- self.addrmap['msk_top_regs.PRBS_Control'] = AddrmapItem("msk_top_regs.PRBS_Control", bus, 64, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.PRBS_Initial_State'] = AddrmapItem("msk_top_regs.PRBS_Initial_State", bus, 68, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.PRBS_Polynomial'] = AddrmapItem("msk_top_regs.PRBS_Polynomial", bus, 72, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.PRBS_Error_Mask'] = AddrmapItem("msk_top_regs.PRBS_Error_Mask", bus, 76, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.PRBS_Bit_Count'] = AddrmapItem("msk_top_regs.PRBS_Bit_Count", bus, 80, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.PRBS_Error_Count'] = AddrmapItem("msk_top_regs.PRBS_Error_Count", bus, 84, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.LPF_Accum_F1'] = AddrmapItem("msk_top_regs.LPF_Accum_F1", bus, 88, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.LPF_Accum_F2'] = AddrmapItem("msk_top_regs.LPF_Accum_F2", bus, 92, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.axis_xfer_count'] = AddrmapItem("msk_top_regs.axis_xfer_count", bus, 96, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.Rx_Sample_Discard'] = AddrmapItem("msk_top_regs.Rx_Sample_Discard", bus, 100, 4, 16, 0, 0, "RW")
- self.addrmap['msk_top_regs.LPF_Config_2'] = AddrmapItem("msk_top_regs.LPF_Config_2", bus, 104, 4, 32, 0, 0, "RW")
- self.addrmap['msk_top_regs.f1_nco_adjust'] = AddrmapItem("msk_top_regs.f1_nco_adjust", bus, 108, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.f2_nco_adjust'] = AddrmapItem("msk_top_regs.f2_nco_adjust", bus, 112, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.f1_error'] = AddrmapItem("msk_top_regs.f1_error", bus, 116, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.f2_error'] = AddrmapItem("msk_top_regs.f2_error", bus, 120, 4, 32, 0, 0, "RO")
- self.addrmap['msk_top_regs.Tx_Sync_Ctrl'] = AddrmapItem("msk_top_regs.Tx_Sync_Ctrl", bus, 124, 4, 4, 0, 0, "RW")
- self.addrmap['msk_top_regs.Tx_Sync_Cnt'] = AddrmapItem("msk_top_regs.Tx_Sync_Cnt", bus, 128, 4, 24, 0, 0, "RW")
- self.addrmap['msk_top_regs.lowpass_ema_alpha1'] = AddrmapItem("msk_top_regs.lowpass_ema_alpha1", bus, 132, 4, 18, 0, 0, "RW")
- self.addrmap['msk_top_regs.lowpass_ema_alpha2'] = AddrmapItem("msk_top_regs.lowpass_ema_alpha2", bus, 136, 4, 18, 0, 0, "RW")
- self.addrmap['msk_top_regs.rx_power'] = AddrmapItem("msk_top_regs.rx_power", bus, 140, 4, 23, 0, 0, "RO")
-
- def get_path(self, module, name):
- path = module + "." + name
- if path not in self.addrmap:
- msg = f"Cannot find `{path}` in register dict"
- logger.error(msg)
- assert False
- return path
-
- async def read(self, module, name, count=1, offset=0):
- path = self.get_path(module, name)
- return await self.addrmap[path].read(count, offset)
-
- async def write(self, module, name, value, offset=0):
- path = self.get_path(module, name)
- return await self.addrmap[path].write(value, offset)
- async def read_raw(self, module, name, count=1, offset=0):
- path = self.get_path(module, name)
- return await self.addrmap[path].read_raw(count, offset)
- async def write_raw(self, module, name, value, offset=0):
- path = self.get_path(module, name)
- return await self.addrmap[path].write_raw(value, offset)
\ No newline at end of file
diff --git a/rdl/msk_top_regs.h b/rdl/msk_top_regs.h
deleted file mode 100644
index 1579eaf..0000000
--- a/rdl/msk_top_regs.h
+++ /dev/null
@@ -1,369 +0,0 @@
-// Generated by PeakRDL-cheader - A free and open-source header generator
-// https://github.com/SystemRDL/PeakRDL-cheader
-
-#ifndef MSK_TOP_REGS_H
-#define MSK_TOP_REGS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include
-#include
-
-// Reg - msk_hash_lo
-#define MSK_HASH_LO__HASH_ID_LO_bm 0xffffffff
-#define MSK_HASH_LO__HASH_ID_LO_bp 0
-#define MSK_HASH_LO__HASH_ID_LO_bw 32
-#define MSK_HASH_LO__HASH_ID_LO_reset 0xaaaa5555
-
-// Reg - msk_hash_hi
-#define MSK_HASH_HI__HASH_ID_HI_bm 0xffffffff
-#define MSK_HASH_HI__HASH_ID_HI_bp 0
-#define MSK_HASH_HI__HASH_ID_HI_bw 32
-#define MSK_HASH_HI__HASH_ID_HI_reset 0x5555aaaa
-
-// Reg - msk_init
-#define MSK_INIT__TXRXINIT_bm 0x1
-#define MSK_INIT__TXRXINIT_bp 0
-#define MSK_INIT__TXRXINIT_bw 1
-#define MSK_INIT__TXRXINIT_reset 0x1
-#define MSK_INIT__TXINIT_bm 0x2
-#define MSK_INIT__TXINIT_bp 1
-#define MSK_INIT__TXINIT_bw 1
-#define MSK_INIT__TXINIT_reset 0x1
-#define MSK_INIT__RXINIT_bm 0x4
-#define MSK_INIT__RXINIT_bp 2
-#define MSK_INIT__RXINIT_bw 1
-#define MSK_INIT__RXINIT_reset 0x1
-
-// Reg - msk_ctrl
-#define MSK_CTRL__PTT_bm 0x1
-#define MSK_CTRL__PTT_bp 0
-#define MSK_CTRL__PTT_bw 1
-#define MSK_CTRL__PTT_reset 0x0
-#define MSK_CTRL__LOOPBACK_ENA_bm 0x2
-#define MSK_CTRL__LOOPBACK_ENA_bp 1
-#define MSK_CTRL__LOOPBACK_ENA_bw 1
-#define MSK_CTRL__LOOPBACK_ENA_reset 0x0
-#define MSK_CTRL__RX_INVERT_bm 0x4
-#define MSK_CTRL__RX_INVERT_bp 2
-#define MSK_CTRL__RX_INVERT_bw 1
-#define MSK_CTRL__RX_INVERT_reset 0x0
-#define MSK_CTRL__CLEAR_COUNTS_bm 0x8
-#define MSK_CTRL__CLEAR_COUNTS_bp 3
-#define MSK_CTRL__CLEAR_COUNTS_bw 1
-#define MSK_CTRL__CLEAR_COUNTS_reset 0x0
-#define MSK_CTRL__DIFF_ENCODER_LOOPBACK_bm 0x10
-#define MSK_CTRL__DIFF_ENCODER_LOOPBACK_bp 4
-#define MSK_CTRL__DIFF_ENCODER_LOOPBACK_bw 1
-#define MSK_CTRL__DIFF_ENCODER_LOOPBACK_reset 0x0
-
-// Reg - msk_stat_0
-#define MSK_STAT_0__DEMOD_SYNC_LOCK_bm 0x1
-#define MSK_STAT_0__DEMOD_SYNC_LOCK_bp 0
-#define MSK_STAT_0__DEMOD_SYNC_LOCK_bw 1
-#define MSK_STAT_0__DEMOD_SYNC_LOCK_reset 0x0
-#define MSK_STAT_0__TX_ENABLE_bm 0x2
-#define MSK_STAT_0__TX_ENABLE_bp 1
-#define MSK_STAT_0__TX_ENABLE_bw 1
-#define MSK_STAT_0__TX_ENABLE_reset 0x0
-#define MSK_STAT_0__RX_ENABLE_bm 0x4
-#define MSK_STAT_0__RX_ENABLE_bp 2
-#define MSK_STAT_0__RX_ENABLE_bw 1
-#define MSK_STAT_0__RX_ENABLE_reset 0x0
-#define MSK_STAT_0__TX_AXIS_VALID_bm 0x8
-#define MSK_STAT_0__TX_AXIS_VALID_bp 3
-#define MSK_STAT_0__TX_AXIS_VALID_bw 1
-#define MSK_STAT_0__TX_AXIS_VALID_reset 0x0
-
-// Reg - msk_stat_1
-#define MSK_STAT_1__TX_BIT_COUNTER_bm 0xffffffff
-#define MSK_STAT_1__TX_BIT_COUNTER_bp 0
-#define MSK_STAT_1__TX_BIT_COUNTER_bw 32
-#define MSK_STAT_1__TX_BIT_COUNTER_reset 0x0
-
-// Reg - msk_stat_2
-#define MSK_STAT_2__TX_ENA_COUNTER_bm 0xffffffff
-#define MSK_STAT_2__TX_ENA_COUNTER_bp 0
-#define MSK_STAT_2__TX_ENA_COUNTER_bw 32
-#define MSK_STAT_2__TX_ENA_COUNTER_reset 0x0
-
-// Reg - config_nco_fw_desc_c4924cc6_name_0c494469
-#define CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_bp 0
-#define CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_bw 32
-#define CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_reset 0x0
-
-// Reg - config_nco_fw_desc_94d7aaf5_name_84dd0c1c
-#define CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_bp 0
-#define CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_bw 32
-#define CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_reset 0x0
-
-// Reg - config_nco_fw_desc_42134a4f_name_d97dbd51
-#define CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_bp 0
-#define CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_bw 32
-#define CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_reset 0x0
-
-// Reg - config_nco_fw_desc_16fb48c8_name_8d01a20d
-#define CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_bp 0
-#define CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_bw 32
-#define CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_reset 0x0
-
-// Reg - config_nco_fw_desc_43c0828f_name_bdc60ecf
-#define CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_bp 0
-#define CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_bw 32
-#define CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_reset 0x0
-
-// Reg - lpf_config_0
-#define LPF_CONFIG_0__LPF_FREEZE_bm 0x1
-#define LPF_CONFIG_0__LPF_FREEZE_bp 0
-#define LPF_CONFIG_0__LPF_FREEZE_bw 1
-#define LPF_CONFIG_0__LPF_FREEZE_reset 0x0
-#define LPF_CONFIG_0__LPF_ZERO_bm 0x2
-#define LPF_CONFIG_0__LPF_ZERO_bp 1
-#define LPF_CONFIG_0__LPF_ZERO_bw 1
-#define LPF_CONFIG_0__LPF_ZERO_reset 0x0
-#define LPF_CONFIG_0__PRBS_RESERVED_bm 0xfc
-#define LPF_CONFIG_0__PRBS_RESERVED_bp 2
-#define LPF_CONFIG_0__PRBS_RESERVED_bw 6
-#define LPF_CONFIG_0__PRBS_RESERVED_reset 0x0
-#define LPF_CONFIG_0__LPF_ALPHA_bm 0xffffff00
-#define LPF_CONFIG_0__LPF_ALPHA_bp 8
-#define LPF_CONFIG_0__LPF_ALPHA_bw 24
-#define LPF_CONFIG_0__LPF_ALPHA_reset 0x0
-
-// Reg - lpf_config_1
-#define LPF_CONFIG_1__I_GAIN_bm 0xffffff
-#define LPF_CONFIG_1__I_GAIN_bp 0
-#define LPF_CONFIG_1__I_GAIN_bw 24
-#define LPF_CONFIG_1__I_GAIN_reset 0x0
-#define LPF_CONFIG_1__I_SHIFT_bm 0xff000000
-#define LPF_CONFIG_1__I_SHIFT_bp 24
-#define LPF_CONFIG_1__I_SHIFT_bw 8
-#define LPF_CONFIG_1__I_SHIFT_reset 0x0
-
-// Reg - data_width_desc_58c848dd_name_2fbd8eba
-#define DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_bm 0xff
-#define DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_bp 0
-#define DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_bw 8
-#define DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_reset 0x8
-
-// Reg - data_width_desc_6097df38_name_4609588b
-#define DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_bm 0xff
-#define DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_bp 0
-#define DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_bw 8
-#define DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_reset 0x8
-
-// Reg - prbs_ctrl
-#define PRBS_CTRL__PRBS_SEL_bm 0x1
-#define PRBS_CTRL__PRBS_SEL_bp 0
-#define PRBS_CTRL__PRBS_SEL_bw 1
-#define PRBS_CTRL__PRBS_SEL_reset 0x0
-#define PRBS_CTRL__PRBS_ERROR_INSERT_bm 0x2
-#define PRBS_CTRL__PRBS_ERROR_INSERT_bp 1
-#define PRBS_CTRL__PRBS_ERROR_INSERT_bw 1
-#define PRBS_CTRL__PRBS_ERROR_INSERT_reset 0x0
-#define PRBS_CTRL__PRBS_CLEAR_bm 0x4
-#define PRBS_CTRL__PRBS_CLEAR_bp 2
-#define PRBS_CTRL__PRBS_CLEAR_bw 1
-#define PRBS_CTRL__PRBS_CLEAR_reset 0x0
-#define PRBS_CTRL__PRBS_MANUAL_SYNC_bm 0x8
-#define PRBS_CTRL__PRBS_MANUAL_SYNC_bp 3
-#define PRBS_CTRL__PRBS_MANUAL_SYNC_bw 1
-#define PRBS_CTRL__PRBS_MANUAL_SYNC_reset 0x0
-#define PRBS_CTRL__PRBS_RESERVED_bm 0xfff0
-#define PRBS_CTRL__PRBS_RESERVED_bp 4
-#define PRBS_CTRL__PRBS_RESERVED_bw 12
-#define PRBS_CTRL__PRBS_RESERVED_reset 0x0
-#define PRBS_CTRL__PRBS_SYNC_THRESHOLD_bm 0xffff0000
-#define PRBS_CTRL__PRBS_SYNC_THRESHOLD_bp 16
-#define PRBS_CTRL__PRBS_SYNC_THRESHOLD_bw 16
-#define PRBS_CTRL__PRBS_SYNC_THRESHOLD_reset 0x0
-
-// Reg - config_prbs_seed
-#define CONFIG_PRBS_SEED__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_PRBS_SEED__CONFIG_DATA_bp 0
-#define CONFIG_PRBS_SEED__CONFIG_DATA_bw 32
-#define CONFIG_PRBS_SEED__CONFIG_DATA_reset 0x0
-
-// Reg - config_prbs_poly
-#define CONFIG_PRBS_POLY__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_PRBS_POLY__CONFIG_DATA_bp 0
-#define CONFIG_PRBS_POLY__CONFIG_DATA_bw 32
-#define CONFIG_PRBS_POLY__CONFIG_DATA_reset 0x0
-
-// Reg - config_prbs_errmask
-#define CONFIG_PRBS_ERRMASK__CONFIG_DATA_bm 0xffffffff
-#define CONFIG_PRBS_ERRMASK__CONFIG_DATA_bp 0
-#define CONFIG_PRBS_ERRMASK__CONFIG_DATA_bw 32
-#define CONFIG_PRBS_ERRMASK__CONFIG_DATA_reset 0x0
-
-// Reg - stat_32_bits
-#define STAT_32_BITS__STATUS_DATA_bm 0xffffffff
-#define STAT_32_BITS__STATUS_DATA_bp 0
-#define STAT_32_BITS__STATUS_DATA_bw 32
-#define STAT_32_BITS__STATUS_DATA_reset 0x0
-
-// Reg - stat_32_errs
-#define STAT_32_ERRS__STATUS_DATA_bm 0xffffffff
-#define STAT_32_ERRS__STATUS_DATA_bp 0
-#define STAT_32_ERRS__STATUS_DATA_bw 32
-#define STAT_32_ERRS__STATUS_DATA_reset 0x0
-
-// Reg - stat_32_lpf_acc_desc_8cebc7dc_name_f20c6670
-#define STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_bm 0xffffffff
-#define STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_bp 0
-#define STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_bw 32
-#define STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_reset 0x0
-
-// Reg - stat_32_lpf_acc_desc_dea6bd99_name_758fd0ce
-#define STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_bm 0xffffffff
-#define STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_bp 0
-#define STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_bw 32
-#define STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_reset 0x0
-
-// Reg - msk_stat_3
-#define MSK_STAT_3__XFER_COUNT_bm 0xffffffff
-#define MSK_STAT_3__XFER_COUNT_bp 0
-#define MSK_STAT_3__XFER_COUNT_bw 32
-#define MSK_STAT_3__XFER_COUNT_reset 0x0
-
-// Reg - rx_sample_discard
-#define RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_bm 0xff
-#define RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_bp 0
-#define RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_bw 8
-#define RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_reset 0x0
-#define RX_SAMPLE_DISCARD__RX_NCO_DISCARD_bm 0xff00
-#define RX_SAMPLE_DISCARD__RX_NCO_DISCARD_bp 8
-#define RX_SAMPLE_DISCARD__RX_NCO_DISCARD_bw 8
-#define RX_SAMPLE_DISCARD__RX_NCO_DISCARD_reset 0x0
-
-// Reg - lpf_config_2
-#define LPF_CONFIG_2__P_GAIN_bm 0xffffff
-#define LPF_CONFIG_2__P_GAIN_bp 0
-#define LPF_CONFIG_2__P_GAIN_bw 24
-#define LPF_CONFIG_2__P_GAIN_reset 0x0
-#define LPF_CONFIG_2__P_SHIFT_bm 0xff000000
-#define LPF_CONFIG_2__P_SHIFT_bp 24
-#define LPF_CONFIG_2__P_SHIFT_bw 8
-#define LPF_CONFIG_2__P_SHIFT_reset 0x0
-
-// Reg - observation_data_data_0c017ef4_desc_64ff3689_name_d8ad3b25
-#define OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_bm 0xffffffff
-#define OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_bp 0
-#define OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_bw 32
-#define OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_reset 0x0
-
-// Reg - observation_data_data_0515efaa_desc_ebde6d39_name_2c154788
-#define OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_bm 0xffffffff
-#define OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_bp 0
-#define OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_bw 32
-#define OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_reset 0x0
-
-// Reg - observation_data_data_25a21249_desc_417e1c96_name_3b640507
-#define OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_bm 0xffffffff
-#define OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_bp 0
-#define OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_bw 32
-#define OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_reset 0x0
-
-// Reg - observation_data_data_272a00b6_desc_70869502_name_3de9a0d3
-#define OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_bm 0xffffffff
-#define OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_bp 0
-#define OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_bw 32
-#define OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_reset 0x0
-
-// Reg - tx_sync_ctrl
-#define TX_SYNC_CTRL__TX_SYNC_ENA_bm 0x1
-#define TX_SYNC_CTRL__TX_SYNC_ENA_bp 0
-#define TX_SYNC_CTRL__TX_SYNC_ENA_bw 1
-#define TX_SYNC_CTRL__TX_SYNC_ENA_reset 0x0
-#define TX_SYNC_CTRL__TX_SYNC_FORCE_bm 0x2
-#define TX_SYNC_CTRL__TX_SYNC_FORCE_bp 1
-#define TX_SYNC_CTRL__TX_SYNC_FORCE_bw 1
-#define TX_SYNC_CTRL__TX_SYNC_FORCE_reset 0x0
-#define TX_SYNC_CTRL__TX_SYNC_F1_bm 0x4
-#define TX_SYNC_CTRL__TX_SYNC_F1_bp 2
-#define TX_SYNC_CTRL__TX_SYNC_F1_bw 1
-#define TX_SYNC_CTRL__TX_SYNC_F1_reset 0x0
-#define TX_SYNC_CTRL__TX_SYNC_F2_bm 0x8
-#define TX_SYNC_CTRL__TX_SYNC_F2_bp 3
-#define TX_SYNC_CTRL__TX_SYNC_F2_bw 1
-#define TX_SYNC_CTRL__TX_SYNC_F2_reset 0x0
-
-// Reg - tx_sync_cnt
-#define TX_SYNC_CNT__TX_SYNC_CNT_bm 0xffffff
-#define TX_SYNC_CNT__TX_SYNC_CNT_bp 0
-#define TX_SYNC_CNT__TX_SYNC_CNT_bw 24
-#define TX_SYNC_CNT__TX_SYNC_CNT_reset 0x0
-
-// Reg - lowpass_ema_alpha
-#define LOWPASS_EMA_ALPHA__ALPHA_bm 0x3ffff
-#define LOWPASS_EMA_ALPHA__ALPHA_bp 0
-#define LOWPASS_EMA_ALPHA__ALPHA_bw 18
-#define LOWPASS_EMA_ALPHA__ALPHA_reset 0x0
-
-// Reg - rx_power
-#define RX_POWER__RX_POWER_bm 0x7fffff
-#define RX_POWER__RX_POWER_bp 0
-#define RX_POWER__RX_POWER_bw 23
-#define RX_POWER__RX_POWER_reset 0x0
-
-// Addrmap - msk_top_regs
-typedef struct __attribute__ ((__packed__)) {
- uint32_t Hash_ID_Low;
- uint32_t Hash_ID_High;
- uint32_t MSK_Init;
- uint32_t MSK_Control;
- uint32_t MSK_Status;
- uint32_t Tx_Bit_Count;
- uint32_t Tx_Enable_Count;
- uint32_t Fb_FreqWord;
- uint32_t TX_F1_FreqWord;
- uint32_t TX_F2_FreqWord;
- uint32_t RX_F1_FreqWord;
- uint32_t RX_F2_FreqWord;
- uint32_t LPF_Config_0;
- uint32_t LPF_Config_1;
- uint32_t Tx_Data_Width;
- uint32_t Rx_Data_Width;
- uint32_t PRBS_Control;
- uint32_t PRBS_Initial_State;
- uint32_t PRBS_Polynomial;
- uint32_t PRBS_Error_Mask;
- uint32_t PRBS_Bit_Count;
- uint32_t PRBS_Error_Count;
- uint32_t LPF_Accum_F1;
- uint32_t LPF_Accum_F2;
- uint32_t axis_xfer_count;
- uint32_t Rx_Sample_Discard;
- uint32_t LPF_Config_2;
- uint32_t f1_nco_adjust;
- uint32_t f2_nco_adjust;
- uint32_t f1_error;
- uint32_t f2_error;
- uint32_t Tx_Sync_Ctrl;
- uint32_t Tx_Sync_Cnt;
- uint32_t lowpass_ema_alpha1;
- uint32_t lowpass_ema_alpha2;
- uint32_t rx_power;
-} msk_top_regs_t;
-
-// Addrmap - Pluto_MSK_Modem
-typedef struct __attribute__ ((__packed__)) {
- uint8_t RESERVED_0_43bfffff[0x43c00000];
- msk_top_regs_t pluto_msk_regs;
-} Pluto_MSK_Modem_t;
-
-
-static_assert(sizeof(Pluto_MSK_Modem_t) == 0x43c00090, "Packing error");
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* MSK_TOP_REGS_H */
diff --git a/rdl/msk_top_regs.pl b/rdl/msk_top_regs.pl
deleted file mode 100755
index 5d951b3..0000000
--- a/rdl/msk_top_regs.pl
+++ /dev/null
@@ -1,40 +0,0 @@
-#! /usr/bin/perl
-
-open(FILE, "msk_top_regs.rdl");
-
-while() {
-
- chomp;
-
- s/}; \/\/ //;
-
- $line = "$_\n";
-
- if (/^\/\/.*desyrdl/) {
- $line = substr $line, 2;
- }
-
- if (/name/) { $line = ""; }
-
- if (/desc/) {
- $line = "";
- $eoc = 1;
- }
-
- if (/;$/) {
- if ($eoc == 1) {
- $eoc = 0;
- $line = "";
- }
- } else {
- if ($eoc == 1) {
- $line = "";
- }
- }
-
- if (/Pluto_MSK_Modem/) { last; }
-
- print($line);
-
-}
-close FILE;
diff --git a/rdl/msk_top_regs.rdl b/rdl/msk_top_regs.rdl
deleted file mode 100644
index ebe3ec0..0000000
--- a/rdl/msk_top_regs.rdl
+++ /dev/null
@@ -1,408 +0,0 @@
-reg msk_hash_lo {
- name = "Pluto MSK FPGA Hash ID - Lower 32-bits";
- regwidth = 32;
- accesswidth = 32;
- field { sw = r; hw = na; } hash_id_lo[31:0] = 0xAAAA5555;
- hash_id_lo->desc = "Lower 32-bits of Pluto MSK FPGA Hash ID";
- hash_id_lo->name = "Hash ID Lower 32-bits";
-};
-
-reg msk_hash_hi {
- name = "Pluto MSK FPGA Hash ID - Upper 32-bits";
- regwidth = 32;
- accesswidth = 32;
- field { sw = r; hw = na; } hash_id_hi[31:0] = 0x5555AAAA;
- hash_id_hi->desc = "Upper 32-bits of Pluto MSK FPGA Hash ID";
- hash_id_hi->name = "Hash ID Upper 32-bits";
-};
-
-reg msk_init {
- name = "MSK Modem Control 0";
- regwidth = 32;
- desc = "Synchronous initialization of MSK Modem functions, does not affect configuration registers.";
- field { sw = rw; hw=r; } txrxinit = 1;
- txrxinit->desc = "0 -> Normal modem operation
- 1 -> Initialize Tx and Rx";
- txrxinit->name = "Tx/Rx Init Enable";
- field { sw = rw; hw=r; } txinit = 1;
- txinit->desc = "0 -> Normal Tx operation
- 1 -> Initialize Tx";
- txinit->name = "Tx Init Enable";
- field { sw = rw; hw=r; } rxinit = 1;
- rxinit->desc = "0 -> Normal Rx operation
- 1 -> Initialize Rx";
- rxinit->name = "Rx Init Enable";
-};
-
-reg msk_ctrl {
- name = "MSK Modem Control 1";
- regwidth = 32;
- desc = "MSK Modem Configuration and Control";
- field { sw = rw; hw = r; } ptt = 0;
- ptt->desc = "0 -> PTT Disabled
- 1 -> PTT Enabled";
- ptt->name = "Push-to-Talk Enable";
- field { sw = rw; hw = r; } loopback_ena = 0;
- loopback_ena->desc = "0 -> Modem loopback disabled
- 1 -> Modem loopback enabled";
- loopback_ena->name = "Modem Loopback Enable";
- field { sw = rw; hw = r; } rx_invert = 0;
- rx_invert->desc = "0 -> Rx data normal
- 1 -> Rx data inverted";
- rx_invert->name = "Rx Data Invert Enable";
- field { sw = rw; hw = r; singlepulse = true; } clear_counts = 0;
- clear_counts->desc = "Clear Tx Bit Counter and Tx Enable Counter";
- clear_counts->name = "Clear Status Counters";
- field { sw = rw; hw = r; } diff_encoder_loopback = 0;
- diff_encoder_loopback->desc = "0 -> Differential Encoder -> Decoder loopback disabled
- 1 -> Differential Encoder -> Decoder loopback enabled";
- diff_encoder_loopback->name = "Differential Encoder -> Decoder Loopback Enable";
-};
-
-reg msk_stat_0 {
- name = "MSK Modem Status 0";
- desc = "Modem status bits";
- regwidth = 32;
- field { sw = r; hw = w; } demod_sync_lock=0;
- demod_sync_lock->desc = "Demodulator Sync Status - not currently implemented";
- demod_sync_lock->name = "Demodulator Sync Status";
- field { sw = r; hw = w; } tx_enable=0;
- tx_enable->name = "AD9363 DAC Interface Tx Enable Input Active";
- tx_enable->desc = "1 -> Data to DAC Enabled
- 0 -> Data to DAC Disabled";
- field { sw = r; hw = w; } rx_enable=0;
- rx_enable->name = "AD9363 ADC Interface Rx Enable Input Active";
- rx_enable->desc = "1 -> Data from ADC Enabled
- 0 -> Data from ADC Disabled";
- field { sw = r; hw = w; } tx_axis_valid=0;
- tx_axis_valid->name = "Tx S_AXIS_VALID";
- tx_axis_valid->desc = "1 -> S_AXIS_VALID Enabled
- 0 -> S_AXIS_VALID Disabled";
-};
-
-reg msk_stat_1 {
- name = "MSK Modem Status 1";
- desc = "Modem status data";
- regwidth = 32;
- field { sw = r; hw = w; } tx_bit_counter[31:0] = 0;
- tx_bit_counter->desc = "Count of data requests made by modem";
- tx_bit_counter->name = "Tx Bit Count";
-};
-
-reg msk_stat_2 {
- name = "MSK Modem Status 2";
- desc = "Modem status data";
- regwidth = 32;
- field { sw = r; hw = w; } tx_ena_counter[31:0] = 0;
- tx_ena_counter->desc = "Number of clocks on which Tx Enable is active";
- tx_ena_counter->name = "Tx Enable Count";
-};
-
-reg config_nco_fw {
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
- config_data->name = "Frequency Control Word";
- config_data->desc = "Sets the center frequency of the NCO as FW = Fn * 2^32/Fs, where Fn is the desired NCO frequency, and Fs is the NCO sample rate";
-};
-
-reg rx_sample_discard {
- name = "Rx Sample Discard";
- desc = "Configure samples discard operation for demodulator";
- regwidth = 32;
- field { sw = rw; hw = r; } rx_sample_discard[7:0] = 0;
- rx_sample_discard->desc = "Number of Rx samples to discard";
- rx_sample_discard->name = "Rx Sample Discard Value";
- field { sw = rw; hw = r; } rx_nco_discard[15:8] = 0;
- rx_nco_discard->desc = "Number of NCO samples to discard";
- rx_nco_discard->name = "Rx NCO Sample Discard Value";
-};
-
-reg lpf_config_0 {
- name = "PI Controller Configuration and Low-pass Filter Configuration";
- desc = "Configure PI controller and low-pass filter";
- regwidth = 32;
- field { sw = rw; hw = r; } lpf_freeze = 0;
- lpf_freeze->name = "Freeze the accumulator's current value";
- lpf_freeze->desc = "0 -> Normal operation
- 1 -> Freeze current value";
- field { sw = rw; hw = r; } lpf_zero = 0;
- lpf_zero->name = "Hold the PI Accumulator at zero";
- lpf_zero->desc = "0 -> Normal operation
- 1 -> Zero and hold accumulator";
- field { sw = w; hw = r; } prbs_reserved[7:2] = 0;
- field { sw = rw; hw = r; } lpf_alpha[31:8] = 0;
- lpf_alpha->name = "Lowpass IIR filter alpha";
- lpf_alpha->desc = "Value controls the filter rolloff";
-};
-
-reg lpf_config_1 {
- name = "PI Controller Configuration Configuration Register 1";
- desc = "Configures PI Controller I-gain and divisor";
- regwidth = 32;
- field { sw = rw; hw = r; } i_gain[23:0] = 0;
- i_gain->name = "Integral Gain Value";
- i_gain->desc = "Value m of 0-16,777,215 sets the integral multiplier";
- field { sw = rw; hw = r; } i_shift[31:24] = 0;
- i_shift->name = "Integral Gain Bit Shift";
- i_shift->desc = "Value n of 0-32 sets the integral divisor as 2^-n";
-};
-
-reg lpf_config_2 {
- name = "PI Controller Configuration Configuration Register 2";
- desc = "Configures PI Controller I-gain and divisor";
- regwidth = 32;
- field { sw = rw; hw = r; } p_gain[23:0] = 0;
- p_gain->name = "Proportional Gain Value";
- p_gain->desc = "Value m of 0-16,777,215 sets the proportional multiplier";
- field { sw = rw; hw = r; } p_shift[31:24] = 0;
- p_shift->name = "Proportional Gain Bit Shift";
- p_shift->desc = "Value n of 0-32 sets the proportional divisor as 2^-n";
-};
-
-reg data_width {
- regwidth = 32;
- field { sw = rw; hw = r; } data_width[7:0] = 8;
- data_width->name = "Modem input/output data width";
- data_width->desc = "Set the data width of the modem input/output";
-};
-
-reg prbs_ctrl {
- name = "PRBS Control 0";
- desc = "Configures operation of the PRBS Generator and Monitor";
- regwidth = 32;
- field { sw = rw; hw = r; } prbs_sel = 0;
- prbs_sel->name = "PRBS Data Select";
- prbs_sel->desc = "0 -> Select Normal Tx Data
- 1 -> Select PRBS Tx Data";
- field { sw = w; hw = r; singlepulse = true; } prbs_error_insert = 0;
- prbs_error_insert->name = "PRBS Error Insert";
- prbs_error_insert->desc = "0 -> 1 : Insert bit error in Tx data (both Normal and PRBS)
- 1 -> 0 : Insert bit error in Tx data (both Normal and PRBS)";
- field { sw = w; hw = r; singlepulse = true; } prbs_clear = 0;
- prbs_clear->name = "PRBS Clear Counters";
- prbs_clear->desc = "0 -> 1 : Clear PRBS Counters
- 1 -> 0 : Clear PRBS Counters";
- field { sw = w; hw = r; singlepulse = true; } prbs_manual_sync = 0;
- prbs_manual_sync->name = "PRBS Manual Sync";
- prbs_manual_sync->desc = "0 -> 1 : Synchronize PRBS monitor
- 1 -> 0 : Synchronize PRBS monitor";
- field { sw = w; hw = r; } prbs_reserved[15:4] = 0;
- field { sw = w; hw = r; } prbs_sync_threshold[31:16] = 0;
- prbs_sync_threshold->name = "PRBS Auto Sync Threshold";
- prbs_sync_threshold->desc = "0 : Auto Sync Disabled
- N > 0 : Auto sync after N errors";
-};
-
-reg config_prbs_seed {
- name = "PRBS Control 1";
- desc = "PRBS Initial State";
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
- config_data->name = "PRBS Seed";
- config_data->desc = "Sets the starting value of the PRBS generator";
-};
-
-reg config_prbs_poly {
- name = "PRBS Control 2";
- desc = "PRBS Polynomial";
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
- config_data->name = "PRBS Polynomial";
- config_data->desc = "Bit positions set to '1' indicate polynomial feedback positions";
-};
-
-reg config_prbs_errmask {
- name = "PRBS Control 3";
- desc = "PRBS Error Mask";
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
- config_data->name = "PRBS Error Mask";
- config_data->desc = "Bit positions set to '1' indicate bits that are inverted when a bit error is inserted";
-};
-
-reg stat_32_bits {
- name = "PRBS Status 0";
- desc = "PRBS Bits Received";
- regwidth = 32;
- field { sw = r; hw = w; } status_data[31:0] = 0;
- status_data->name = "PRBS Bits Received";
- status_data->desc = "Number of bits received by the PRBS monitor since last
- BER can be calculated as the ratio of received bits to errored-bits";
-};
-
-reg stat_32_errs {
- name = "PRBS Status 1";
- desc = "PRBS Bit Errors";
- regwidth = 32;
- field { sw = r; hw = w; } status_data[31:0] = 0;
- status_data->name = "PRBS Bit Errors";
- status_data->desc = "Number of errored-bits received by the PRBS monitor since last sync
- BER can be calculated as the ratio of received bits to errored-bits";
-};
-
-reg stat_32_lpf_acc {
- regwidth = 32;
- field { sw = r; hw = w; } status_data[31:0] = 0;
- status_data->name = "PI Controller Accumulator Value";
- status_data->desc = "PI Controller Accumulator Value";
-};
-
-reg msk_stat_3 {
- name = "MSK Modem Status 3";
- desc = "Modem status data";
- regwidth = 32;
- field { sw = r; hw = w; } xfer_count[31:0] = 0;
- xfer_count->desc = "Number completed S_AXIS transfers";
- xfer_count->name = "S_AXIS Transfers";
-};
-
-reg tx_sync_ctrl {
- name = "Transmitter Sync Control";
- desc = "Provides control bits for generation of transmitter synchronization patterns";
- regwidth = 32;
- field { sw = rw; hw = r; } tx_sync_ena = 0;
- tx_sync_ena->name = "Tx Sync Enable";
- tx_sync_ena->desc = "0 -> Disable sync transmission
- 1 -> Enable sync transmission when PTT is asserted";
- field { sw = rw; hw = r; } tx_sync_force = 0;
- tx_sync_force->name = "Tx Sync Force";
- tx_sync_force->desc = "0 : Normal operation)
- 1 : Transmit synchronization pattern)";
- field { sw = rw; hw = r; } tx_sync_f1 = 0;
- tx_sync_f1->name = "Tx F1 Sync Enable";
- tx_sync_f1->desc = "Enables/Disables transmission of F1 tone for receiver synchronization
- 0 : F1 tone transmission disabled
- 1 : F1 tone transmission enabled
- Both F1 and F2 can be enabled at the same time";
- field { sw = rw; hw = r; } tx_sync_f2 = 0;
- tx_sync_f2->name = "Tx F2 Sync Enable";
- tx_sync_f2->desc = "Enables/Disables transmission of F2 tone for receiver synchronization
- 0 : F2 tone transmission disabled
- 1 : F2 tone transmission enabled
- Both F1 and F2 can be enabled at the same time";
-};
-
-reg tx_sync_cnt {
- name = "Transmitter Sync Duration";
- desc = "Sets the duration of the synchronization tones when enabled";
- regwidth = 32;
- field { sw = rw; hw = r; } tx_sync_cnt[23:0] = 0;
- tx_sync_cnt->name = "Tx sync duration";
- tx_sync_cnt->desc = "Value from 0x00_0000 to 0xFF_FFFF. This value represents the number bit-times the synchronization signal should be sent after PTT is asserted.";
-};
-
-reg lowpass_ema_alpha {
- name = "Exponential Moving Average Alpha";
- desc = "Sets the alpha for the EMA";
- regwidth = 32;
- field { sw = rw; hw = r; } alpha[17:0] = 0;
- alpha->name = "EMA alpha";
- alpha->desc = "Value from 0x0_0000 to 0x3_FFFF represent the EMA alpha";
-};
-
-reg rx_power {
- name = "Receive Power";
- desc = "Receive power computed from I/Q ssamples";
- regwidth = 32;
- field { sw = r; hw = w; } rx_power[22:0] = 0;
- rx_power->name = "Receive Power";
- rx_power->desc = "Value that represent the RMS power of the incoming I;";
-};
-
-field data32 {
- fieldwidth = 32;
- sw = r;
- hw = w;
-};
-
-reg observation_data {
- regwidth = 32;
- data32 data[31:0] = 0;
-};
-
-addrmap msk_top_regs {
- name="Pluto MSK Registers";
- desc="MSK Modem Configuration and Status Registers";
- lsb0;
- default accesswidth=32;
- addressing=compact;
-
-// desyrdl_interface = "AXI4L";
-// desyrdl_access_channel = 0;
-
- msk_hash_lo Hash_ID_Low;
- msk_hash_hi Hash_ID_High;
- msk_init MSK_Init;
- msk_ctrl MSK_Control;
- msk_stat_0 MSK_Status;
- msk_stat_1 Tx_Bit_Count;
- msk_stat_2 Tx_Enable_Count;
- config_nco_fw Fb_FreqWord;
- Fb_FreqWord->desc = "Set Modem Data Rate";
- Fb_FreqWord->name = "Bitrate NCO Frequency Control Word";
- config_nco_fw TX_F1_FreqWord;
- TX_F1_FreqWord->desc = "Set Modulator F1 Frequency";
- TX_F1_FreqWord->name = "Tx F1 NCO Frequency Control Word";
- config_nco_fw TX_F2_FreqWord;
- TX_F2_FreqWord->desc = "Set Modulator F2 Frequency";
- TX_F2_FreqWord->name = "Tx F2 NCO Frequency Control Word";
- config_nco_fw RX_F1_FreqWord;
- RX_F1_FreqWord->desc = "Set Demodulator F1 Frequency";
- RX_F1_FreqWord->name = "Rx F1 NCO Frequency Control Word";
- config_nco_fw RX_F2_FreqWord;
- RX_F2_FreqWord->desc = "Set Demodulator F2 Frequency";
- RX_F2_FreqWord->name = "Rx F2 NCO Frequency Control Word";
- lpf_config_0 LPF_Config_0;
- lpf_config_1 LPF_Config_1;
- data_width Tx_Data_Width;
- Tx_Data_Width->desc = "Set the parallel data width of the parallel-to-serial converter";
- Tx_Data_Width->name = "Modem Tx Input Data Width";
- data_width Rx_Data_Width;
- Rx_Data_Width->desc = "Set the parallel data width of the serial-to-parallel converter";
- Rx_Data_Width->name = "Modem Rx Output Data Width";
- prbs_ctrl PRBS_Control;
- config_prbs_seed PRBS_Initial_State;
- config_prbs_poly PRBS_Polynomial;
- config_prbs_errmask PRBS_Error_Mask;
- stat_32_bits PRBS_Bit_Count;
- stat_32_errs PRBS_Error_Count;
- stat_32_lpf_acc LPF_Accum_F1;
- LPF_Accum_F1->name = "F1 PI Controller Accumulator";
- LPF_Accum_F1->desc = "Value of the F1 PI Controller Accumulator";
- stat_32_lpf_acc LPF_Accum_F2;
- LPF_Accum_F2->name = "F2 PI Controller Accumulator";
- LPF_Accum_F2->desc = "Value of the F2 PI Controller Accumulator";
- msk_stat_3 axis_xfer_count;
- rx_sample_discard Rx_Sample_Discard;
- lpf_config_2 LPF_Config_2;
- observation_data f1_nco_adjust;
- f1_nco_adjust->name = "F1 NCO Frequency Adjust";
- f1_nco_adjust->desc = "Frequency offet applied to the F1 NCO";
- f1_nco_adjust.data->name = "F1 NCO Frequency Adjust";
- f1_nco_adjust.data->desc = "Frequency offet applied to the F1 NCO";
- observation_data f2_nco_adjust;
- f2_nco_adjust->name = "F2 NCO Frequency Adjust";
- f2_nco_adjust->desc = "Frequency offet applied to the F2 NCO";
- f2_nco_adjust.data->name = "F2 NCO Frequency Adjust";
- f2_nco_adjust.data->desc = "Frequency offet applied to the F2 NCO";
- observation_data f1_error;
- f1_error->name = "F1 Error Value";
- f1_error->desc = "Error value of the F1 Costas loop after each active bit period";
- f1_error.data->name = "F1 Error Value";
- f1_error.data->desc = "Error value of the F1 Costas loop after each active bit period";
- observation_data f2_error;
- f2_error->name = "F2 Error Value";
- f2_error->desc = "Error value of the F2 Costas loop after each active bit period";
- f2_error.data->name = "F2 Error Value";
- f2_error.data->desc = "Error value of the F2 Costas loop after each active bit period";
- tx_sync_ctrl Tx_Sync_Ctrl;
- tx_sync_cnt Tx_Sync_Cnt;
- lowpass_ema_alpha lowpass_ema_alpha1;
- lowpass_ema_alpha lowpass_ema_alpha2;
- rx_power rx_power;
-
-};
-
-addrmap Pluto_MSK_Modem {
- msk_top_regs pluto_msk_regs @0x43C00000;
-};
diff --git a/rdl/msk_top_regs_desy.rdl b/rdl/msk_top_regs_desy.rdl
deleted file mode 100644
index 3204600..0000000
--- a/rdl/msk_top_regs_desy.rdl
+++ /dev/null
@@ -1,208 +0,0 @@
-reg msk_hash_lo {
- regwidth = 32;
- accesswidth = 32;
- field { sw = r; hw = na; } hash_id_lo[31:0] = 0xAAAA5555;
-};
-
-reg msk_hash_hi {
- regwidth = 32;
- accesswidth = 32;
- field { sw = r; hw = na; } hash_id_hi[31:0] = 0x5555AAAA;
-};
-
-reg msk_init {
- regwidth = 32;
- field { sw = rw; hw=r; } txrxinit = 1;
- field { sw = rw; hw=r; } txinit = 1;
- field { sw = rw; hw=r; } rxinit = 1;
-};
-
-reg msk_ctrl {
- regwidth = 32;
- field { sw = rw; hw = r; } ptt = 0;
- field { sw = rw; hw = r; } loopback_ena = 0;
- field { sw = rw; hw = r; } rx_invert = 0;
- field { sw = rw; hw = r; singlepulse = true; } clear_counts = 0;
- field { sw = rw; hw = r; } diff_encoder_loopback = 0;
-};
-
-reg msk_stat_0 {
- regwidth = 32;
- field { sw = r; hw = w; } demod_sync_lock=0;
- field { sw = r; hw = w; } tx_enable=0;
- field { sw = r; hw = w; } rx_enable=0;
- field { sw = r; hw = w; } tx_axis_valid=0;
-};
-
-reg msk_stat_1 {
- regwidth = 32;
- field { sw = r; hw = w; } tx_bit_counter[31:0] = 0;
-};
-
-reg msk_stat_2 {
- regwidth = 32;
- field { sw = r; hw = w; } tx_ena_counter[31:0] = 0;
-};
-
-reg config_nco_fw {
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
-};
-
-reg rx_sample_discard {
- regwidth = 32;
- field { sw = rw; hw = r; } rx_sample_discard[7:0] = 0;
- field { sw = rw; hw = r; } rx_nco_discard[15:8] = 0;
-};
-
-reg lpf_config_0 {
- regwidth = 32;
- field { sw = rw; hw = r; } lpf_freeze = 0;
- field { sw = rw; hw = r; } lpf_zero = 0;
- field { sw = w; hw = r; } prbs_reserved[7:2] = 0;
- field { sw = rw; hw = r; } lpf_alpha[31:8] = 0;
-};
-
-reg lpf_config_1 {
- regwidth = 32;
- field { sw = rw; hw = r; } i_gain[23:0] = 0;
- field { sw = rw; hw = r; } i_shift[31:24] = 0;
-};
-
-reg lpf_config_2 {
- regwidth = 32;
- field { sw = rw; hw = r; } p_gain[23:0] = 0;
- field { sw = rw; hw = r; } p_shift[31:24] = 0;
-};
-
-reg data_width {
- regwidth = 32;
- field { sw = rw; hw = r; } data_width[7:0] = 8;
-};
-
-reg prbs_ctrl {
- regwidth = 32;
- field { sw = rw; hw = r; } prbs_sel = 0;
- field { sw = w; hw = r; singlepulse = true; } prbs_error_insert = 0;
- field { sw = w; hw = r; singlepulse = true; } prbs_clear = 0;
- field { sw = w; hw = r; singlepulse = true; } prbs_manual_sync = 0;
- field { sw = w; hw = r; } prbs_reserved[15:4] = 0;
- field { sw = w; hw = r; } prbs_sync_threshold[31:16] = 0;
-};
-
-reg config_prbs_seed {
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
-};
-
-reg config_prbs_poly {
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
-};
-
-reg config_prbs_errmask {
- regwidth = 32;
- field { sw = rw; hw = r; } config_data[31:0] = 0;
-};
-
-reg stat_32_bits {
- regwidth = 32;
- field { sw = r; hw = w; } status_data[31:0] = 0;
-};
-
-reg stat_32_errs {
- regwidth = 32;
- field { sw = r; hw = w; } status_data[31:0] = 0;
-};
-
-reg stat_32_lpf_acc {
- regwidth = 32;
- field { sw = r; hw = w; } status_data[31:0] = 0;
-};
-
-reg msk_stat_3 {
- regwidth = 32;
- field { sw = r; hw = w; } xfer_count[31:0] = 0;
-};
-
-reg tx_sync_ctrl {
- regwidth = 32;
- field { sw = rw; hw = r; } tx_sync_ena = 0;
- field { sw = rw; hw = r; } tx_sync_force = 0;
- field { sw = rw; hw = r; } tx_sync_f1 = 0;
- field { sw = rw; hw = r; } tx_sync_f2 = 0;
-};
-
-reg tx_sync_cnt {
- regwidth = 32;
- field { sw = rw; hw = r; } tx_sync_cnt[23:0] = 0;
-};
-
-reg lowpass_ema_alpha {
- regwidth = 32;
- field { sw = rw; hw = r; } alpha[17:0] = 0;
-};
-
-reg rx_power {
- regwidth = 32;
- field { sw = r; hw = w; } rx_power[22:0] = 0;
-};
-
-field data32 {
- fieldwidth = 32;
- sw = r;
- hw = w;
-};
-
-reg observation_data {
- regwidth = 32;
- data32 data[31:0] = 0;
-};
-
-addrmap msk_top_regs {
- lsb0;
- default accesswidth=32;
- addressing=compact;
-
- desyrdl_interface = "AXI4L";
- desyrdl_access_channel = 0;
-
- msk_hash_lo Hash_ID_Low;
- msk_hash_hi Hash_ID_High;
- msk_init MSK_Init;
- msk_ctrl MSK_Control;
- msk_stat_0 MSK_Status;
- msk_stat_1 Tx_Bit_Count;
- msk_stat_2 Tx_Enable_Count;
- config_nco_fw Fb_FreqWord;
- config_nco_fw TX_F1_FreqWord;
- config_nco_fw TX_F2_FreqWord;
- config_nco_fw RX_F1_FreqWord;
- config_nco_fw RX_F2_FreqWord;
- lpf_config_0 LPF_Config_0;
- lpf_config_1 LPF_Config_1;
- data_width Tx_Data_Width;
- data_width Rx_Data_Width;
- prbs_ctrl PRBS_Control;
- config_prbs_seed PRBS_Initial_State;
- config_prbs_poly PRBS_Polynomial;
- config_prbs_errmask PRBS_Error_Mask;
- stat_32_bits PRBS_Bit_Count;
- stat_32_errs PRBS_Error_Count;
- stat_32_lpf_acc LPF_Accum_F1;
- stat_32_lpf_acc LPF_Accum_F2;
- msk_stat_3 axis_xfer_count;
- rx_sample_discard Rx_Sample_Discard;
- lpf_config_2 LPF_Config_2;
- observation_data f1_nco_adjust;
- observation_data f2_nco_adjust;
- observation_data f1_error;
- observation_data f2_error;
- tx_sync_ctrl Tx_Sync_Ctrl;
- tx_sync_cnt Tx_Sync_Cnt;
- lowpass_ema_alpha lowpass_ema_alpha1;
- lowpass_ema_alpha lowpass_ema_alpha2;
- rx_power rx_power;
-
-};
-
diff --git a/rdl/outputs/c-header/msk_top_regs.h b/rdl/outputs/c-header/msk_top_regs.h
new file mode 100644
index 0000000..1d89a4a
--- /dev/null
+++ b/rdl/outputs/c-header/msk_top_regs.h
@@ -0,0 +1,362 @@
+// Generated by PeakRDL-cheader - A free and open-source header generator
+// https://github.com/SystemRDL/PeakRDL-cheader
+
+#ifndef MSK_TOP_REGS_H
+#define MSK_TOP_REGS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+#include
+
+// Reg - msk_top_regs::msk_hash_lo
+#define MSK_TOP_REGS__MSK_HASH_LO__HASH_ID_LO_bm 0xffffffff
+#define MSK_TOP_REGS__MSK_HASH_LO__HASH_ID_LO_bp 0
+#define MSK_TOP_REGS__MSK_HASH_LO__HASH_ID_LO_bw 32
+#define MSK_TOP_REGS__MSK_HASH_LO__HASH_ID_LO_reset 0xaaaa5555
+
+// Reg - msk_top_regs::msk_hash_hi
+#define MSK_TOP_REGS__MSK_HASH_HI__HASH_ID_HI_bm 0xffffffff
+#define MSK_TOP_REGS__MSK_HASH_HI__HASH_ID_HI_bp 0
+#define MSK_TOP_REGS__MSK_HASH_HI__HASH_ID_HI_bw 32
+#define MSK_TOP_REGS__MSK_HASH_HI__HASH_ID_HI_reset 0x5555aaaa
+
+// Reg - msk_top_regs::msk_init
+#define MSK_TOP_REGS__MSK_INIT__TXRXINIT_bm 0x1
+#define MSK_TOP_REGS__MSK_INIT__TXRXINIT_bp 0
+#define MSK_TOP_REGS__MSK_INIT__TXRXINIT_bw 1
+#define MSK_TOP_REGS__MSK_INIT__TXRXINIT_reset 0x1
+#define MSK_TOP_REGS__MSK_INIT__TXINIT_bm 0x2
+#define MSK_TOP_REGS__MSK_INIT__TXINIT_bp 1
+#define MSK_TOP_REGS__MSK_INIT__TXINIT_bw 1
+#define MSK_TOP_REGS__MSK_INIT__TXINIT_reset 0x1
+#define MSK_TOP_REGS__MSK_INIT__RXINIT_bm 0x4
+#define MSK_TOP_REGS__MSK_INIT__RXINIT_bp 2
+#define MSK_TOP_REGS__MSK_INIT__RXINIT_bw 1
+#define MSK_TOP_REGS__MSK_INIT__RXINIT_reset 0x1
+
+// Reg - msk_top_regs::msk_ctrl
+#define MSK_TOP_REGS__MSK_CTRL__PTT_bm 0x1
+#define MSK_TOP_REGS__MSK_CTRL__PTT_bp 0
+#define MSK_TOP_REGS__MSK_CTRL__PTT_bw 1
+#define MSK_TOP_REGS__MSK_CTRL__PTT_reset 0x0
+#define MSK_TOP_REGS__MSK_CTRL__LOOPBACK_ENA_bm 0x2
+#define MSK_TOP_REGS__MSK_CTRL__LOOPBACK_ENA_bp 1
+#define MSK_TOP_REGS__MSK_CTRL__LOOPBACK_ENA_bw 1
+#define MSK_TOP_REGS__MSK_CTRL__LOOPBACK_ENA_reset 0x0
+#define MSK_TOP_REGS__MSK_CTRL__RX_INVERT_bm 0x4
+#define MSK_TOP_REGS__MSK_CTRL__RX_INVERT_bp 2
+#define MSK_TOP_REGS__MSK_CTRL__RX_INVERT_bw 1
+#define MSK_TOP_REGS__MSK_CTRL__RX_INVERT_reset 0x0
+#define MSK_TOP_REGS__MSK_CTRL__CLEAR_COUNTS_bm 0x8
+#define MSK_TOP_REGS__MSK_CTRL__CLEAR_COUNTS_bp 3
+#define MSK_TOP_REGS__MSK_CTRL__CLEAR_COUNTS_bw 1
+#define MSK_TOP_REGS__MSK_CTRL__CLEAR_COUNTS_reset 0x0
+#define MSK_TOP_REGS__MSK_CTRL__DIFF_ENCODER_LOOPBACK_bm 0x10
+#define MSK_TOP_REGS__MSK_CTRL__DIFF_ENCODER_LOOPBACK_bp 4
+#define MSK_TOP_REGS__MSK_CTRL__DIFF_ENCODER_LOOPBACK_bw 1
+#define MSK_TOP_REGS__MSK_CTRL__DIFF_ENCODER_LOOPBACK_reset 0x0
+
+// Reg - msk_top_regs::msk_stat_0
+#define MSK_TOP_REGS__MSK_STAT_0__DEMOD_SYNC_LOCK_bm 0x1
+#define MSK_TOP_REGS__MSK_STAT_0__DEMOD_SYNC_LOCK_bp 0
+#define MSK_TOP_REGS__MSK_STAT_0__DEMOD_SYNC_LOCK_bw 1
+#define MSK_TOP_REGS__MSK_STAT_0__DEMOD_SYNC_LOCK_reset 0x0
+#define MSK_TOP_REGS__MSK_STAT_0__TX_ENABLE_bm 0x2
+#define MSK_TOP_REGS__MSK_STAT_0__TX_ENABLE_bp 1
+#define MSK_TOP_REGS__MSK_STAT_0__TX_ENABLE_bw 1
+#define MSK_TOP_REGS__MSK_STAT_0__TX_ENABLE_reset 0x0
+#define MSK_TOP_REGS__MSK_STAT_0__RX_ENABLE_bm 0x4
+#define MSK_TOP_REGS__MSK_STAT_0__RX_ENABLE_bp 2
+#define MSK_TOP_REGS__MSK_STAT_0__RX_ENABLE_bw 1
+#define MSK_TOP_REGS__MSK_STAT_0__RX_ENABLE_reset 0x0
+#define MSK_TOP_REGS__MSK_STAT_0__TX_AXIS_VALID_bm 0x8
+#define MSK_TOP_REGS__MSK_STAT_0__TX_AXIS_VALID_bp 3
+#define MSK_TOP_REGS__MSK_STAT_0__TX_AXIS_VALID_bw 1
+#define MSK_TOP_REGS__MSK_STAT_0__TX_AXIS_VALID_reset 0x0
+
+// Reg - msk_top_regs::msk_stat_1
+#define MSK_TOP_REGS__MSK_STAT_1__TX_BIT_COUNTER_bm 0xffffffff
+#define MSK_TOP_REGS__MSK_STAT_1__TX_BIT_COUNTER_bp 0
+#define MSK_TOP_REGS__MSK_STAT_1__TX_BIT_COUNTER_bw 32
+
+// Reg - msk_top_regs::msk_stat_2
+#define MSK_TOP_REGS__MSK_STAT_2__TX_ENA_COUNTER_bm 0xffffffff
+#define MSK_TOP_REGS__MSK_STAT_2__TX_ENA_COUNTER_bp 0
+#define MSK_TOP_REGS__MSK_STAT_2__TX_ENA_COUNTER_bw 32
+#define MSK_TOP_REGS__MSK_STAT_2__TX_ENA_COUNTER_reset 0x0
+
+// Reg - msk_top_regs::config_nco_fw_desc_c4924cc6_name_0c494469
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_C4924CC6_NAME_0C494469__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::config_nco_fw_desc_94d7aaf5_name_84dd0c1c
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_94D7AAF5_NAME_84DD0C1C__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::config_nco_fw_desc_42134a4f_name_d97dbd51
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_42134A4F_NAME_D97DBD51__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::config_nco_fw_desc_16fb48c8_name_8d01a20d
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_16FB48C8_NAME_8D01A20D__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::config_nco_fw_desc_43c0828f_name_bdc60ecf
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_NCO_FW_DESC_43C0828F_NAME_BDC60ECF__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::lpf_config_0
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_FREEZE_bm 0x1
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_FREEZE_bp 0
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_FREEZE_bw 1
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_FREEZE_reset 0x0
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ZERO_bm 0x2
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ZERO_bp 1
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ZERO_bw 1
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ZERO_reset 0x0
+#define MSK_TOP_REGS__LPF_CONFIG_0__PRBS_RESERVED_bm 0xfc
+#define MSK_TOP_REGS__LPF_CONFIG_0__PRBS_RESERVED_bp 2
+#define MSK_TOP_REGS__LPF_CONFIG_0__PRBS_RESERVED_bw 6
+#define MSK_TOP_REGS__LPF_CONFIG_0__PRBS_RESERVED_reset 0x0
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ALPHA_bm 0xffffff00
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ALPHA_bp 8
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ALPHA_bw 24
+#define MSK_TOP_REGS__LPF_CONFIG_0__LPF_ALPHA_reset 0x0
+
+// Reg - msk_top_regs::lpf_config_1
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_GAIN_bm 0xffffff
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_GAIN_bp 0
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_GAIN_bw 24
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_GAIN_reset 0x0
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_SHIFT_bm 0xff000000
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_SHIFT_bp 24
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_SHIFT_bw 8
+#define MSK_TOP_REGS__LPF_CONFIG_1__I_SHIFT_reset 0x0
+
+// Reg - msk_top_regs::data_width_desc_58c848dd_name_2fbd8eba
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_bm 0xff
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_bp 0
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_bw 8
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_58C848DD_NAME_2FBD8EBA__DATA_WIDTH_reset 0x8
+
+// Reg - msk_top_regs::data_width_desc_6097df38_name_4609588b
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_bm 0xff
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_bp 0
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_bw 8
+#define MSK_TOP_REGS__DATA_WIDTH_DESC_6097DF38_NAME_4609588B__DATA_WIDTH_reset 0x8
+
+// Reg - msk_top_regs::prbs_ctrl
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SEL_bm 0x1
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SEL_bp 0
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SEL_bw 1
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SEL_reset 0x0
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_ERROR_INSERT_bm 0x2
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_ERROR_INSERT_bp 1
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_ERROR_INSERT_bw 1
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_ERROR_INSERT_reset 0x0
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_CLEAR_bm 0x4
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_CLEAR_bp 2
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_CLEAR_bw 1
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_CLEAR_reset 0x0
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_MANUAL_SYNC_bm 0x8
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_MANUAL_SYNC_bp 3
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_MANUAL_SYNC_bw 1
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_MANUAL_SYNC_reset 0x0
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_RESERVED_bm 0xfff0
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_RESERVED_bp 4
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_RESERVED_bw 12
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_RESERVED_reset 0x0
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SYNC_THRESHOLD_bm 0xffff0000
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SYNC_THRESHOLD_bp 16
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SYNC_THRESHOLD_bw 16
+#define MSK_TOP_REGS__PRBS_CTRL__PRBS_SYNC_THRESHOLD_reset 0x0
+
+// Reg - msk_top_regs::config_prbs_seed
+#define MSK_TOP_REGS__CONFIG_PRBS_SEED__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_PRBS_SEED__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_PRBS_SEED__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_PRBS_SEED__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::config_prbs_poly
+#define MSK_TOP_REGS__CONFIG_PRBS_POLY__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_PRBS_POLY__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_PRBS_POLY__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_PRBS_POLY__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::config_prbs_errmask
+#define MSK_TOP_REGS__CONFIG_PRBS_ERRMASK__CONFIG_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__CONFIG_PRBS_ERRMASK__CONFIG_DATA_bp 0
+#define MSK_TOP_REGS__CONFIG_PRBS_ERRMASK__CONFIG_DATA_bw 32
+#define MSK_TOP_REGS__CONFIG_PRBS_ERRMASK__CONFIG_DATA_reset 0x0
+
+// Reg - msk_top_regs::stat_32_bits
+#define MSK_TOP_REGS__STAT_32_BITS__STATUS_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__STAT_32_BITS__STATUS_DATA_bp 0
+#define MSK_TOP_REGS__STAT_32_BITS__STATUS_DATA_bw 32
+#define MSK_TOP_REGS__STAT_32_BITS__STATUS_DATA_reset 0x0
+
+// Reg - msk_top_regs::stat_32_errs
+#define MSK_TOP_REGS__STAT_32_ERRS__STATUS_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__STAT_32_ERRS__STATUS_DATA_bp 0
+#define MSK_TOP_REGS__STAT_32_ERRS__STATUS_DATA_bw 32
+#define MSK_TOP_REGS__STAT_32_ERRS__STATUS_DATA_reset 0x0
+
+// Reg - msk_top_regs::stat_32_lpf_acc_desc_8cebc7dc_name_f20c6670
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_bp 0
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_bw 32
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_8CEBC7DC_NAME_F20C6670__STATUS_DATA_reset 0x0
+
+// Reg - msk_top_regs::stat_32_lpf_acc_desc_dea6bd99_name_758fd0ce
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_bm 0xffffffff
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_bp 0
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_bw 32
+#define MSK_TOP_REGS__STAT_32_LPF_ACC_DESC_DEA6BD99_NAME_758FD0CE__STATUS_DATA_reset 0x0
+
+// Reg - msk_top_regs::msk_stat_3
+#define MSK_TOP_REGS__MSK_STAT_3__XFER_COUNT_bm 0xffffffff
+#define MSK_TOP_REGS__MSK_STAT_3__XFER_COUNT_bp 0
+#define MSK_TOP_REGS__MSK_STAT_3__XFER_COUNT_bw 32
+#define MSK_TOP_REGS__MSK_STAT_3__XFER_COUNT_reset 0x0
+
+// Reg - msk_top_regs::rx_sample_discard
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_bm 0xff
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_bp 0
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_bw 8
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_SAMPLE_DISCARD_reset 0x0
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_NCO_DISCARD_bm 0xff00
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_NCO_DISCARD_bp 8
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_NCO_DISCARD_bw 8
+#define MSK_TOP_REGS__RX_SAMPLE_DISCARD__RX_NCO_DISCARD_reset 0x0
+
+// Reg - msk_top_regs::lpf_config_2
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_GAIN_bm 0xffffff
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_GAIN_bp 0
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_GAIN_bw 24
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_GAIN_reset 0x0
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_SHIFT_bm 0xff000000
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_SHIFT_bp 24
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_SHIFT_bw 8
+#define MSK_TOP_REGS__LPF_CONFIG_2__P_SHIFT_reset 0x0
+
+// Reg - msk_top_regs::observation_data_data_0c017ef4_desc_64ff3689_name_d8ad3b25
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_bm 0xffffffff
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_bp 0
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_bw 32
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0C017EF4_DESC_64FF3689_NAME_D8AD3B25__DATA_reset 0x0
+
+// Reg - msk_top_regs::observation_data_data_0515efaa_desc_ebde6d39_name_2c154788
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_bm 0xffffffff
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_bp 0
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_bw 32
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_0515EFAA_DESC_EBDE6D39_NAME_2C154788__DATA_reset 0x0
+
+// Reg - msk_top_regs::observation_data_data_25a21249_desc_417e1c96_name_3b640507
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_bm 0xffffffff
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_bp 0
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_bw 32
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_25A21249_DESC_417E1C96_NAME_3B640507__DATA_reset 0x0
+
+// Reg - msk_top_regs::observation_data_data_272a00b6_desc_70869502_name_3de9a0d3
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_bm 0xffffffff
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_bp 0
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_bw 32
+#define MSK_TOP_REGS__OBSERVATION_DATA_DATA_272A00B6_DESC_70869502_NAME_3DE9A0D3__DATA_reset 0x0
+
+// Reg - msk_top_regs::tx_sync_ctrl
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_ENA_bm 0x1
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_ENA_bp 0
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_ENA_bw 1
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_ENA_reset 0x0
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_FORCE_bm 0x2
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_FORCE_bp 1
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_FORCE_bw 1
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_FORCE_reset 0x0
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F1_bm 0x4
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F1_bp 2
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F1_bw 1
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F1_reset 0x0
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F2_bm 0x8
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F2_bp 3
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F2_bw 1
+#define MSK_TOP_REGS__TX_SYNC_CTRL__TX_SYNC_F2_reset 0x0
+
+// Reg - msk_top_regs::tx_sync_cnt
+#define MSK_TOP_REGS__TX_SYNC_CNT__TX_SYNC_CNT_bm 0xffffff
+#define MSK_TOP_REGS__TX_SYNC_CNT__TX_SYNC_CNT_bp 0
+#define MSK_TOP_REGS__TX_SYNC_CNT__TX_SYNC_CNT_bw 24
+#define MSK_TOP_REGS__TX_SYNC_CNT__TX_SYNC_CNT_reset 0x0
+
+// Reg - msk_top_regs::lowpass_ema_alpha
+#define MSK_TOP_REGS__LOWPASS_EMA_ALPHA__ALPHA_bm 0x3ffff
+#define MSK_TOP_REGS__LOWPASS_EMA_ALPHA__ALPHA_bp 0
+#define MSK_TOP_REGS__LOWPASS_EMA_ALPHA__ALPHA_bw 18
+#define MSK_TOP_REGS__LOWPASS_EMA_ALPHA__ALPHA_reset 0x0
+
+// Reg - msk_top_regs::rx_power
+#define MSK_TOP_REGS__RX_POWER__RX_POWER_bm 0x7fffff
+#define MSK_TOP_REGS__RX_POWER__RX_POWER_bp 0
+#define MSK_TOP_REGS__RX_POWER__RX_POWER_bw 23
+#define MSK_TOP_REGS__RX_POWER__RX_POWER_reset 0x0
+
+// Addrmap - msk_top_regs
+typedef struct __attribute__ ((__packed__)) {
+ uint32_t Hash_ID_Low;
+ uint32_t Hash_ID_High;
+ uint32_t MSK_Init;
+ uint32_t MSK_Control;
+ uint32_t MSK_Status;
+ uint32_t Tx_Bit_Count;
+ uint32_t Tx_Enable_Count;
+ uint32_t Fb_FreqWord;
+ uint32_t TX_F1_FreqWord;
+ uint32_t TX_F2_FreqWord;
+ uint32_t RX_F1_FreqWord;
+ uint32_t RX_F2_FreqWord;
+ uint32_t LPF_Config_0;
+ uint32_t LPF_Config_1;
+ uint32_t Tx_Data_Width;
+ uint32_t Rx_Data_Width;
+ uint32_t PRBS_Control;
+ uint32_t PRBS_Initial_State;
+ uint32_t PRBS_Polynomial;
+ uint32_t PRBS_Error_Mask;
+ uint32_t PRBS_Bit_Count;
+ uint32_t PRBS_Error_Count;
+ uint32_t LPF_Accum_F1;
+ uint32_t LPF_Accum_F2;
+ uint32_t axis_xfer_count;
+ uint32_t Rx_Sample_Discard;
+ uint32_t LPF_Config_2;
+ uint32_t f1_nco_adjust;
+ uint32_t f2_nco_adjust;
+ uint32_t f1_error;
+ uint32_t f2_error;
+ uint32_t Tx_Sync_Ctrl;
+ uint32_t Tx_Sync_Cnt;
+ uint32_t lowpass_ema_alpha1;
+ uint32_t lowpass_ema_alpha2;
+ uint32_t rx_power;
+} msk_top_regs_t;
+
+
+static_assert(sizeof(msk_top_regs_t) == 0x90, "Packing error");
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MSK_TOP_REGS_H */
diff --git a/rdl/msk_top_regs.md b/rdl/outputs/docs/msk_top_regs.md
similarity index 87%
rename from rdl/msk_top_regs.md
rename to rdl/outputs/docs/msk_top_regs.md
index 79009bc..82c2c8d 100644
--- a/rdl/msk_top_regs.md
+++ b/rdl/outputs/docs/msk_top_regs.md
@@ -1,24 +1,15 @@
-## Pluto_MSK_Modem address map
+## msk_top_regs address map
- Absolute Address: 0x0
- Base Offset: 0x0
-- Size: 0x43C00090
-
-| Offset | Identifier | Name |
-|----------|--------------|-------------------|
-|0x43C00000|pluto_msk_regs|Pluto MSK Registers|
-
-## pluto_msk_regs address map
-
-- Absolute Address: 0x43C00000
-- Base Offset: 0x43C00000
- Size: 0x90
MSK Modem Configuration and Status Registers
@@ -27,8 +18,8 @@ Don't override. Generated from: Pluto_MSK_Modem
|------|------------------|-------------------------------------------------------------|
| 0x00 | Hash_ID_Low | Pluto MSK FPGA Hash ID - Lower 32-bits |
| 0x04 | Hash_ID_High | Pluto MSK FPGA Hash ID - Upper 32-bits |
-| 0x08 | MSK_Init | MSK Modem Control 0 |
-| 0x0C | MSK_Control | MSK Modem Control 1 |
+| 0x08 | MSK_Init | MSK Modem Initialization Control |
+| 0x0C | MSK_Control | MSK Modem Control |
| 0x10 | MSK_Status | MSK Modem Status 0 |
| 0x14 | Tx_Bit_Count | MSK Modem Status 1 |
| 0x18 | Tx_Enable_Count | MSK Modem Status 2 |
@@ -64,7 +55,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### Hash_ID_Low register
-- Absolute Address: 0x43C00000
+- Absolute Address: 0x0
- Base Offset: 0x0
- Size: 0x4
@@ -78,7 +69,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### Hash_ID_High register
-- Absolute Address: 0x43C00004
+- Absolute Address: 0x4
- Base Offset: 0x4
- Size: 0x4
@@ -92,7 +83,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### MSK_Init register
-- Absolute Address: 0x43C00008
+- Absolute Address: 0x8
- Base Offset: 0x8
- Size: 0x4
@@ -121,7 +112,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### MSK_Control register
-- Absolute Address: 0x43C0000C
+- Absolute Address: 0xC
- Base Offset: 0xC
- Size: 0x4
@@ -130,7 +121,7 @@ Don't override. Generated from: Pluto_MSK_Modem
|Bits| Identifier |Access|Reset| Name |
|----|---------------------|------|-----|-----------------------------------------------|
| 0 | ptt | rw | 0x0 | Push-to-Talk Enable |
-| 1 | loopback_ena | rw | 0x0 | Modem Loopback Enable |
+| 1 | loopback_ena | rw | 0x0 | Modem Digital Tx -> Rx Loopback Enable |
| 2 | rx_invert | rw | 0x0 | Rx Data Invert Enable |
| 3 | clear_counts | rw | 0x0 | Clear Status Counters |
| 4 |diff_encoder_loopback| rw | 0x0 |Differential Encoder -> Decoder Loopback Enable|
@@ -161,7 +152,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### MSK_Status register
-- Absolute Address: 0x43C00010
+- Absolute Address: 0x10
- Base Offset: 0x10
- Size: 0x4
@@ -195,7 +186,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### Tx_Bit_Count register
-- Absolute Address: 0x43C00014
+- Absolute Address: 0x14
- Base Offset: 0x14
- Size: 0x4
@@ -203,7 +194,7 @@ Don't override. Generated from: Pluto_MSK_Modem
|Bits| Identifier |Access|Reset| Name |
|----|--------------|------|-----|------------|
-|31:0|tx_bit_counter| r | 0x0 |Tx Bit Count|
+|31:0|tx_bit_counter| r | — |Tx Bit Count|
#### tx_bit_counter field
@@ -211,7 +202,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### Tx_Enable_Count register
-- Absolute Address: 0x43C00018
+- Absolute Address: 0x18
- Base Offset: 0x18
- Size: 0x4
@@ -227,7 +218,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### Fb_FreqWord register
-- Absolute Address: 0x43C0001C
+- Absolute Address: 0x1C
- Base Offset: 0x1C
- Size: 0x4
@@ -239,11 +230,12 @@ Don't override. Generated from: Pluto_MSK_Modem
#### config_data field
-Sets the center frequency of the NCO as FW = Fn * 2^32/Fs, where Fn is the desired NCO frequency, and Fs is the NCO sample rate
+Sets the center frequency of the NCO as FW = Fn * 2^32/Fs,
+where Fn is the desired NCO frequency, and Fs is the NCO sample rate
### TX_F1_FreqWord register
-- Absolute Address: 0x43C00020
+- Absolute Address: 0x20
- Base Offset: 0x20
- Size: 0x4
@@ -255,11 +247,12 @@ Don't override. Generated from: Pluto_MSK_Modem
#### config_data field
-Sets the center frequency of the NCO as FW = Fn * 2^32/Fs, where Fn is the desired NCO frequency, and Fs is the NCO sample rate
+Sets the center frequency of the NCO as FW = Fn * 2^32/Fs,
+where Fn is the desired NCO frequency, and Fs is the NCO sample rate
### TX_F2_FreqWord register
-- Absolute Address: 0x43C00024
+- Absolute Address: 0x24
- Base Offset: 0x24
- Size: 0x4
@@ -271,11 +264,12 @@ Don't override. Generated from: Pluto_MSK_Modem
#### config_data field
-Sets the center frequency of the NCO as FW = Fn * 2^32/Fs, where Fn is the desired NCO frequency, and Fs is the NCO sample rate
+Sets the center frequency of the NCO as FW = Fn * 2^32/Fs,
+where Fn is the desired NCO frequency, and Fs is the NCO sample rate
### RX_F1_FreqWord register
-- Absolute Address: 0x43C00028
+- Absolute Address: 0x28
- Base Offset: 0x28
- Size: 0x4
@@ -287,11 +281,12 @@ Don't override. Generated from: Pluto_MSK_Modem
#### config_data field
-Sets the center frequency of the NCO as FW = Fn * 2^32/Fs, where Fn is the desired NCO frequency, and Fs is the NCO sample rate
+Sets the center frequency of the NCO as FW = Fn * 2^32/Fs,
+where Fn is the desired NCO frequency, and Fs is the NCO sample rate
### RX_F2_FreqWord register
-- Absolute Address: 0x43C0002C
+- Absolute Address: 0x2C
- Base Offset: 0x2C
- Size: 0x4
@@ -303,11 +298,12 @@ Don't override. Generated from: Pluto_MSK_Modem
#### config_data field
-Sets the center frequency of the NCO as FW = Fn * 2^32/Fs, where Fn is the desired NCO frequency, and Fs is the NCO sample rate
+Sets the center frequency of the NCO as FW = Fn * 2^32/Fs,
+where Fn is the desired NCO frequency, and Fs is the NCO sample rate
### LPF_Config_0 register
-- Absolute Address: 0x43C00030
+- Absolute Address: 0x30
- Base Offset: 0x30
- Size: 0x4
@@ -317,7 +313,7 @@ Don't override. Generated from: Pluto_MSK_Modem
|----|-------------|------|-----|--------------------------------------|
| 0 | lpf_freeze | rw | 0x0 |Freeze the accumulator's current value|
| 1 | lpf_zero | rw | 0x0 | Hold the PI Accumulator at zero |
-| 7:2|prbs_reserved| w | 0x0 | — |
+| 7:2|prbs_reserved| rw | 0x0 | Reserved |
|31:8| lpf_alpha | rw | 0x0 | Lowpass IIR filter alpha |
#### lpf_freeze field
@@ -336,7 +332,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### LPF_Config_1 register
-- Absolute Address: 0x43C00034
+- Absolute Address: 0x34
- Base Offset: 0x34
- Size: 0x4
@@ -357,7 +353,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### Tx_Data_Width register
-- Absolute Address: 0x43C00038
+- Absolute Address: 0x38
- Base Offset: 0x38
- Size: 0x4
@@ -373,7 +369,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### Rx_Data_Width register
-- Absolute Address: 0x43C0003C
+- Absolute Address: 0x3C
- Base Offset: 0x3C
- Size: 0x4
@@ -389,7 +385,7 @@ Don't override. Generated from: Pluto_MSK_Modem
### PRBS_Control register
-- Absolute Address: 0x43C00040
+- Absolute Address: 0x40
- Base Offset: 0x40
- Size: 0x4
@@ -401,8 +397,8 @@ Don't override. Generated from: Pluto_MSK_Modem
| 1 | prbs_error_insert | w | 0x0 | PRBS Error Insert |
| 2 | prbs_clear | w | 0x0 | PRBS Clear Counters |
| 3 | prbs_manual_sync | w | 0x0 | PRBS Manual Sync |
-| 15:4| prbs_reserved | w | 0x0 | — |
-|31:16|prbs_sync_threshold| w | 0x0 |PRBS Auto Sync Threshold|
+| 15:4| prbs_reserved | rw | 0x0 | Reserved |
+|31:16|prbs_sync_threshold| rw | 0x0 |PRBS Auto Sync Threshold|
#### prbs_sel field
@@ -431,7 +427,7 @@ N > 0 : Auto sync after N errors
### PRBS_Initial_State register
-- Absolute Address: 0x43C00044
+- Absolute Address: 0x44
- Base Offset: 0x44
- Size: 0x4
@@ -447,7 +443,7 @@ N > 0 : Auto sync after N errors
### PRBS_Polynomial register
-- Absolute Address: 0x43C00048
+- Absolute Address: 0x48
- Base Offset: 0x48
- Size: 0x4
@@ -463,7 +459,7 @@ N > 0 : Auto sync after N errors
### PRBS_Error_Mask register
-- Absolute Address: 0x43C0004C
+- Absolute Address: 0x4C
- Base Offset: 0x4C
- Size: 0x4
@@ -479,7 +475,7 @@ N > 0 : Auto sync after N errors
### PRBS_Bit_Count register
-- Absolute Address: 0x43C00050
+- Absolute Address: 0x50
- Base Offset: 0x50
- Size: 0x4
@@ -496,7 +492,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### PRBS_Error_Count register
-- Absolute Address: 0x43C00054
+- Absolute Address: 0x54
- Base Offset: 0x54
- Size: 0x4
@@ -513,7 +509,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### LPF_Accum_F1 register
-- Absolute Address: 0x43C00058
+- Absolute Address: 0x58
- Base Offset: 0x58
- Size: 0x4
@@ -529,7 +525,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### LPF_Accum_F2 register
-- Absolute Address: 0x43C0005C
+- Absolute Address: 0x5C
- Base Offset: 0x5C
- Size: 0x4
@@ -545,7 +541,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### axis_xfer_count register
-- Absolute Address: 0x43C00060
+- Absolute Address: 0x60
- Base Offset: 0x60
- Size: 0x4
@@ -561,7 +557,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### Rx_Sample_Discard register
-- Absolute Address: 0x43C00064
+- Absolute Address: 0x64
- Base Offset: 0x64
- Size: 0x4
@@ -582,7 +578,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### LPF_Config_2 register
-- Absolute Address: 0x43C00068
+- Absolute Address: 0x68
- Base Offset: 0x68
- Size: 0x4
@@ -603,7 +599,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### f1_nco_adjust register
-- Absolute Address: 0x43C0006C
+- Absolute Address: 0x6C
- Base Offset: 0x6C
- Size: 0x4
@@ -619,7 +615,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### f2_nco_adjust register
-- Absolute Address: 0x43C00070
+- Absolute Address: 0x70
- Base Offset: 0x70
- Size: 0x4
@@ -635,7 +631,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### f1_error register
-- Absolute Address: 0x43C00074
+- Absolute Address: 0x74
- Base Offset: 0x74
- Size: 0x4
@@ -651,7 +647,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### f2_error register
-- Absolute Address: 0x43C00078
+- Absolute Address: 0x78
- Base Offset: 0x78
- Size: 0x4
@@ -667,7 +663,7 @@ BER can be calculated as the ratio of received bits to errored-bits
### Tx_Sync_Ctrl register
-- Absolute Address: 0x43C0007C
+- Absolute Address: 0x7C
- Base Offset: 0x7C
- Size: 0x4
@@ -706,7 +702,7 @@ Both F1 and F2 can be enabled at the same time
### Tx_Sync_Cnt register
-- Absolute Address: 0x43C00080
+- Absolute Address: 0x80
- Base Offset: 0x80
- Size: 0x4
@@ -718,11 +714,13 @@ Both F1 and F2 can be enabled at the same time
#### tx_sync_cnt field
-Value from 0x00_0000 to 0xFF_FFFF. This value represents the number bit-times the synchronization signal should be sent after PTT is asserted.
+Value from 0x00_0000 to 0xFF_FFFF.
+This value represents the number bit-times the synchronization
+signal should be sent after PTT is asserted.
### lowpass_ema_alpha1 register
-- Absolute Address: 0x43C00084
+- Absolute Address: 0x84
- Base Offset: 0x84
- Size: 0x4
@@ -738,7 +736,7 @@ Both F1 and F2 can be enabled at the same time
### lowpass_ema_alpha2 register
-- Absolute Address: 0x43C00088
+- Absolute Address: 0x88
- Base Offset: 0x88
- Size: 0x4
@@ -754,7 +752,7 @@ Both F1 and F2 can be enabled at the same time
### rx_power register
-- Absolute Address: 0x43C0008C
+- Absolute Address: 0x8C
- Base Offset: 0x8C
- Size: 0x4
diff --git a/rdl/msk_top_regs.pdf b/rdl/outputs/docs/msk_top_regs.pdf
similarity index 60%
rename from rdl/msk_top_regs.pdf
rename to rdl/outputs/docs/msk_top_regs.pdf
index e4168d0f15b62638c9812e54a8f3d6db62257574..59a0dda50a5bcf17e93d29e926658db1bd86b449 100644
GIT binary patch
delta 44201
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