NSUKit 1.4.0
板卡级统一交互接口
载入中...
搜索中...
未找到
🚀快速开始
返回目录

目录

  1. 环境安装
  2. 使用接口
    1. 指定协议接口
    2. 发起连接
    3. 寄存器交互
    4. 数据流交互

1. 环境安装

1.1. 环境依赖

c++17

1.2. 支持的操作系统与平台

Windows7 x64
Windows10 x64
Windows11 x64
Ubuntu 18.04 aarch64
Ubuntu 18.04 x64
Ubuntu 20.04 aarch64
Ubuntu 20.04 x64
CentOS 8.x x64
macOS 功能受限

1.3. 安装

cd build
cmake ..

2. 基础接口

  1. 与Soc常用的基本交互方式可抽象为指令寄存器交互(CR)、指令流交互(CS)与数据流交互(DS)三种,不同的Soc会选用不同的物理接口和协议来承载这三种基本交互。
    1. 指令寄存器操作 CR Interaction,主机对Soc侧地址寄存器读写操作,实现主机对Soc的状态查询与寄存器配置;
    2. 指令流操作 CS Interaction,主机与片上处理器指令通信,实现主机与片上处理器(Arm或Microblaze)的指令发送与反馈接收,采用ICD列表,NSUkit自动完成收发解析;
    3. 数据流操作 DS Interaction,实现Soc侧数据流到主机内存的上下行操作,可以将一片数据连续不断地从一端传输到另一端;
  2. 在这三种交互之上,用户可实现基于Soc的不同功能,NSUKit基于这一模型,提出了如下独立于具体Soc的抽象交互接口。

2.1. 片上系统类NSUSoc

2.1.1. 指定协议接口

  1. 采用面向对象的方式,可以 对每个片上系统(SOC)都实例化一个此类的对象 ,对象包含了三种交互方式的所有控制接口
  2. 只需要在实例化此类时,将对应的cs_itf_class、cr_itf_class、ds_itf_class协议类作为参数传入,再通过InitParamSet数据类指定协议类连接Soc所需的参数
  3. NSUSoc初始化详情可查看文档 nsukit::NSUSoc
  4. 这样就完成了对应某一具体 片上系统(SOC)软件对象实例化 ,对于三种抽象交互方式的各个接口调用,都不会再出现与具体物理协议相关的参数

2.1.2. 发起连接

  1. 在此接口被调用时,主机端会按指定的物理协议对Soc发起连接,cmd与stream可分开link,link完成后,相应的交互接口才可用
  2. 此示例中,CS、CR、DS交互都选择为SimxxxItf,代表此Soc为软件虚拟Soc, 可用于在脱离硬件的情况下测试基于NSUKit的上层程序功能完整性
    #include "NSUKit.h"
    nsuInitParam_t param {};
    param.sim_target = 10;
    kit.link_cmd(&param);
    kit.link_stream(&param);
    nsukitStatus_t link_cmd(nsuInitParam_t *param) override
    Definition: NSUKit.h:328
    nsukitStatus_t link_stream(nsuInitParam_t *param) override
    Definition: NSUKit.h:376
    int sim_target
    模拟目标
    Definition: type.h:134

2.2. 基于NSUSoc对象的三种交互

2.2.1 指令寄存器交互

寄存器交互指以(地址, 值)的形式与Soc进行交互,提供单地址值写入/读取接口,片写入/读取接口

2.2.1.1. 单地址写入/读取

单地址写入/单地址读取 是指对一个寄存器地址,传输一个小于等于32位的值

#include "NSUKit.h"
kit.write(0x10000000, 10);
int reg;
kit.read(0x10000000, &reg);
nsukitStatus_t write(nsuRegAddr_t addr, nsuRegValue_t value) override
Definition: NSUKit.h:414
nsukitStatus_t read(nsuRegAddr_t addr, nsuRegValue_t *buf) override
Definition: NSUKit.h:423

2.2.1.2. 片写入/读取

片写入/片读取 是指以寄存器交互方式,传输大于单个寄存器位宽的指定长度的数据

