def __init__(self, bits_sign=None, name=None, variable=False, reset=0, name_override=None, min=None, max=None, related=None, attribute=""): from litex.gen.fhdl.bitcontainer import bits_for _Value.__init__(self) # determine number of bits and signedness if bits_sign is None: if min is None: min = 0 if max is None: max = 2 max -= 1 # make both bounds inclusive assert(min < max) self.signed = min < 0 or max < 0 self.nbits = _builtins.max(bits_for(min, self.signed), bits_for(max, self.signed)) else: assert(min is None and max is None) if isinstance(bits_sign, tuple): self.nbits, self.signed = bits_sign else: self.nbits, self.signed = bits_sign, False if not isinstance(self.nbits, int) or self.nbits <= 0: raise ValueError("Signal width must be a strictly positive integer") self.variable = variable # deprecated self.reset = reset self.name_override = name_override self.backtrace = _tracer.trace_back(name) self.related = related self.attribute = attribute
def __init__(self, bits_sign=None, name=None, variable=False, reset=0, reset_less=False, name_override=None, min=None, max=None, related=None, attr=None): from litex.gen.fhdl.bitcontainer import bits_for _Value.__init__(self) for n in [name, name_override]: if n is not None and not self._name_re.match(n): raise ValueError("Signal name {} is not a valid Python identifier" .format(repr(n))) # determine number of bits and signedness if bits_sign is None: if min is None: min = 0 if max is None: max = 2 max -= 1 # make both bounds inclusive assert(min < max) self.signed = min < 0 or max < 0 self.nbits = _builtins.max(bits_for(min, self.signed), bits_for(max, self.signed)) else: assert(min is None and max is None) if isinstance(bits_sign, tuple): self.nbits, self.signed = bits_sign else: self.nbits, self.signed = bits_sign, False if isinstance(reset, (bool, int)): reset = Constant(reset, (self.nbits, self.signed)) if not isinstance(self.nbits, int) or self.nbits <= 0: raise ValueError("Signal width must be a strictly positive integer") if attr is None: attr = set() self.variable = variable # deprecated self.reset = reset self.reset_less = reset_less self.name_override = name_override self.backtrace = _tracer.trace_back(name) self.related = related self.attr = attr
def __init__(self, bits_sign=None, name=None, variable=False, reset=0, name_override=None, min=None, max=None, related=None, attribute=""): from litex.gen.fhdl.bitcontainer import bits_for _Value.__init__(self) # determine number of bits and signedness if bits_sign is None: if min is None: min = 0 if max is None: max = 2 max -= 1 # make both bounds inclusive assert (min < max) self.signed = min < 0 or max < 0 self.nbits = _builtins.max(bits_for(min, self.signed), bits_for(max, self.signed)) else: assert (min is None and max is None) if isinstance(bits_sign, tuple): self.nbits, self.signed = bits_sign else: self.nbits, self.signed = bits_sign, False if not isinstance(self.nbits, int) or self.nbits <= 0: raise ValueError( "Signal width must be a strictly positive integer") self.variable = variable # deprecated self.reset = reset self.name_override = name_override self.backtrace = _tracer.trace_back(name) self.related = related self.attribute = attribute
def __init__(self, t): self.wait = Signal() self.done = Signal() # # # count = Signal(bits_for(t), reset=t) self.comb += self.done.eq(count == 0) self.sync += \ If(self.wait, If(~self.done, count.eq(count - 1)) ).Else(count.eq(count.reset))
def __init__(self, value, bits_sign=None): from litex.gen.fhdl.bitcontainer import bits_for _Value.__init__(self) self.value = int(value) if bits_sign is None: bits_sign = bits_for(self.value), self.value < 0 elif isinstance(bits_sign, int): bits_sign = bits_sign, self.value < 0 self.nbits, self.signed = bits_sign if not isinstance(self.nbits, int) or self.nbits <= 0: raise TypeError("Width must be a strictly positive integer")
def emit_verilog(memory, ns, add_data_file): r = "" def gn(e): if isinstance(e, Memory): return ns.get_name(e) else: return verilog_printexpr(ns, e)[0] adrbits = bits_for(memory.depth-1) r += "reg [" + str(memory.width-1) + ":0] " \ + gn(memory) \ + "[0:" + str(memory.depth-1) + "];\n" adr_regs = {} data_regs = {} for port in memory.ports: if not port.async_read: if port.mode == WRITE_FIRST and port.we is not None: adr_reg = Signal(name_override="memadr") r += "reg [" + str(adrbits-1) + ":0] " \ + gn(adr_reg) + ";\n" adr_regs[id(port)] = adr_reg else: data_reg = Signal(name_override="memdat") r += "reg [" + str(memory.width-1) + ":0] " \ + gn(data_reg) + ";\n" data_regs[id(port)] = data_reg for port in memory.ports: r += "always @(posedge " + gn(port.clock) + ") begin\n" if port.we is not None: if port.we_granularity: n = memory.width//port.we_granularity for i in range(n): m = i*port.we_granularity M = (i+1)*port.we_granularity-1 sl = "[" + str(M) + ":" + str(m) + "]" r += "\tif (" + gn(port.we) + "[" + str(i) + "])\n" r += "\t\t" + gn(memory) + "[" + gn(port.adr) + "]" + sl + " <= " + gn(port.dat_w) + sl + ";\n" else: r += "\tif (" + gn(port.we) + ")\n" r += "\t\t" + gn(memory) + "[" + gn(port.adr) + "] <= " + gn(port.dat_w) + ";\n" if not port.async_read: if port.mode == WRITE_FIRST and port.we is not None: rd = "\t" + gn(adr_regs[id(port)]) + " <= " + gn(port.adr) + ";\n" else: bassign = gn(data_regs[id(port)]) + " <= " + gn(memory) + "[" + gn(port.adr) + "];\n" if port.mode == READ_FIRST or port.we is None: rd = "\t" + bassign elif port.mode == NO_CHANGE: rd = "\tif (!" + gn(port.we) + ")\n" \ + "\t\t" + bassign if port.re is None: r += rd else: r += "\tif (" + gn(port.re) + ")\n" r += "\t" + rd.replace("\n\t", "\n\t\t") r += "end\n\n" for port in memory.ports: if port.async_read: r += "assign " + gn(port.dat_r) + " = " + gn(memory) + "[" + gn(port.adr) + "];\n" else: if port.mode == WRITE_FIRST and port.we is not None: r += "assign " + gn(port.dat_r) + " = " + gn(memory) + "[" + gn(adr_regs[id(port)]) + "];\n" else: r += "assign " + gn(port.dat_r) + " = " + gn(data_regs[id(port)]) + ";\n" r += "\n" if memory.init is not None: content = "" for d in memory.init: content += "{:x}\n".format(d) memory_filename = add_data_file(gn(memory) + ".init", content) r += "initial begin\n" r += "\t$readmemh(\"" + memory_filename + "\", " + gn(memory) + ");\n" r += "end\n\n" return r