soc.py: cleanup CSR generation

This commit is contained in:
Peter McGoron 2023-04-08 17:31:12 +00:00
parent 92a140d736
commit e6c57ffa63
1 changed files with 63 additions and 72 deletions

View File

@ -58,90 +58,81 @@ class Base(Module, AutoCSR):
keyword arguments to pass all the arguments. keyword arguments to pass all the arguments.
""" """
def _make_csr(self, name, csrclass, csrlen, description, num=None):
""" Add a CSR for a pin `f"{name_{num}"` with CSR type
`csrclass`. This will automatically handle the `i_` and
`o_` prefix in the keyword arguments.
"""
if header_name not in self.csrset:
self.csrdict[name] = csrlen
if num is not None:
name = f"{name}_{num}"
csr = csrclass(csrlen, name=name, description=description)
setattr(self, name, csr)
if csrclass is CSRStorage:
self.kwargs[f'i_{name}'] = csr.storage
elif csrclass is CSRStatus:
self.kwargs[f'o_{name}'] = csr.status
else:
raise Exception(f"Unknown class {csrclass}")
def __init__(self, clk, sdram, platform): def __init__(self, clk, sdram, platform):
kwargs = {} self.kwargs = {}
self.csrdict = {}
for i in range(0,8): for i in range(0,8):
setattr(self, f"dac_sel_{i}", CSRStorage(3, name=f"dac_sel_{i}", description=f"Select DAC {i} Output")) self._make_csr("dac_sel", CSRStorage, 3, f"Select DAC {i} Output", num=i)
kwargs[f"i_dac_sel_{i}"] = getattr(self, f"dac_sel_{i}").storage self._make_csr("dac_finished", CSRStatus, 1, f"DAC {i} Transmission Finished Flag", num=i)
self._make_csr("dac_arm", CSRStorage, 1, f"DAC {i} Arm Flag", num=i)
setattr(self, f"dac_finished_{i}", CSRStatus(1, name=f"dac_finished_{i}", description=f"DAC {i} Transmission Finished Flag")) self._make_csr("from_dac", CSRStatus, 24, f"DAC {i} Received Data", num=i)
kwargs[f"o_dac_finished_{i}"] = getattr(self, f"dac_finished_{i}").status self._make_csr("to_dac", CSRStorage, 24, f"DAC {i} Data to Send", num=i)
self._make_csr("wf_arm", CSRStorage, 1, f"Waveform {i} Arm Flag", num=i)
setattr(self, f"dac_arm_{i}", CSRStorage(1, name=f"dac_arm_{i}", description=f"DAC {i} Arm Flag")) self._make_csr("wf_halt_on_finish", CSRStorage, 1, f"Waveform {i} Halt on Finish Flag", num=i)
kwargs[f"i_dac_arm_{i}"] = getattr(self, f"dac_arm_{i}").storage self._make_csr("wf_finished", CSRStatus, 1, f"Waveform {i} Finished Flag", num=i)
self._make_csr("wf_running", CSRStatus, 1, f"Waveform {i} Running Flag", num=i)
setattr(self, f"from_dac_{i}", CSRStatus(24, name=f"from_dac_{i}", description=f"DAC {i} Received Data")) self._make_csr("wf_time_to_wait", CSRStorage, 16, f"Waveform {i} Wait Time", num=i)
kwargs[f"o_from_dac_{i}"] = getattr(self, f"from_dac_{i}").status self._make_csr("wf_refresh_start", CSRStorage, 1, f"Waveform {i} Data Refresh Start Flag", num=i)
self._make_csr("wf_refresh_finished", CSRStatus, 1, f"Waveform {i} Data Refresh Finished Flag", num=i)
setattr(self, f"to_dac_{i}", CSRStorage(24, name=f"to_dac_{i}", description=f"DAC {i} Data to Send")) self._make_csr("wf_start_addr", CSRStorage, 32, f"Waveform {i} Data Addr", num=i)
kwargs[f"i_to_dac_{i}"] = getattr(self, f"to_dac_{i}").storage
setattr(self, f"wf_arm_{i}", CSRStorage(1, name=f"wf_arm_{i}", description=f"Waveform {i} Arm Flag"))
kwargs[f"i_wf_arm_{i}"] = getattr(self, f"wf_arm_{i}").storage
setattr(self, f"wf_halt_on_finish_{i}", CSRStorage(1, name=f"wf_halt_on_finish_{i}", description=f"Waveform {i} Halt on Finish Flag"))
kwargs[f"i_wf_halt_on_finish_{i}"] = getattr(self, f"wf_halt_on_finish_{i}").storage
setattr(self, f"wf_finished_{i}", CSRStatus(1, name=f"wf_finished_{i}", description=f"Waveform {i} Finished Flag"))
kwargs[f"o_wf_finished_{i}"] = getattr(self, f"wf_finished_{i}").status
setattr(self, f"wf_running_{i}", CSRStatus(1, name=f"wf_running_{i}", description=f"Waveform {i} Running Flag"))
kwargs[f"o_wf_running_{i}"] = getattr(self, f"wf_running_{i}").status
setattr(self, f"wf_time_to_wait_{i}", CSRStorage(16, name=f"wf_time_to_wait_{i}", description=f"Waveform {i} Wait Time"))
kwargs[f"i_wf_time_to_wait_{i}"] = getattr(self, f"wf_time_to_wait_{i}").storage
setattr(self, f"wf_refresh_start_{i}", CSRStorage(1, name=f"wf_refresh_start_{i}", description=f"Waveform {i} Data Refresh Start Flag"))
kwargs[f"i_wf_refresh_start_{i}"] = getattr(self, f"wf_refresh_start_{i}").storage
setattr(self, f"wf_refresh_finished_{i}", CSRStatus(1, name=f"wf_refresh_finished_{i}", description=f"Waveform {i} Data Refresh Finished Flag"))
kwargs[f"o_wf_refresh_finished_{i}"] = getattr(self, f"wf_refresh_finished_{i}").status
setattr(self, f"wf_start_addr_{i}", CSRStorage(32, name=f"wf_start_addr_{i}", description=f"Waveform {i} Data Addr"))
kwargs[f"i_wf_start_addr_{i}"] = getattr(self, f"wf_start_addr_{i}").storage
port = sdram.crossbar.get_port() port = sdram.crossbar.get_port()
setattr(self, f"wf_sdram_{i}", LiteDRAMDMAReader(port)) setattr(self, f"wf_sdram_{i}", LiteDRAMDMAReader(port))
cur_sdram = getattr(self, f"wf_sdram_{i}") cur_sdram = getattr(self, f"wf_sdram_{i}")
kwargs[f"o_wf_ram_dma_addr_{i}"] = cur_sdram.sink.address
kwargs[f"i_wf_ram_word_{i}"] = cur_sdram.source.data
kwargs[f"o_wf_ram_read_{i}"] = cur_sdram.sink.valid
kwargs[f"i_wf_ram_valid_{i}"] = cur_sdram.source.valid
setattr(self, f"adc_finished_{i}", CSRStatus(1, name=f"adc_finished_{i}", description=f"ADC {i} Finished Flag")) self.kwargs[f"o_wf_ram_dma_addr_{i}"] = cur_sdram.sink.address
kwargs[f"o_adc_finished_{i}"] = getattr(self, f"adc_finished_{i}").status self.kwargs[f"i_wf_ram_word_{i}"] = cur_sdram.source.data
self.kwargs[f"o_wf_ram_read_{i}"] = cur_sdram.sink.valid
self.kwargs[f"i_wf_ram_valid_{i}"] = cur_sdram.source.valid
setattr(self, f"adc_arm_{i}", CSRStorage(1, name=f"adc_arm_{i}", description=f"ADC {i} Arm Flag")) self._make_csr("adc_finished", CSRStatus, 1, f"ADC {i} Finished Flag", num=i)
kwargs[f"i_adc_arm_{i}"] = getattr(self, f"adc_arm_{i}").storage self._make_csr("adc_arm", CSRStorage, 1, f"ADC {i} Arm Flag", num=i)
self._make_csr("from_adc", CSRStatus, 32, f"ADC {i} Received Data", num=i)
setattr(self, f"from_adc_{i}", CSRStatus(32, name=f"from_adc_{i}", description=f"ADC {i} Received Data")) self._make_csr("adc_sel_0", CSRStorage, 2, "Select ADC 0 Output")
kwargs[f"o_from_adc_{i}"] = getattr(self, f"from_adc_{i}").status self._make_csr("cl_in_loop", CSRStatus, 1, "Control Loop Loop Enabled Flag")
self._make_csr("cl_cmd", CSRStorage, 8, "Control Loop Command Input")
self._make_csr("cl_word_in", CSRStorage, 64, "Control Loop Data Input")
self._make_csr("cl_word_out", CSRStatus, 64, "Control Loop Data Output")
self._make_csr("cl_start_cmd", CSRStorage, 1, "Control Loop Command Start Flag")
self._make_csr("cl_finish_cmd", CSRStatus, 1, "Control Loop Command Finished Flag")
self.adc_sel_0 = CSRStorage(2, description=f"Select ADC 0 Output") self.kwargs["i_clk"] = clk
kwargs["i_adc_sel_0"] = self.adc_sel_0.storage self.kwargs["i_dac_miso"] = platform.request("dac_miso")
self.cl_in_loop = CSRStatus(1, description="Control Loop Loop Enabled Flag") self.kwargs["o_dac_mosi"] = platform.request("dac_mosi")
kwargs["o_cl_in_loop"] = self.cl_in_loop.status self.kwargs["o_dac_sck"] = platform.request("dac_sck")
self.cl_cmd = CSRStorage(8, description="Control Loop Command Input") self.kwargs["o_dac_ss_L"] = platform.request("dac_ss_L")
kwargs["i_cl_cmd"] = self.cl_cmd.storage self.kwargs["o_adc_conv"] = platform.request("adc_conv")
self.cl_word_in = CSRStorage(64, description="Control Loop Data Input") self.kwargs["i_adc_sdo"] = platform.request("adc_sdo")
kwargs["i_cl_word_in"] = self.cl_word_in.storage self.kwargs["o_adc_sck"] = platform.request("adc_sck")
self.cl_word_out = CSRStatus(64, description="Control Loop Data Output")
kwargs["o_cl_word_out"] = self.cl_word_out.status with f as open("io_widths.h", mode='w'):
self.cl_start_cmd = CSRStorage(1, description="Control Loop Command Start Flag") print('#pragma once', file=f)
kwargs["i_cl_start_cmd"] = self.cl_start_cmd.storage for key in self.csrdict:
self.cl_finish_cmd = CSRStatus(1, description="Control Loop Command Finished Flag") print(f'#define {key.upper()}_LEN {self.csrdict[key]}', file=f)
kwargs["o_cl_finish_cmd"] = self.cl_finish_cmd.status
kwargs["i_clk"] = clk
kwargs["i_dac_miso"] = platform.request("dac_miso")
kwargs["o_dac_mosi"] = platform.request("dac_mosi")
kwargs["o_dac_sck"] = platform.request("dac_sck")
kwargs["o_dac_ss_L"] = platform.request("dac_ss_L")
kwargs["o_adc_conv"] = platform.request("adc_conv")
kwargs["i_adc_sdo"] = platform.request("adc_sdo")
kwargs["o_adc_sck"] = platform.request("adc_sck")
self.specials += Instance("base", **kwargs) self.specials += Instance("base", **kwargs)
# Clock and Reset Generator # Clock and Reset Generator