Arm Ethos‑U65:YOLOv8n 仿真验证与命令流执行
本文是 Arm Ethos‑U65 学习笔记的第五篇也是 YOLOv8n 目标检测实例的下篇。上篇完成了模型准备与 Vela 编译生成命令流本篇将命令流导入芯片仿真环境执行推理验证整个示例以芯片验证仿真为主线同时对裸机环境下的软件开发也有一定参考价值。数据准备tflite转bin将vela.tflite转换为命令流和权重的 bin 文件。convert_vela2bin.pyimportosimporttflitedefextract_ethos_u_stream(tflite_path):withopen(tflite_path,rb)asf:buff.read()modeltflite.Model.GetRootAsModel(buf,0)subgraphmodel.Subgraphs(0)found_npu_opFalse# 遍历所有算子寻找 Ethos-U 的 CUSTOM 算子foriinrange(subgraph.OperatorsLength()):opsubgraph.Operators(i)opcode_idxop.OpcodeIndex()opcodemodel.OperatorCodes(opcode_idx)ifopcode.BuiltinCode()tflite.BuiltinOperator.CUSTOM:custom_codeopcode.CustomCode()ifcustom_code:custom_code_strcustom_code.decode(utf-8)else:continueifethos-uincustom_code_str:print(f 找到 Ethos-U Custom 算子 (Index:{i}) )found_npu_opTrue# Index 0: 包含 cmd0/cmd1 的指令流 (Command Stream)# Index 1: 包含 权重 (Weights) 和 偏置 (Biases)cmd_tensor_idxop.Inputs(0)weight_tensor_idxop.Inputs(1)cmd_tensorsubgraph.Tensors(cmd_tensor_idx)weight_tensorsubgraph.Tensors(weight_tensor_idx)cmd_buf_objmodel.Buffers(cmd_tensor.Buffer())weight_buf_objmodel.Buffers(weight_tensor.Buffer())# --- 安全提取 Buffer 数据 (兼容不同 Flatbuffers 版本) ---defget_raw_bytes(buf_obj):# 通过 DataLength 逐字节提取ifhasattr(buf_obj,DataLength)andbuf_obj.DataLength()0:returnbytes([buf_obj.Data(j)forjinrange(buf_obj.DataLength())])returnbcmd_bufferget_raw_bytes(cmd_buf_obj)weight_bufferget_raw_bytes(weight_buf_obj)# 保存为原始二进制文件cmd_outethos_u_cmd_stream.binweight_outethos_u_weights.binwithopen(cmd_out,wb)asf_cmd:f_cmd.write(cmd_buffer)withopen(weight_out,wb)asf_weight:f_weight.write(weight_buffer)print(f成功导出指令流 -{cmd_out}({len(cmd_buffer)}字节))print(f成功导出权重数据 -{weight_out}({len(weight_buffer)}字节))break# 找到 NPU 核心算子后即可退出if__name____main__:# 替换为你的 vela tflite 模型文件名model_filename./tfile_model/output/yolov8n_256_quant_pc_ui_od_coco_vela.tfliteextract_ethos_u_stream(model_filename)bin转hex字符将 bin 文件转化为 verilog $readmemh 可以读取的16进制文件需要注意命令流需要删除前 32B 数据。convert_bin2vhex.pydefbin_to_hex_32bit(bin_path,hex_path,skip_bytes0,reverse_bytesTrue): 将二进制 .bin 文件转换为 32位宽4字节Verilog $readmemh 可读的 .hex 文件 :param bin_path: 输入的 .bin 文件路径 :param hex_path: 输出的 .hex 文件路径 :param skip_bytes: 需要跳过的头部字节数如 Vela 的 Header默认为 0 :param reverse_bytes: 是否反转每行的字节序小端序系统设为 True BYTES_PER_LINE4# 32位宽对应 4 字节withopen(bin_path,rb)asf_in,open(hex_path,w)asf_out:# 如果需要跳过前几个字节例如 Vela 命令流头部元数据ifskip_bytes0:droppedf_in.read(skip_bytes)print(f已跳过{bin_path}头部的{len(dropped)}字节数据)whileTrue:# 每次读取 4 字节32位chunkf_in.read(BYTES_PER_LINE)ifnotchunk:break# 如果最后剩余字节不足 4 字节用 0x00 补齐iflen(chunk)BYTES_PER_LINE:chunkchunkb\x00*(BYTES_PER_LINE-len(chunk))# 字节序反转小端序# 确保 bin 文件中的低地址字节映射到 Verilog 32位寄存器的低 8 位 [7:0] if reverse_bytes:chunkchunk[::-1]# 转换为 8 位的十六进制字符串4字节 8个16进制字符例如 ffffffffhex_linechunk.hex()# 写入文件并换行f_out.write(hex_line\n)if__name____main__:# 【指令流转换】# 如果你发现硬件的第一行指令报错即包含了 Vela Header可以尝试将 skip_bytes 改为 4 或 8 bin_to_hex_32bit(bin_pathethos_u_cmd_stream.bin,hex_pathethos_u_cmd_stream_32.hex,skip_bytes32,# 如果需要剔除第一行不能用的数据可以根据具体字节数修改此处例如改为 4reverse_bytesTrue)# 【权重流转换】bin_to_hex_32bit(bin_pathethos_u_weights.bin,hex_pathethos_u_weight_stream_32.hex,skip_bytes0,reverse_bytesTrue)print(32位宽转换完成已生成对应的 .hex 文件。)转换完成后可以和 register-command-stream 对比一下应当是完全一致的仿真testbench从命令流获取地址首先通过命令流获取地址信息查看 register-command-stream通过IFM_REGION、OFM_REGION、DMA0_SRC_REGION 可以获取输入数据、缓存数据和权重需要存放的地址。下图中可以看到输入数据存放在区域1偏移地址0x0、权重放在区域0偏移地址 0x0缓存数据起始地址是区域2偏移地址 0x0。输出数据地址获取就麻烦一些tflite 网络最后一步为 concat但命令流中是没有concat再往上追可以看到 concat 有3个来源前 2 个 “2” 是框坐标最后的 “80” 是框置信度然后查看 register-command-stream可以看到mul存放地址 0x2f400~0x2fe80sub存放地址 0x2fe80~0x30900quantize 存放地址 0x30900~0x44ad00输出均在区域1所以最终需要 dump 的数据是 区域1 0x2f400~0x4ad00 偏移。此外也可以得知数据是按 1344 维度顺序存。寄存器配置寄存器配置可以参见 IP验证的前文档主要区别在修改地址。write_reg(NPU_REG_AXI_LIMIT0, 32h0f0f0001, error); // axi-0配置 write_reg(NPU_REG_AXI_LIMIT1, 32h0f0f0001, error); write_reg(NPU_REG_AXI_LIMIT2, 32h0f0f0001, error); // axi-1配置 write_reg(NPU_REG_AXI_LIMIT3, 32h0f0f0001, error); write_reg(h10,h0, error); // 命令流地址 write_reg(h20,h9850, error); // 命令流大小register-command第一行可以看 write_reg(h80,h10000, error); // region0 权重 write_reg(h88,h40_0000, error); // region1 输入数据、中间变量、输出数据 write_reg(h90,h80_0000, error); // region2 中间变量 write_reg(NPU_REG_REGIONCFG, 32h00000022, error); write_reg(h8 ,h1, error); // 触发NPU工作 wait(ethosu65_exetb.u_wrapper.u_dut.IRQ) #1ns; //等待NPU运算完成 ... // 导出 区域1地址0x30900~0x4ad00偏移 数据仿真结果仿真波形运行仿真等待仿真结束可以看到3.2MB 的YOLO v8n 模型使用 Vela 默认配置编译Ethos U65 运行时钟 1GHz花费 6.16ms 运算完成。指令应当和波形的行为完全对应例如第1次权重搬运从区域0地址偏移 0x0 搬运到区域2地址偏移 0x30000波形中基地址为 APB 配置的区域 0、2地址。在运算期间可以通过内部信号 u_ethosu65_cc.u_ethosu65_cc_reg.qread_i 判断当前执行命令执行到哪里结合 register-command-stream 调试。导出数据打印U65 输出为中间运算结果还需要继续进行后处理程序参照前文章 tfile_model_run_yolov8n.py 后半部分其实搞清 U65 输出是按1344 遍历即可其余部分没有改动。arr np.array(data, dtypenp.int8).reshape((1344, 84), orderF)导入数据可以看到前4列为坐标后80列为置信度-128 对应 int8 格式下的最小值。最后结果和 Python 调用 Tensorflow lite 运行模型推理程序完全一致。

