soc.py: cleanup CSR generation
This commit is contained in:
parent
92a140d736
commit
e6c57ffa63
135
firmware/soc.py
135
firmware/soc.py
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue