APB总线协议深度解析与VIP验证实战:从时序细节到UVM环境搭建
1. 项目概述从总线协议到验证IP的实践之路在数字芯片设计的验证环节APB总线协议和对应的VIP使用是每个验证工程师从入门到进阶都无法绕开的必修课。APB即Advanced Peripheral Bus作为ARM AMBA总线家族中最基础、最简洁的一员它承担着连接低带宽、低功耗外设与控制器的重任。你可能会觉得它简单不就是几个信号读写操作嘛。但恰恰是这种“简单”在实际项目中埋下了最多的坑时序理解偏差导致采样错误、VIP配置不当引发大量虚假错误、甚至因为对协议细节的模糊而浪费数周调试时间。我自己就曾在一个电源管理模块的验证中因为对PREADY信号的延迟处理想当然导致整个验证环境的基础通信层都不稳定后续所有测试案例的结果都失去了可信度教训深刻。而VIP即Verification IP则是应对这些挑战的“标准化武器库”。它不是一个可以随意破解或解锁的“会员功能”而是需要深入理解、正确配置的专业工具。网络上流传的所谓“VIP破解教程”或“解锁版”在严肃的工业级芯片开发中毫无意义甚至极其危险——它们通常意味着未知的漏洞、不稳定的行为模型以及可能的知识产权风险。真正的价值在于如何基于一个成熟、可靠的商用或开源VIP构建出高效、健壮的验证环境。本文将彻底拆解APB总线协议的核心细节并基于一个典型的UVM验证环境分享如何正确、高效地使用APB VIP涵盖从环境搭建、序列编写、到错误注入和覆盖率收集的全流程实操经验与避坑指南。无论你是正在学习SystemVerilog和UVM的在校生还是刚刚接触实际验证项目的工程师都能从中找到可直接复用的代码片段和经过实战检验的思路。2. APB总线协议深度解析与关键时序很多人对APB协议的第一印象来自那张经典的状态机图IDLE, SETUP, ACCESS。这没错但如果你只停留在记住这三个状态那在实际操作中一定会碰壁。APB协议的真正精髓藏在每个信号的边沿关系和那些“默认但易错”的规则里。2.1 信号定义与功能角色剖析APB协议信号不多但每个都肩负着明确的职责理解错一个通信就会失败。PCLK 与 PRESETn这是整个总线的心脏和复位开关。所有信号都在PCLK的上升沿被采样。这里有一个关键点PRESETn是低电平有效的异步复位。这意味着VIP和DUT待测设计中的APB接口逻辑必须确保在复位释放后与PCLK同步的第一个上升沿到来时总线进入一个确定的IDLE状态。我见过不少问题是因为VIP的复位释放时机与DUT的时钟域不同步导致一出来就状态错乱。PADDR[31:0]地址总线。它仅在地址周期PSELx为高后的第一个时钟周期有效。这是一个非常重要的节省功耗的设计但也是新手容易忽略的地方。在ACCESS周期即使传输尚未完成PREADY为低PADDR也可能会改变如果主机发起新的传输或者保持不变这取决于主机的实现。你的VIP和DUT必须对此有一致的预期。PSELx从设备选择信号。这是“x”意味着它通常是每个从设备独有的片选信号。PSELx在SETUP周期变高并持续到当前传输的最后一个ACCESS周期。最常见的错误是把PSELx当成像PENABLE一样的全局使能实际上它必须精准地对应到目标从设备的地址范围。在验证环境中我们通过配置VIP的地址映射表address map来驱动正确的PSELx。PENABLE传输使能信号。它在SETUP周期后的下一个时钟周期变高标志着ACCESS周期的开始。PENABLE为高是PREADY信号生效的前提。你可以把它理解为“数据相位正式开始”的标志旗。PWRITE方向控制。高为写低为读。它在SETUP周期确立并在整个传输过程中保持稳定。PWDATA[31:0]与PRDATA[31:0]写数据与读数据总线。PWDATA由主机在写传输的ACCESS周期提供PRDATA由从设备在读传输且PREADY为高的那个周期提供。这里有一个关键时序对于读操作从设备必须在PREADY拉高的同一个周期提供有效的PRDATA。PREADY从设备就绪信号。这是APB实现等待状态的核心。当从设备需要更多时间处理请求时可以将PREADY拉低主机必须等待。一个高级技巧PREADY可以插入任意多个等待周期但PSELx和PENABLE必须持续保持有效直到PREADY拉高、传输完成。在构建VIP的slave从设备模型时模拟不同的PREADY延迟是验证主机兼容性的重要手段。PSLVERR传输错误指示。这是一个可选的信号用于指示传输失败例如访问了非法地址。当PREADY为高且PSLVERR为高时表示当前传输以错误结束。主机需要根据协议处理该错误。在验证中我们需要主动生成PSLVERR来测试DUT的错误处理机制是否健全。2.2 读写传输时序的魔鬼细节光看文字定义不够必须结合波形图理解。我们以最常见的零等待状态传输为例但重点分析那些有等待状态和背靠背传输的情况。零等待写传输T0 (IDLE):PSELx0,PENABLE0。T1 (SETUP):PADDR,PWRITE1,PWDATA,PSELx同时变为有效。PENABLE仍为0。T2 (ACCESS):PENABLE拉高。从设备在T2的上升沿看到PSELx1,PENABLE1,PREADY1假设零等待因此采样PWDATA完成写入。传输结束所有信号在T3回到IDLE状态。关键点主机在T1给出的PWDATA必须稳定直到从设备在T2采样。在VIP的sequence序列中我们需要确保在驱动SETUP相位时数据已经准备好。带等待状态的读传输T1 (SETUP):PADDR,PWRITE0,PSELx有效。T2 (ACCESS 1):PENABLE拉高但从设备将PREADY拉低。T3 (ACCESS 2):PREADY持续为低。PSELx和PENABLE必须保持为高PADDR和PWRITE也必须保持稳定。T4 (ACCESS 3): 从设备拉高PREADY并在同一周期提供有效的PRDATA。主机在T4的上升沿采样PRDATA传输完成。避坑指南在编写slave behavior模型或使用VIP的slave agent时控制PREADY的拉高时机必须与提供PRDATA的时机严格同步。我遇到过一种bug模型用了一个内部计数器延迟PREADY但提供PRDATA的逻辑是另一个线程两者脱节导致主机采样到了错误数据或前一拍的数据。背靠背传输 这是APB协议提升效率的一种方式。当前一个传输在Tn周期完成PREADY拉高时下一个传输的SETUP相位可以在Tn周期就建立。这意味着在Tn周期总线上同时存在前一个传输的结束PENABLE1,PREADY1和下一个传输的开始PSELx’1, 新PADDR有效。这对DUT的设计提出了要求从设备必须能在同一个时钟沿既完成对前一次传输数据的处理或提供读数据又能采样新的地址和命令。在验证时我们必须用VIP生成背靠背的随机传输序列来压力测试DUT的接口处理能力。3. APB VIP的架构与集成实战理解了协议我们来看如何用VIP搭建验证环境。一个典型的APB UVM VIP通常包含apb_master_agent、apb_slave_agent、apb_monitor、apb_sequencer以及一系列apb_sequence。我们的目标不是“破解”它而是驾驭它。3.1 VIP组件选型与环境搭建首先你面临选择使用Synopsys、Cadence等公司的商用VIP还是使用开源VIP如来自Verification Academy或GitHub上的某些项目对于学习和中小项目成熟的开源VIP是绝佳的起点。它们通常代码清晰符合UVM标准而且免费。环境集成步骤文件包含将VIP的所有SystemVerilog文件.sv添加到你的编译文件列表如Makefile, .f文件中确保编译顺序正确先编译基础包uvm_pkg和VIP的package再编译你的测试平台。实例化Agent在测试平台顶层tb_top或环境类env中实例化APB Master Agent和/或Slave Agent。// 在env类中声明 apb_master_agent m_apb_mst_agt; apb_slave_agent m_apb_slv_agt; // 在build_phase中创建和配置 function void my_env::build_phase(uvm_phase phase); super.build_phase(phase); // 创建Master Agent用于驱动DUT的APB接口 m_apb_mst_agt apb_master_agent::type_id::create(“m_apb_mst_agt”, this); // 创建Slave Agent用于模拟DUT下游的APB从设备如果需要 m_apb_slv_agt apb_slave_agent::type_id::create(“m_apb_slv_agt”, this); endfunction配置地址映射这是最关键的一步。你必须正确配置Master Agent的虚拟序列器virtual sequencer或配置对象configuration object中的地址映射表。这个表定义了从PADDR到PSELx的映射关系必须与DUT内部解码器的设计完全一致。// 通常在test基类或env的configure阶段进行 apb_config cfg apb_config::type_id::create(“cfg”); cfg.add_memory_range(‘h0000_0000, ‘h0000_0FFF, 0); // 地址范围对应PSEL0 cfg.add_memory_range(‘h0000_1000, ‘h0000_1FFF, 1); // 对应PSEL1 uvm_config_db#(apb_config)::set(this, “m_apb_mst_agt*”, “cfg”, cfg);经验之谈这里的地址错误是初期最常见的集成失败原因。务必使用与DUT RTL代码中完全相同的地址常量define或parameter最好能通过一个共用的配置文件来管理。3.2 核心操作序列Sequence的编写与执行VIP的强大之处在于你可以通过编写高层次的sequence来描述总线事务而不用关心底层的信号驱动时序。一个基本的写序列class simple_write_seq extends uvm_sequence #(apb_master_transaction); rand bit [31:0] addr; rand bit [31:0] data; uvm_object_utils(simple_write_seq) task body(); apb_master_transaction tr apb_master_transaction::type_id::create(“tr”); tr.addr addr; tr.data data; tr.direction APB_WRITE; tr.starting_phase get_starting_phase(); start_item(tr); tr.print(); finish_item(tr); endtask endclass一个带约束的随机读序列class random_read_seq extends uvm_sequence #(apb_master_transaction); rand bit [31:0] start_addr; rand int num_trans; constraint addr_cstr { start_addr inside {[‘h0000_0000:‘h0000_0FFF]}; } // 只在PSEL0范围内读 constraint num_cstr { num_trans inside {[1:10]}; } task body(); repeat(num_trans) begin apb_master_transaction tr; tr apb_master_transaction::type_id::create(“tr”); assert(tr.randomize() with { addr start_addr; direction APB_READ; }); start_item(tr); finish_item(tr); start_addr 4; // 地址递增 end endtask endclass如何在测试中启动序列class my_test extends uvm_test; simple_write_seq wr_seq; random_read_seq rd_seq; task run_phase(uvm_phase phase); phase.raise_objection(this); wr_seq simple_write_seq::type_id::create(“wr_seq”); rd_seq random_read_seq::type_id::create(“rd_seq”); // 配置写操作 assert(wr_seq.randomize() with { addr 32’h0000_0100; data 32’hA5A5_A5A5; }); wr_seq.start(env.m_apb_mst_agt.sequencer); // 在master sequencer上启动 #100ns; // 等待一些时间 // 启动随机读序列 assert(rd_seq.randomize() with { num_trans 5; }); rd_seq.start(env.m_apb_mst_agt.sequencer); phase.drop_objection(this); endtask endclass3.3 响应处理与监测器Monitor的使用仅仅驱动事务不够我们还需要检查DUT的响应是否正确。这主要通过Monitor和Scoreboard记分板来完成。MonitorVIP自带的apb_monitor会自动在APB接口上捕捉所有总线事务无论它是来自VIP Master驱动还是来自DUT的响应。它会将捕捉到的事务apb_transaction通过Analysis Port广播出去。Scoreboard我们创建一个记分板订阅Monitor的分析端口。对于写操作记分板可以预测DUT内部寄存器的值对于读操作记分板将Monitor捕获到的实际读数据与预期值进行比较。class my_scoreboard extends uvm_scoreboard; uvm_analysis_imp_apb #(apb_transaction, my_scoreboard) apb_imp; bit [31:0] reg_model[bit [31:0]]; // 一个简单的寄存器模型用于存储预期值 function new(string name, uvm_component parent); super.new(name, parent); apb_imp new(“apb_imp”, this); endfunction function void write_apb(apb_transaction tr); if (tr.direction APB_WRITE) begin // 更新预期寄存器模型 reg_model[tr.addr] tr.data; uvm_info(“SCB”, $sformatf(“Predicted write: addr’h%h, data’h%h”, tr.addr, tr.data), UVM_MEDIUM) end else if (tr.direction APB_READ) begin bit [31:0] expected_data reg_model.exists(tr.addr) ? reg_model[tr.addr] : 32’hx; if (tr.data ! expected_data) begin uvm_error(“SCB”, $sformatf(“Read mismatch! Addr’h%h, Expected’h%h, Actual’h%h”, tr.addr, expected_data, tr.data)) end else begin uvm_info(“SCB”, $sformatf(“Read match: addr’h%h, data’h%h”, tr.addr, tr.data), UVM_HIGH) end end endfunction endclass连接Monitor和Scoreboard在env的connect_phase中将monitor的analysis_port连接到scoreboard的analysis_imp。function void my_env::connect_phase(uvm_phase phase); m_apb_mst_agt.monitor.ap.connect(scoreboard.apb_imp); endfunction4. 高级验证场景与调试技巧当基础读写验证通过后我们需要用VIP构造更复杂的场景以发现更深层次的缺陷。4.1 错误注入与异常测试一个健壮的DUT必须能正确处理异常情况。APB VIP可以方便地注入错误。生成SLVERR错误在sequence中可以设置transaction的slverr字段。tr.direction APB_READ; tr.addr 32’hDEAD_BEEF; // 一个非法的地址 // 假设VIP支持通过配置或transaction属性来触发从设备返回SLVERR tr.generate_slverr 1; // 具体属性名需参考VIP文档然后你需要检查DUT在收到PSLVERR后是否正确中断了操作如果设计如此。没有将错误数据写入内部寄存器。可能置位了某个错误状态寄存器。测试PREADY超时虽然APB协议本身没有规定PREADY必须在一定周期内响应但你的DUT内部可能有超时逻辑。你可以配置VIP的slave agent使其在某些特定地址的访问中永不拉高PREADY以此来测试DUT的超时机制是否生效。协议违例测试使用force或直接通过VIP的driver驱动非法时序。例如在PENABLE为高时突然改变PADDR或者在PSELx为低时驱动PREADY为高。注意这类测试通常需要在direct test模式下进行并小心使用因为可能破坏VIP的正常状态机。4.2 功能覆盖率模型构建验证的完备性需要覆盖率来衡量。我们需要定义并收集与APB接口相关的功能覆盖率。事务级覆盖点covergroup apb_trans_cg with function sample(apb_transaction tr); // 地址范围覆盖 addr_range: coverpoint tr.addr { bins low_mem {[‘h0000_0000:‘h0000_0FFF]}; bins high_mem {[‘h0000_1000:‘h0000_1FFF]}; bins illegal default; } // 读写操作交叉 rw_cross: coverpoint tr.direction { bins write {APB_WRITE}; bins read {APB_READ}; } // 等待周期数 ready_delay: coverpoint tr.ready_delay { // 假设transaction中有这个属性 bins zero_wait {0}; bins one_wait {1}; bins two_wait {2}; bins many_wait {[3:10]}; } // 读写与地址的交叉 rw_x_addr: cross rw_cross, addr_range; // 错误注入覆盖 slverr_cover: coverpoint tr.slverr { bins no_error {0}; bins with_error {1}; } endgroup在scoreboard的write_apb函数或一个专门的coverage collector中采样捕捉到的事务。时序相关覆盖点这需要从Monitor中提取更细粒度的信息例如背靠背传输发生的频率、不同PREADY延迟下传输的间隔等。有时需要扩展VIP的Monitor来收集这些信息。4.3 典型问题排查实录即使环境搭建正确调试阶段也总会遇到各种问题。以下是一些常见问题及排查思路问题一VIP Driver没有驱动任何信号波形全是X/Z。检查首先确认run_test()是否被调用测试的run_phase中的objection是否被raise。使用UVM的UVM_TESTNAME命令行参数指定你的测试类。检查Sequence是否成功启动在sequence的body()任务开始处加uvm_info打印。确认start_item()和finish_item()被调用。检查Sequencer和Driver是否连接正确在env的connect_phase中确认agent.sequencer连接到了agent.driver。问题二读写数据不正确Scoreboard报大量mismatch。检查首先在波形上看最底层的信号。确认PADDR、PWDATA、PRDATA的值是否符合预期。PSELx信号是否正确可能地址映射配置错误。检查DUT的时钟和复位是否与VIP同步VIP的PCLK和PRESETn是否连接到了DUT的正确端口检查读操作的时序。DUT是否在PREADY拉高的同一个周期给出了PRDATAMonitor采样到的数据是否与波形上的数据一致检查Scoreboard的预期值模型reference model是否正确第一个写操作的数据是否被正确预测问题三仿真随机挂起不再进行。检查最常见的原因是PREADY一直为低主机在无限等待。检查你的slave behavior模型或VIP slave agent的配置是否在某些条件下忘记拉高PREADY。检查是否存在死锁例如DUT需要APB配置完成后才响应PREADY而你的测试序列在等待DUT响应后才进行配置。检查使用仿真器的调试工具查看所有线程process的状态找到哪个线程在等待。问题四背靠背传输时数据丢失或错乱。检查DUT的接口逻辑是否能处理背靠背传输重点检查其内部的数据路径和状态机是否在完成当前传输前就采样了下一个传输的地址。检查VIP驱动的背靠背时序是否符合协议SETUP相位是否紧接在上一个传输完成的同一个时钟沿调试的心得是永远从波形和信号层开始这是最真实的证据。UVM报告uvm_info/error和日志是第二层线索。不要一上来就漫无目的地修改代码先花时间把波形看明白问题往往就暴露出来了。