相关新闻

服装店主图踩坑:AI出图 vs 摄影棚实拍,平台到底会不会限流

服装店主图踩坑:AI出图 vs 摄影棚实拍,平台到底会不会限流

这个问题,是我们店老板去年年底揪着我问了三遍的:"你用AI出的图,平台会不会判违规、会不会限流降权?"说实话,一开始我心里也没底。网上一半人说"AI图会被限流",一半人说"根本没事…

2026/7/18 23:27:01阅读更多 →
LLM可观测性工具对比:LangSmith与LangFuse与Helicone的场景化评估与成本分析

LLM可观测性工具对比:LangSmith与LangFuse与Helicone的场景化评估与成本分析

LLM可观测性工具对比:LangSmith与LangFuse与Helicone的场景化评估与成本分析 一、LLM可观测性的独特挑战:传统APM在这里全部失效 传统的应用性能监控(APM)工具——Datadog、New Relic、PrometheusGrafana——在监控LLM应用时几乎完…

2026/7/18 23:25:01阅读更多 →
Blender全流程部署AI建模插件教程 | 零门槛实现AI驱动3D创作

Blender全流程部署AI建模插件教程 | 零门槛实现AI驱动3D创作

Blender:3.0及以上版本(推荐4.0,稳定性更佳)Cursor:最新正式版(已内置MCP协议支持,无需额外安装插件)(用别的 trae、claude code、codex也是一样的,仅配置mcp…

2026/7/18 23:25:01阅读更多 →
日记本横线纸张效果:serif 字体 + 行高 + 背景色

日记本横线纸张效果:serif 字体 + 行高 + 背景色

前言 在“海风日记“的日记详情页中,正文区域使用了纸张感的设计:象牙色背景、serif 衬线字体、36vp 行高,模拟了传统日记本的横线纸张效果。 本文将从源码出发,深入讲解纸张效果的实现,以及字体选择、行高控制和背景…

2026/7/19 1:13:17阅读更多 →
UE引擎FUObjectArray内存逆向解析与工业软件上云实践

UE引擎FUObjectArray内存逆向解析与工业软件上云实践

1. 项目概述:当UE逆向遇上工业软件上云最近在折腾一个基于Unreal Engine(UE)的工业仿真软件逆向项目,核心目标是想搞清楚它内部对象管理的“心脏”——FUObjectArray的内存结构。这玩意儿是UE引擎里所有UObject(游戏对…

2026/7/19 1:13:17阅读更多 →
你的企业正在 AI 搜索里“隐形”:GEO 时代,不做这步就输了

你的企业正在 AI 搜索里“隐形”:GEO 时代,不做这步就输了

AI搜索浪潮下,企业像海中小岛需要被“灯塔”标记才能被巨轮发现 你有没有发现,现在大家遇到问题,第一反应不再是打开百度,而是打开豆包、DeepSeek 问一句“这个牌子靠谱吗”“哪家做这个好”?用户获取信息的入口&#…

2026/7/19 1:13:17阅读更多 →
LangGraph+MCP构建概率化企业智能体:从确定性规则到可信推理

LangGraph+MCP构建概率化企业智能体:从确定性规则到可信推理

1. 项目概述:当企业智能不再依赖“确定性脚本”,而是学会像人一样权衡与试错你有没有遇到过这样的场景:销售团队每天要从几百条客户线索里手动筛选高意向客户,规则是“近30天访问过价格页下载过白皮书所在行业为制造业”&#xff…

2026/7/19 1:13:17阅读更多 →
意识量化建模:从神经动力学到动态整合度的工程实践

意识量化建模:从神经动力学到动态整合度的工程实践

1. 这不是哲学思辨,而是一场严肃的建模工程“Let’s Quantify Consciousness — Rethinking it Mathematically”——这个标题一出现,我立刻放下手头三个在跑的神经数据 pipeline,把咖啡杯推到一边。它不是又一篇用“涌现”“整合信息”当万能…

2026/7/19 1:13:17阅读更多 →
小数据革命:小企业低成本高效数据实践指南

小数据革命:小企业低成本高效数据实践指南

1. 小数据革命:小企业真正用得上、养得起、见效快的数据实践“小数据革命”这个词,最近两年在咨询公司PPT里出现频率很高,但翻来覆去讲的都是“如何用AI分析千万级用户行为”,或者“搭建湖仓一体架构打通全链路”。我听了三场闭门…

2026/7/19 1:11:17阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →