Skip to content

Commit

Permalink
Convert to new CSR API
Browse files Browse the repository at this point in the history
  • Loading branch information
Sebastien Bourdeauducq committed Mar 30, 2013
1 parent caa19f9 commit 4f4f260
Show file tree
Hide file tree
Showing 16 changed files with 108 additions and 120 deletions.
10 changes: 5 additions & 5 deletions cif.py
Expand Up @@ -45,13 +45,13 @@ def _get_rw_functions(reg_name, reg_base, size):


def get_csr_header(csr_base, bank_array, interrupt_map): def get_csr_header(csr_base, bank_array, interrupt_map):
r = "#ifndef __HW_CSR_H\n#define __HW_CSR_H\n#include <hw/common.h>\n" r = "#ifndef __HW_CSR_H\n#define __HW_CSR_H\n#include <hw/common.h>\n"
for name, rmap in bank_array.banks: for name, csrs, mapaddr, rmap in bank_array.banks:
r += "\n/* "+name+" */\n" r += "\n/* "+name+" */\n"
reg_base = csr_base + 0x800*rmap.address reg_base = csr_base + 0x800*mapaddr
r += "#define "+name.upper()+"_BASE "+hex(reg_base)+"\n" r += "#define "+name.upper()+"_BASE "+hex(reg_base)+"\n"
for register in rmap.description: for csr in csrs:
nr = (register.get_size() + 7)//8 nr = (csr.size + 7)//8
r += _get_rw_functions(name + "_" + register.name, reg_base, nr) r += _get_rw_functions(name + "_" + csr.name, reg_base, nr)
reg_base += 4*nr reg_base += 4*nr
try: try:
interrupt_nr = interrupt_map[name] interrupt_nr = interrupt_map[name]
Expand Down
22 changes: 10 additions & 12 deletions milkymist/asmiprobe/__init__.py
Expand Up @@ -6,26 +6,24 @@ class ASMIprobe(Module):
def __init__(self, hub, trace_depth=16): def __init__(self, hub, trace_depth=16):
slots = hub.get_slots() slots = hub.get_slots()
slot_count = len(slots) slot_count = len(slots)
assert(trace_depth < 256)
assert(slot_count < 256)


self._slot_count = RegisterField(8, READ_ONLY, WRITE_ONLY) self._slot_count = CSRStatus(bits_for(slot_count))
self._trace_depth = RegisterField(8, READ_ONLY, WRITE_ONLY) self._trace_depth = CSRStatus(bits_for(trace_depth))
self._slot_status = [RegisterField(2, READ_ONLY, WRITE_ONLY, name="slot_status" + str(i)) for i in range(slot_count)] self._slot_status = [CSRStatus(2, name="slot_status" + str(i)) for i in range(slot_count)]
self._trace = [RegisterField(8, READ_ONLY, WRITE_ONLY, name="trace" + str(i)) for i in range(trace_depth)] self._trace = [CSRStatus(bits_for(slot_count-1), name="trace" + str(i)) for i in range(trace_depth)]


### ###


self.comb += [ self.comb += [
self._slot_count.field.w.eq(slot_count), self._slot_count.status.eq(slot_count),
self._trace_depth.field.w.eq(trace_depth) self._trace_depth.status.eq(trace_depth)
] ]
for slot, status in zip(slots, self._slot_status): for slot, status in zip(slots, self._slot_status):
self.comb += status.field.w.eq(slot.state) self.sync += status.status.eq(slot.state)
shift_tags = [self._trace[n].field.w.eq(self._trace[n+1].field.w) shift_tags = [self._trace[n].status.eq(self._trace[n+1].status)
for n in range(len(self._trace) - 1)] for n in range(len(self._trace) - 1)]
shift_tags.append(self._trace[-1].field.w.eq(hub.tag_call)) shift_tags.append(self._trace[-1].status.eq(hub.tag_call))
self.sync += If(hub.call, *shift_tags) self.sync += If(hub.call, *shift_tags)


def get_registers(self): def get_csrs(self):
return [self._slot_count, self._trace_depth] + self._slot_status + self._trace return [self._slot_count, self._trace_depth] + self._slot_status + self._trace
52 changes: 21 additions & 31 deletions milkymist/dfii/__init__.py
Expand Up @@ -3,55 +3,45 @@
from migen.bus import dfi from migen.bus import dfi
from migen.bank.description import * from migen.bank.description import *


class PhaseInjector(Module, AutoReg): class PhaseInjector(Module, AutoCSR):
def __init__(self, phase): def __init__(self, phase):
self._cs = Field(1, WRITE_ONLY, READ_ONLY) self._command = CSRStorage(6) # cs, we, cas, ras, wren, rden
self._we = Field(1, WRITE_ONLY, READ_ONLY) self._command_issue = CSR()
self._cas = Field(1, WRITE_ONLY, READ_ONLY) self._address = CSRStorage(len(phase.address))
self._ras = Field(1, WRITE_ONLY, READ_ONLY) self._baddress = CSRStorage(len(phase.bank))
self._wren = Field(1, WRITE_ONLY, READ_ONLY) self._wrdata = CSRStorage(len(phase.wrdata))
self._rden = Field(1, WRITE_ONLY, READ_ONLY) self._rddata = CSRStatus(len(phase.rddata))
self._command = RegisterFields(self._cs, self._we, self._cas, self._ras, self._wren, self._rden)
self._command_issue = RegisterRaw()

self._address = RegisterField(len(phase.address))
self._baddress = RegisterField(len(phase.bank))

self._wrdata = RegisterField(len(phase.wrdata))
self._rddata = RegisterField(len(phase.rddata), READ_ONLY, WRITE_ONLY)


### ###


self.comb += [ self.comb += [
If(self._command_issue.re, If(self._command_issue.re,
phase.cs_n.eq(~self._cs.r), phase.cs_n.eq(~self._command.storage[0]),
phase.we_n.eq(~self._we.r), phase.we_n.eq(~self._command.storage[1]),
phase.cas_n.eq(~self._cas.r), phase.cas_n.eq(~self._command.storage[2]),
phase.ras_n.eq(~self._ras.r) phase.ras_n.eq(~self._command.storage[3])
).Else( ).Else(
phase.cs_n.eq(1), phase.cs_n.eq(1),
phase.we_n.eq(1), phase.we_n.eq(1),
phase.cas_n.eq(1), phase.cas_n.eq(1),
phase.ras_n.eq(1) phase.ras_n.eq(1)
), ),
phase.address.eq(self._address.field.r), phase.address.eq(self._address.storage),
phase.bank.eq(self._baddress.field.r), phase.bank.eq(self._baddress.storage),
phase.wrdata_en.eq(self._command_issue.re & self._wren.r), phase.wrdata_en.eq(self._command_issue.re & self._command.storage[4]),
phase.rddata_en.eq(self._command_issue.re & self._rden.r), phase.rddata_en.eq(self._command_issue.re & self._command.storage[5]),
phase.wrdata.eq(self._wrdata.field.r), phase.wrdata.eq(self._wrdata.storage),
phase.wrdata_mask.eq(0) phase.wrdata_mask.eq(0)
] ]
self.sync += If(phase.rddata_valid, self._rddata.field.w.eq(phase.rddata)) self.sync += If(phase.rddata_valid, self._rddata.status.eq(phase.rddata))


class DFIInjector(Module, AutoReg): class DFIInjector(Module, AutoCSR):
def __init__(self, a, ba, d, nphases=1): def __init__(self, a, ba, d, nphases=1):
inti = dfi.Interface(a, ba, d, nphases) inti = dfi.Interface(a, ba, d, nphases)
self.slave = dfi.Interface(a, ba, d, nphases) self.slave = dfi.Interface(a, ba, d, nphases)
self.master = dfi.Interface(a, ba, d, nphases) self.master = dfi.Interface(a, ba, d, nphases)


self._sel = Field() self._control = CSRStorage(2) # sel, cke
self._cke = Field()
self._control = RegisterFields(self._sel, self._cke)


for n, phase in enumerate(inti.phases): for n, phase in enumerate(inti.phases):
setattr(self.submodules, "pi" + str(n), PhaseInjector(phase)) setattr(self.submodules, "pi" + str(n), PhaseInjector(phase))
Expand All @@ -60,5 +50,5 @@ def __init__(self, a, ba, d, nphases=1):


connect_inti = dfi.interconnect_stmts(inti, self.master) connect_inti = dfi.interconnect_stmts(inti, self.master)
connect_slave = dfi.interconnect_stmts(self.slave, self.master) connect_slave = dfi.interconnect_stmts(self.slave, self.master)
self.comb += If(self._sel.r, *connect_slave).Else(*connect_inti) self.comb += If(self._control.storage[0], *connect_slave).Else(*connect_inti)
self.comb += [phase.cke.eq(self._cke.r) for phase in inti.phases] self.comb += [phase.cke.eq(self._control.storage[1]) for phase in inti.phases]
2 changes: 1 addition & 1 deletion milkymist/dvisampler/__init__.py
Expand Up @@ -10,7 +10,7 @@
from milkymist.dvisampler.chansync import ChanSync from milkymist.dvisampler.chansync import ChanSync
from milkymist.dvisampler.resdetection import ResolutionDetection from milkymist.dvisampler.resdetection import ResolutionDetection


class DVISampler(Module, AutoReg): class DVISampler(Module, AutoCSR):
def __init__(self, pads): def __init__(self, pads):
self.submodules.edid = EDID(pads) self.submodules.edid = EDID(pads)
self.submodules.clocking = Clocking(pads) self.submodules.clocking = Clocking(pads)
Expand Down
6 changes: 3 additions & 3 deletions milkymist/dvisampler/chansync.py
Expand Up @@ -8,12 +8,12 @@


from milkymist.dvisampler.common import channel_layout from milkymist.dvisampler.common import channel_layout


class ChanSync(Module, AutoReg): class ChanSync(Module, AutoCSR):
def __init__(self, nchan=3, depth=8): def __init__(self, nchan=3, depth=8):
self.valid_i = Signal() self.valid_i = Signal()
self.chan_synced = Signal() self.chan_synced = Signal()


self._r_channels_synced = RegisterField(1, READ_ONLY, WRITE_ONLY) self._r_channels_synced = CSRStatus()


lst_control_starts = [] lst_control_starts = []
all_control_starts = Signal() all_control_starts = Signal()
Expand Down Expand Up @@ -49,4 +49,4 @@ def __init__(self, nchan=3, depth=8):
self.sync.pix += If(~self.valid_i, self.sync.pix += If(~self.valid_i,
self.chan_synced.eq(0) self.chan_synced.eq(0)
).Elif(all_control_starts, self.chan_synced.eq(1)) ).Elif(all_control_starts, self.chan_synced.eq(1))
self.specials += MultiReg(self.chan_synced, self._r_channels_synced.field.w) self.specials += MultiReg(self.chan_synced, self._r_channels_synced.status)
10 changes: 5 additions & 5 deletions milkymist/dvisampler/charsync.py
Expand Up @@ -6,14 +6,14 @@


from milkymist.dvisampler.common import control_tokens from milkymist.dvisampler.common import control_tokens


class CharSync(Module, AutoReg): class CharSync(Module, AutoCSR):
def __init__(self, required_controls=8): def __init__(self, required_controls=8):
self.raw_data = Signal(10) self.raw_data = Signal(10)
self.synced = Signal() self.synced = Signal()
self.data = Signal(10) self.data = Signal(10)


self._r_char_synced = RegisterField(1, READ_ONLY, WRITE_ONLY) self._r_char_synced = CSRStatus()
self._r_ctl_pos = RegisterField(bits_for(9), READ_ONLY, WRITE_ONLY) self._r_ctl_pos = CSRStatus(bits_for(9))


### ###


Expand Down Expand Up @@ -48,7 +48,7 @@ def __init__(self, required_controls=8):
), ),
previous_control_position.eq(control_position) previous_control_position.eq(control_position)
] ]
self.specials += MultiReg(self.synced, self._r_char_synced.field.w) self.specials += MultiReg(self.synced, self._r_char_synced.status)
self.specials += MultiReg(word_sel, self._r_ctl_pos.field.w) self.specials += MultiReg(word_sel, self._r_ctl_pos.status)


self.sync.pix += self.data.eq(raw >> word_sel) self.sync.pix += self.data.eq(raw >> word_sel)
10 changes: 5 additions & 5 deletions milkymist/dvisampler/clocking.py
Expand Up @@ -4,10 +4,10 @@
from migen.genlib.cdc import MultiReg from migen.genlib.cdc import MultiReg
from migen.bank.description import * from migen.bank.description import *


class Clocking(Module, AutoReg): class Clocking(Module, AutoCSR):
def __init__(self, pads): def __init__(self, pads):
self._r_pll_reset = RegisterField() self._r_pll_reset = CSRStorage()
self._r_locked = RegisterField(1, READ_ONLY, WRITE_ONLY) self._r_locked = CSRStatus()


self.locked = Signal() self.locked = Signal()
self.serdesstrobe = Signal() self.serdesstrobe = Signal()
Expand Down Expand Up @@ -42,7 +42,7 @@ def __init__(self, pads):
Instance.Output("LOCKED", pll_locked), Instance.Output("LOCKED", pll_locked),
Instance.Input("CLKFBIN", clkfbout), Instance.Input("CLKFBIN", clkfbout),
Instance.Input("CLKIN", pads.clk), Instance.Input("CLKIN", pads.clk),
Instance.Input("RST", self._r_pll_reset.field.r) Instance.Input("RST", self._r_pll_reset.storage)
) )


locked_async = Signal() locked_async = Signal()
Expand All @@ -62,7 +62,7 @@ def __init__(self, pads):
self.specials += Instance("BUFG", self.specials += Instance("BUFG",
Instance.Input("I", pll_clk3), Instance.Output("O", self._cd_pix10x.clk)) Instance.Input("I", pll_clk3), Instance.Output("O", self._cd_pix10x.clk))
self.specials += MultiReg(locked_async, self.locked, "sys") self.specials += MultiReg(locked_async, self.locked, "sys")
self.comb += self._r_locked.field.w.eq(self.locked) self.comb += self._r_locked.status.eq(self.locked)


# sychronize pix+pix5x reset # sychronize pix+pix5x reset
pix_rst_n = 1 pix_rst_n = 1
Expand Down
14 changes: 7 additions & 7 deletions milkymist/dvisampler/datacapture.py
Expand Up @@ -4,16 +4,16 @@
from migen.genlib.cdc import MultiReg, PulseSynchronizer from migen.genlib.cdc import MultiReg, PulseSynchronizer
from migen.bank.description import * from migen.bank.description import *


class DataCapture(Module, AutoReg): class DataCapture(Module, AutoCSR):
def __init__(self, ntbits, invert): def __init__(self, ntbits, invert):
self.pad = Signal() self.pad = Signal()
self.serdesstrobe = Signal() self.serdesstrobe = Signal()
self.d = Signal(10) self.d = Signal(10)


self._r_dly_ctl = RegisterRaw(4) self._r_dly_ctl = CSR(4)
self._r_dly_busy = RegisterField(1, READ_ONLY, WRITE_ONLY) self._r_dly_busy = CSRStatus()
self._r_phase = RegisterField(2, READ_ONLY, WRITE_ONLY) self._r_phase = CSRStatus(2)
self._r_phase_reset = RegisterRaw() self._r_phase_reset = CSR()


### ###


Expand Down Expand Up @@ -137,11 +137,11 @@ def __init__(self, ntbits, invert):
self.do_delay_rst.i.eq(self._r_dly_ctl.re & self._r_dly_ctl.r[1]), self.do_delay_rst.i.eq(self._r_dly_ctl.re & self._r_dly_ctl.r[1]),
self.do_delay_inc.i.eq(self._r_dly_ctl.re & self._r_dly_ctl.r[2]), self.do_delay_inc.i.eq(self._r_dly_ctl.re & self._r_dly_ctl.r[2]),
self.do_delay_dec.i.eq(self._r_dly_ctl.re & self._r_dly_ctl.r[3]), self.do_delay_dec.i.eq(self._r_dly_ctl.re & self._r_dly_ctl.r[3]),
self._r_dly_busy.field.w.eq(sys_delay_pending) self._r_dly_busy.status.eq(sys_delay_pending)
] ]


# Phase detector control # Phase detector control
self.specials += MultiReg(Cat(too_late, too_early), self._r_phase.field.w) self.specials += MultiReg(Cat(too_late, too_early), self._r_phase.status)
self.submodules.do_reset_lateness = PulseSynchronizer("sys", "pix5x") self.submodules.do_reset_lateness = PulseSynchronizer("sys", "pix5x")
self.comb += [ self.comb += [
reset_lateness.eq(self.do_reset_lateness.o), reset_lateness.eq(self.do_reset_lateness.o),
Expand Down
4 changes: 2 additions & 2 deletions milkymist/dvisampler/edid.py
Expand Up @@ -4,7 +4,7 @@
from migen.genlib.cdc import MultiReg from migen.genlib.cdc import MultiReg
from migen.genlib.fsm import FSM from migen.genlib.fsm import FSM
from migen.genlib.misc import chooser from migen.genlib.misc import chooser
from migen.bank.description import AutoReg from migen.bank.description import AutoCSR


_default_edid = [ _default_edid = [
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x3D, 0x17, 0x32, 0x12, 0x2A, 0x6A, 0xBF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x3D, 0x17, 0x32, 0x12, 0x2A, 0x6A, 0xBF, 0x00,
Expand All @@ -17,7 +17,7 @@
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
] ]


class EDID(Module, AutoReg): class EDID(Module, AutoCSR):
def __init__(self, pads, default=_default_edid): def __init__(self, pads, default=_default_edid):
self.specials.mem = Memory(8, 128, init=default) self.specials.mem = Memory(8, 128, init=default)


Expand Down
14 changes: 7 additions & 7 deletions milkymist/dvisampler/resdetection.py
Expand Up @@ -3,15 +3,15 @@
from migen.genlib.cdc import MultiReg from migen.genlib.cdc import MultiReg
from migen.bank.description import * from migen.bank.description import *


class ResolutionDetection(Module, AutoReg): class ResolutionDetection(Module, AutoCSR):
def __init__(self, nbits=10): def __init__(self, nbits=10):
self.hsync = Signal() self.hsync = Signal()
self.vsync = Signal() self.vsync = Signal()
self.de = Signal() self.de = Signal()


self._hres = RegisterField(nbits, READ_ONLY, WRITE_ONLY) self._hres = CSRStatus(nbits)
self._vres = RegisterField(nbits, READ_ONLY, WRITE_ONLY) self._vres = CSRStatus(nbits)
self._de_cycles = RegisterField(2*nbits, READ_ONLY, WRITE_ONLY) self._de_cycles = CSRStatus(2*nbits)


### ###


Expand Down Expand Up @@ -50,8 +50,8 @@ def __init__(self, nbits=10):
If(p_hsync & (hcounter != 0), hcounter_st.eq(hcounter)), If(p_hsync & (hcounter != 0), hcounter_st.eq(hcounter)),
If(p_vsync & (vcounter != 0), vcounter_st.eq(vcounter)) If(p_vsync & (vcounter != 0), vcounter_st.eq(vcounter))
] ]
self.specials += MultiReg(hcounter_st, self._hres.field.w) self.specials += MultiReg(hcounter_st, self._hres.status)
self.specials += MultiReg(vcounter_st, self._vres.field.w) self.specials += MultiReg(vcounter_st, self._vres.status)


# DE # DE
de_r = Signal() de_r = Signal()
Expand All @@ -68,4 +68,4 @@ def __init__(self, nbits=10):


decounter_st = Signal(2*nbits) decounter_st = Signal(2*nbits)
self.sync.pix += If(pn_de, decounter_st.eq(decounter)) self.sync.pix += If(pn_de, decounter_st.eq(decounter))
self.specials += MultiReg(decounter_st, self._de_cycles.field.w) self.specials += MultiReg(decounter_st, self._de_cycles.status)
6 changes: 3 additions & 3 deletions milkymist/framebuffer/__init__.py
Expand Up @@ -220,7 +220,7 @@ def __init__(self, pads, asmiport, simulation=False):
g.add_connection(vtg, fifo) g.add_connection(vtg, fifo)
self.submodules._comp_actor = CompositeActor(g, debugger=False) self.submodules._comp_actor = CompositeActor(g, debugger=False)