相关新闻

从ECDSA随机数重用漏洞到私钥破解:CTF实战与数学推导

从ECDSA随机数重用漏洞到私钥破解:CTF实战与数学推导

1. 项目概述:当ECDSA签名不再“安全”在CTF的密码学赛道上,ECDSA(椭圆曲线数字签名算法)相关的题目一直是区分选手水平的一道分水岭。它不像基础的RSA那样有大量现成的攻击脚本,也不像AES对称加密那样直观。ECDSA以其数…

2026/7/29 3:55:48 阅读更多 →
Windows内网信息收集实战:从系统命令到自动化工具链

Windows内网信息收集实战:从系统命令到自动化工具链

1. 项目概述:为什么内网信息收集是攻防的基石 在网络安全领域,尤其是渗透测试和红队评估中,内网信息收集是一个无法绕开的起点。你可以把它想象成一场战役前的侦察行动。当攻击者通过某种方式(比如一个钓鱼邮件、一个暴露在公网的…

2026/7/29 3:55:48 阅读更多 →
仿BOSS招聘平台实现(5)

仿BOSS招聘平台实现(5)

管理者端-查询企业列表apis层enterprise_router.get("/list", summary"查询企业列表", description"查询企业列表") async def select_enterprise_list(page: int Query(1, title"页码", description"页码", ge1),page_siz…

2026/7/29 3:55:48 阅读更多 →

最新新闻

Android 7系统休眠唤醒(八)内核层—Alarm定时唤醒与硬件唤醒源

Android 7系统休眠唤醒(八)内核层—Alarm定时唤醒与硬件唤醒源

系列目录:第一篇:电源管理架构全景图 | 第二篇:开机全链路 | 第三篇:关机/重启全链路 | 第四篇:休眠唤醒与开关机对比 | 第五篇:休眠全链路 | 第六篇:唤醒全链路 | 第七篇:wakelock与…

2026/7/29 4:04:52 阅读更多 →
如何在Windows平台上实现智能化的演示时间管理?

如何在Windows平台上实现智能化的演示时间管理?

如何在Windows平台上实现智能化的演示时间管理? 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 演示时间控制是专业演讲者面临的核心挑战之一。无论是学术会议、商务汇报还是教学场景,精…

2026/7/29 4:04:52 阅读更多 →
单片机C语言预处理指令实战:从宏定义到条件编译的嵌入式开发内功

单片机C语言预处理指令实战:从宏定义到条件编译的嵌入式开发内功

1. 项目概述:为什么预处理指令是单片机开发的“内功心法”?如果你刚开始玩单片机,可能觉得写代码就是对着芯片手册,把寄存器配置好,让LED灯闪起来就完事了。但当你真正开始做一个稍微复杂点的项目,比如要管…

2026/7/29 4:04:52 阅读更多 →
AI Agent开发入门:从零搭建智能体的完整链路与实践指南

AI Agent开发入门:从零搭建智能体的完整链路与实践指南

最近在技术社区里,经常看到有人问:AI Agent 开发到底从哪开始?是直接上手写代码,还是先学透 Transformer?是跟着热门项目跑一遍,还是先搞清楚 SFT 和 RLHF 的区别?更实际的问题是:学…

2026/7/29 4:04:52 阅读更多 →
C++字符串数组输入:从cin到getline的缓冲区管理与实战避坑指南

C++字符串数组输入:从cin到getline的缓冲区管理与实战避坑指南

1. 项目概述:一个看似简单却暗藏玄机的“入门级”问题刚接触C那会儿,字符串数组的输入问题,绝对是我踩过的第一个大坑。表面上看,不就是用个cin或者getline读几行字符串嘛,能有多复杂?但真上手写代码&#…

2026/7/29 4:04:52 阅读更多 →
Python对接京东联盟API实战:从签名算法到高并发数据采集

Python对接京东联盟API实战:从签名算法到高并发数据采集

1. 项目概述:为什么用Python对接京东联盟API如果你正在做电商相关的项目,或者想通过技术手段获取京东平台的商品数据、生成推广链接,那么直接调用京东联盟的API接口几乎是必经之路。我最近刚完成一个项目,核心就是用Python来对接这…

2026/7/29 4:03:51 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