#include "NSUKit.h"
...
int data[20];
kit.bulk_write(0x10000030, (char *)data, 20, nsukit::nsuBulkMode::INCREMENT); // 从给定寄存器地址,依次将给定数据依次写入后续地址
kit.bulk_read(0x00000020, 10, nsukit::nsuBulkMode::INCREMENT) // 从给定基地址开始,从寄存器中读取指定长度的值
nsukitStatus_t bulk_write(nsuRegAddr_t base, nsuCharBuf_p values, nsuSize_t length, nsuBulkMode mode=nsuBulkMode::INCREMENT) override
Definition: NSUKit.h:435
nsukitStatus_t bulk_read(nsuRegAddr_t base, nsuSize_t length, nsuVoidBuf_p buf=nullptr, nsuBulkMode mode=nsuBulkMode::INCREMENT) override
Definition: NSUKit.h:449

2.2.1.3. 单址片写入/读取

单址片写入/单址片读取 是指将一串指定长度的数据,依次写入单个寄存器地址,由对端将数据从单个寄存器地址中解析出来的方式

#include "NSUKit.h"
...
int data[20];
kit.bulk_write(0x10000030, (char *)data, 20, nsukit::nsuBulkMode::LOOP); // 从给定寄存器地址,将给定数据依次写入,地址不递增
kit.bulk_read(0x00000020, 10, nsukit::nsuBulkMode::LOOP) // 从给定寄存器地址,按一定间隔读出寄存器中的值

2.2.2. 指令流交互

  1. 指令交互指以固定的包格式将一系列需要协同配置的参数组织为一条指令下发给Soc,Soc在接收到指令并执行完成后,以约定的包格式进行回执
  2. nsukit内原生支持的**指令包格式**及定义方式可查看文档:ICD格式
  3. 提供三个指令交互接口,NSUSoc.set_paramNSUSoc.get_paramNSUSoc.execute,如下示例使用指令交互接口将Soc的DAC采样率配置为8Gsps

2.2.2.1. 配置参数

接口详情可查看文档 nsukit.NSUSoc.set_param ,同时name参数的可用值可参考此描述

#include "NSUKit.h"
...
kit.set_param("DAC采样率", 5000);
nsukitStatus_t set_param(nsuCSParam_t &param_name, const uint8_t &value) override
Definition: NSUKit.h:527

2.2.2.2. 获取参数

接口详情可查看文档 nsukit.NSUSoc.get_param ,同时name参数的可用值可参考此描述

#include "NSUKit.h"
...
kit.get_param("DAC采样率", 5000);
uint8_t get_param(nsuCSParam_t &param_name, uint8_t _default=0) override
Definition: NSUKit.h:473

2.2.2.3. 执行指令

接口详情可查看文档 nsukit.NSUSoc.execute ,同时cmd参数的可用值可参考此描述

#include "NSUKit.h"
...
kit.execute("RF配置");
nsukitStatus_t execute(nsuCSParam_t cname) override
Definition: NSUKit.h:463

2.2.3. 数据流交互

  1. 数据流交互指Soc与主机间以流的方式进行数据传输,只用指定一个基地址,就可以将一片数据连续不断地从一端传输到另一端,常用于大批量、长时间、高带宽的数据传输场景,详细使用方式可参看进阶使用
  2. 数据流交互接口分为内存管理与数据收发两部分,内存管理(NSUSoc.alloc_bufferNSUSoc.free_bufferNSUSoc.get_buffer)用于管理用于数据流交互的host端连续内存。如下示例展示用数据流交互接口阻塞式将16kB数据从Soc传输到主机内存
#include "NSUKit.h"
auto fd = kit.alloc_buffer(16384); // 申请一片16384Bytes的内存
// 当前有四个数据流通道可供使用,即第一个参数可填0~3
kit.stream_recv(0, fd, 16384, 0); // 通过通道0将指定数据量存储到申请到的fd上
nsukitStatus_t stream_recv(nsuChnlNum_t chnl, nsuMemory_p fd, nsuStreamLen_t length, nsuStreamLen_t offset=0, bool(*stop_event)()=nullptr, int flag=1) override
Definition: NSUKit.h:607
nsuMemory_p alloc_buffer(nsuStreamLen_t length, nsuVoidBuf_p buf=nullptr) override
Definition: NSUKit.h:575

Copyright © 2023 耐数 naishu.tech
北京耐数电子有限公司