def visit_Slice(self, node): val = self.visit(node.var) if val is None: return None if isinstance(val.right, vtypes._Variable): right = vtypes.Slice(val.right, node.msb, node.lsb) else: right = vtypes.And(vtypes.Srl(val.right, node.lsb), vtypes.Repeat(vtypes.Int(1, width=1), node.msb - node.lsb + 1)) return vtypes.Subst(vtypes.Slice(val.left, node.msb, node.lsb), right)
def __init__(self, m, name, clk, rst, datawidth=32, addrwidth=32, lite=False, noio=False, length=4): AXIS.__init__(self, m, name, clk, rst, datawidth=datawidth, addrwidth=addrwidth, lite=lite, noio=noio) if not isinstance(length, int): raise TypeError("length must be 'int', not '%s'" % str(type(length))) self.register = [ self.m.Reg('_'.join(['', self.name, 'register', '%d' % i]), width=self.datawidth, initval=0) for i in range(length) ] self.flag = [ self.m.Reg('_'.join(['', self.name, 'flag', '%d' % i]), initval=0) for i in range(length) ] self.resetval = [ self.m.Reg('_'.join(['', self.name, 'resetval', '%d' % i]), width=self.datawidth, initval=0) for i in range(length) ] self.length = length self.maskwidth = self.m.Localparam( '_'.join(['', self.name, 'maskwidth']), int(math.ceil(math.log(length, 2)))) self.mask = self.m.Localparam( '_'.join(['', self.name, 'mask']), vtypes.Repeat(vtypes.Int(1, 1), self.maskwidth)) self.shift = self.m.Localparam('_'.join(['', self.name, 'shift']), util.log2(self.datawidth // 8)) if self.lite: self._setup_register_lite_fsm() else: self._setup_register_full_fsm()
def fixed_to_int_low(value, point): if point < 0: return 0 if point == 0: return 0 if isinstance(value, (int, bool, float)) and isinstance(point, int): mag = 2 ** point return int(value % mag) return vtypes.And(value, vtypes.Repeat(vtypes.Int(1, 1), point))
def write_data(self, data, counter=None, cond=None): """ @return ack, last """ if self._write_disabled: raise TypeError('Write disabled.') if counter is not None and not isinstance(counter, vtypes.Reg): raise TypeError("counter must be Reg or None.") if counter is None: counter = self.write_counters[-1] if cond is not None: self.seq.If(cond) ack = vtypes.Ands(counter > 0, vtypes.Ors(self.wdata.wready, vtypes.Not(self.wdata.wvalid))) last = self.m.TmpReg(initval=0) self.seq.If(vtypes.Ands(ack, counter > 0))( self.wdata.wdata(data), self.wdata.wvalid(1), self.wdata.wlast(0), self.wdata.wstrb(vtypes.Repeat( vtypes.Int(1, 1), (self.wdata.datawidth // 8))), counter.dec() ) self.seq.Then().If(counter == 1)( self.wdata.wlast(1), last(1) ) # de-assert self.seq.Delay(1)( self.wdata.wvalid(0), self.wdata.wlast(0), last(0) ) # retry self.seq.If(vtypes.Ands(self.wdata.wvalid, vtypes.Not(self.wdata.wready)))( self.wdata.wvalid(self.wdata.wvalid), self.wdata.wlast(self.wdata.wlast), last(last) ) return ack, last
def __init__(self, m, name, clk, rst, datawidth=32, addrwidth=32, noio=False, length=4, fsm_as_module=False): AXISLite.__init__(self, m, name, clk, rst, datawidth, addrwidth, noio) self.fsm_as_module = fsm_as_module if not isinstance(length, int): raise TypeError("length must be 'int', not '%s'" % str(type(length))) self.register = [ self.m.Reg('_'.join(['', self.name, 'register', '%d' % i]), width=self.datawidth, initval=0, signed=True) for i in range(length) ] self.flag = [ self.m.Reg('_'.join(['', self.name, 'flag', '%d' % i]), initval=0) for i in range(length) ] self.resetval = [ self.m.Reg('_'.join(['', self.name, 'resetval', '%d' % i]), width=self.datawidth, initval=0, signed=True) for i in range(length) ] self.length = length self.maskwidth = self.m.Localparam( '_'.join(['', self.name, 'maskwidth']), util.log2(length)) self.mask = self.m.Localparam( '_'.join(['', self.name, 'mask']), vtypes.Repeat(vtypes.Int(1, 1), self.maskwidth)) self.shift = self.m.Localparam('_'.join(['', self.name, 'shift']), util.log2(self.datawidth // 8)) self._set_register_lite_fsm()
def visit_Repeat(self, node): var = self.visit(node.value) times = self.visit(node.times) return vtypes.Repeat(var, times)
def dec_part(self): mask = vtypes.Mux(self.point == 0, 0, vtypes.Repeat( vtypes.Int(1, width=1), self.point)) return self & mask
def write_dataflow(self, data, counter=None, cond=None, when=None): """ @return done """ if self._write_disabled: raise TypeError('Write disabled.') if counter is not None and not isinstance(counter, vtypes.Reg): raise TypeError("counter must be Reg or None.") if counter is None: counter = self.write_counters[-1] ack = vtypes.Ands(counter > 0, vtypes.Ors(self.wdata.wready, vtypes.Not(self.wdata.wvalid))) last = self.m.TmpReg(initval=0) if cond is None: cond = ack else: cond = (cond, ack) raw_data, raw_valid = data.read(cond=cond) when_cond = make_condition(when, ready=cond) if when_cond is not None: raw_valid = vtypes.Ands(when_cond, raw_valid) # write condition self.seq.If(raw_valid) self.seq.If(vtypes.Ands(ack, counter > 0))( self.wdata.wdata(raw_data), self.wdata.wvalid(1), self.wdata.wlast(0), self.wdata.wstrb(vtypes.Repeat( vtypes.Int(1, 1), (self.wdata.datawidth // 8))), counter.dec() ) self.seq.Then().If(counter == 1)( self.wdata.wlast(1), last(1) ) # de-assert self.seq.Delay(1)( self.wdata.wvalid(0), self.wdata.wlast(0), last(0) ) # retry self.seq.If(vtypes.Ands(self.wdata.wvalid, vtypes.Not(self.wdata.wready)))( self.wdata.wvalid(self.wdata.wvalid), self.wdata.wlast(self.wdata.wlast), last(last) ) done = last return done