示例#1
0
def drvgen(top, intfdef, outdir):
    xparams = []
    for name, usr_axip in intfdef.items():
        if usr_axip.t == 'axidma':
            xparams.append(f'"C_{name.upper()}_CTRL_BASEADDR"')
        elif usr_axip.t == 'axi':
            xparams.append(f'"C_{name.upper()}_BASEADDR"')

    modinst = reg['hdlgen/map'][top]
    drvname = modinst.module_name

    files_dir = os.path.join(os.path.dirname(__file__), '..', 'drivers')
    env = TemplateEnv(files_dir)

    context = {'module_name': drvname, 'params': ' '.join(xparams)}

    files = []

    outdir = os.path.join(outdir, f'{drvname}_v1_0')
    datadir = os.path.join(outdir, 'data')
    srcdir = os.path.join(outdir, 'src')

    os.makedirs(datadir, exist_ok=True)
    os.makedirs(srcdir, exist_ok=True)

    files.append(
        save_file(f'{drvname}.mdd', datadir,
                  env.render('.', 'drvgen_mdd.j2', context)))

    files.append(
        save_file(f'{drvname}.tcl', datadir,
                  env.render('.', 'drvgen_tcl.j2', context)))

    context = {'module_name': drvname, 'intfdef': intfdef}

    files.append(
        save_file(f'{drvname}.h', srcdir,
                  env.render('.', 'drvgen_new_h.j2', context)))

    files.append(
        save_file(f'{drvname}.c', srcdir,
                  env.render('.', 'drvgen_new_c.j2', context)))

    files.append(
        copy_file('Makefile', srcdir, os.path.join(files_dir, 'Makefile')))

    files.append(
        copy_file('pgaxi.c', srcdir, os.path.join(files_dir, 'pgaxi.c')))
    files.append(
        copy_file('pgaxi.h', srcdir, os.path.join(files_dir, 'pgaxi.h')))

    return files
示例#2
0
def generate(top, intfdef):
    files = set()
    if isinstance(top, str):
        top = find(top)

    modinst = reg['hdlgen/map'][top]

    sigs = []
    for s in top.signals.values():
        if s.name == 'clk':
            sigs.append(InSig('aclk', 1))
        elif s.name == 'rst':
            sigs.append(InSig('aresetn', 1))
        else:
            sigs.append(s)

    intfs = {p['name']: p for p in get_port_intfs(top)}

    for i in intfs.values():
        dtype = i['type']
        w_data = i['width']
        w_eot = 0
        if typeof(dtype, Queue):
            w_data = dtype.data.width
            w_eot = int(dtype.eot)

        i['w_data'] = w_data
        i['w_eot'] = w_eot

    defs = []
    for name, p in intfdef.items():
        if p.t == 'axidma':
            params = {n: c.params for n, c in p.comp.items()}
            defs.extend(
                axi_intfs.port_def(axi_intfs.AXI_MASTER, name, **params))

            params = {
                n: c.params
                for n, c in intfdef[f'{name}_ctrl'].comp.items()
            }
            defs.extend(
                axi_intfs.port_def(axi_intfs.AXIL_SLAVE, f'{name}_ctrl',
                                   **params))

            files.update({'sfifo.v', 'axi_addr.v', 'skidbuffer.v'})

            if 'rdata' in p.comp:
                files.add('aximm2s.v')

            if 'wdata' in p.comp:
                files.add('axis2mm.v')

        elif p.t in ['bram', 'bram.req', 'axi']:

            params = {n: c.params for n, c in p.comp.items()}

            pdefs = axi_intfs.port_def(axi_intfs.AXI_SLAVE, name, **params)

            if 'rdata' in params:
                files.add('axi_slave_read.v')

            if 'wdata' in params:
                files.add('axi_slave_write.v')

            if 'rdata' in params or 'wdata' in params:
                files.update({'sfifo.v', 'axi_addr.v', 'skidbuffer.v'})

            defs.extend(pdefs)

        elif p.t == 'axis':
            if p.direction == 'w':
                tmplt = axi_intfs.AXIS_SLAVE
            else:
                tmplt = axi_intfs.AXIS_MASTER

            params = {n: c.params for n, c in p.comp.items()}

            pdefs = axi_intfs.port_def(tmplt, name, **params)

            defs.extend(pdefs)

    context = {
        'wrap_module_name': f'wrap_{modinst.module_name}',
        'module_name': modinst.wrap_module_name,
        'inst_name': modinst.wrap_module_name,
        'intfs': intfs,
        'sigs': sigs,
        'param_map': modinst.params if not modinst.wrapped else {},
        'port_def': defs,
        'ports': intfdef
    }

    context['pg_clk'] = 'aclk'
    tmplt = 'wrapper.j2'

    base_addr = os.path.dirname(__file__)
    lang_dir = os.path.join(os.path.dirname(base_addr), 'sv')
    env = TemplateEnv(lang_dir)

    env.jenv.globals.update(zip=zip,
                            ceil_pow2=ceil_pow2,
                            ceil_div=ceil_div,
                            bitw=bitw,
                            ceil_chunk=ceil_chunk,
                            axi_intfs=axi_intfs)

    return env.render(base_addr, tmplt, context), files