self._registers = fi.get_registers() + self._comp_actor.get_registers() self._csrs = fi.get_csrs() + self._comp_actor.get_csrs()


# Drive pads # Drive pads
if not simulation: if not simulation:
Expand All @@ -233,5 +233,5 @@ def __init__(self, pads, asmiport, simulation=False):
] ]
self.comb += pads.psave_n.eq(1) self.comb += pads.psave_n.eq(1)


def get_registers(self): def get_csrs(self):
return self._registers return self._csrs
14 changes: 7 additions & 7 deletions milkymist/identifier/__init__.py
Expand Up @@ -15,16 +15,16 @@ def encode_version(version):
r |= int(rc) r |= int(rc)
return r return r


class Identifier(Module, AutoReg): class Identifier(Module, AutoCSR):
def __init__(self, sysid, version, frequency): def __init__(self, sysid, version, frequency):
self._r_sysid = RegisterField(16, access_bus=READ_ONLY, access_dev=WRITE_ONLY) self._r_sysid = CSRStatus(16)
self._r_version = RegisterField(16, access_bus=READ_ONLY, access_dev=WRITE_ONLY) self._r_version = CSRStatus(16)
self._r_frequency = RegisterField(32, access_bus=READ_ONLY, access_dev=WRITE_ONLY) self._r_frequency = CSRStatus(32)


### ###


self.comb += [ self.comb += [
self._r_sysid.field.w.eq(sysid), self._r_sysid.status.eq(sysid),
self._r_version.field.w.eq(encode_version(version)), self._r_version.status.eq(encode_version(version)),
self._r_frequency.field.w.eq(frequency) self._r_frequency.status.eq(frequency)
] ]
14 changes: 7 additions & 7 deletions milkymist/m1crg/__init__.py
Expand Up @@ -5,7 +5,7 @@
from migen.fhdl.module import Module from migen.fhdl.module import Module
from migen.bank.description import * from migen.bank.description import *


class M1CRG(Module, AutoReg): class M1CRG(Module, AutoCSR):
def __init__(self, pads, outfreq1x): def __init__(self, pads, outfreq1x):
self.clock_domains.cd_sys = ClockDomain() self.clock_domains.cd_sys = ClockDomain()
self.clock_domains.cd_sys2x_270 = ClockDomain() self.clock_domains.cd_sys2x_270 = ClockDomain()
Expand All @@ -18,10 +18,10 @@ def __init__(self, pads, outfreq1x):
self.clk4x_wr_strb = Signal() self.clk4x_wr_strb = Signal()
self.clk4x_rd_strb = Signal() self.clk4x_rd_strb = Signal()


self._r_cmd_data = RegisterField(10) self._r_cmd_data = CSRStorage(10)
self._r_send_cmd_data = RegisterRaw() self._r_send_cmd_data = CSR()
self._r_send_go = RegisterRaw() self._r_send_go = CSR()
self._r_status = RegisterField(3, READ_ONLY, WRITE_ONLY) self._r_status = CSRStatus(3)


### ###


Expand Down Expand Up @@ -74,7 +74,7 @@ def __init__(self, pads, outfreq1x):
self.sync += [ self.sync += [
If(self._r_send_cmd_data.re, If(self._r_send_cmd_data.re,
remaining_bits.eq(10), remaining_bits.eq(10),
sr.eq(self._r_cmd_data.field.r) sr.eq(self._r_cmd_data.storage)
).Elif(transmitting, ).Elif(transmitting,
remaining_bits.eq(remaining_bits - 1), remaining_bits.eq(remaining_bits - 1),
sr.eq(sr[1:]) sr.eq(sr[1:])
Expand All @@ -95,4 +95,4 @@ def __init__(self, pads, outfreq1x):
busy_counter.eq(busy_counter - 1) busy_counter.eq(busy_counter - 1)
) )


self.comb += self._r_status.field.w.eq(Cat(busy, vga_progdone, vga_locked)) self.comb += self._r_status.status.eq(Cat(busy, vga_progdone, vga_locked))

0 comments on commit 4f4f260

Please sign in to comment.