乐于分享
好东西不私藏

当芯片验证开始像软件测试一样写代码:Cocotb启示录

当芯片验证开始像软件测试一样写代码:Cocotb启示录

IBM Research在2024年欧洲一个行业会议上分享了一个故事

他们的内部验证框架,用了几十年的C++代码,堆积了太多东西。新来的设计师根本搞不定,连做一个简单的单元测试都要花好几天搭环境。

然后他们做了一件事。

给设计师们配了一个Python环境,用了一个叫Cocotb的开源库。

新来的员工,1个小时搭好环境,24小时内写出了第一个测试。

24小时。

你想想看,一个搞芯片设计的公司,让一个新员工在一天之内就能上手写验证测试。这放在十年前,几乎不可想象。

但这帮人就这么干了。


这事儿的源头,是一条很不起眼的行业报告。

在半导体设计与验证的漫长演进史中,验证环节始终被视为资源消耗最密集、技术挑战最严峻的阶段。随着芯片复杂度指数级增长,以SystemVerilog和UVM为代表的传统验证体系,虽然占据统治地位,但高昂的学习门槛、冗长的开发周期,正逐渐成为限制设计迭代效率的瓶颈。

在这个背景下,一个叫Cocotb的东西,正引领着一场从硬件描述语言向Python转移的范式革命。

目前,Cocotb已在35%的ASIC设计和超过40%的FPGA设计中得到应用。

它的存在,让硬件测试变得更像软件测试。

而这,正是半导体行业通往全自动化验证时代的必经之路。


你可能要问了,硬件验证不是最硬核的东西吗?怎么会跟Python扯上关系?

先解释一下验证是干什么的。

芯片设计好之后,你得验证它是不是按预期工作的。就像你写了一个程序,得写测试用例跑一遍,看看有没有bug。

在传统流程里,硬件验证用的是HDL语言。VHDL、Verilog、SystemVerilog这些。这些语言是专门为描述硬件结构设计的,写起来极其繁琐。一个简单的测试任务,可能要写几十行代码,而且改了之后还要经历漫长的重新编译和链接。

这玩意效率太低了。

Cocotb的出现,就是把验证逻辑从HDL转移到Python。

它允许验证工程师用Python编写测试平台,而把VHDL、Verilog或SystemVerilog留给可综合的硬件设计本身。

这不是语言层面的简单切换,是验证思维的重塑。

它将硬件验证视作软件开发过程,引入了自动化测试、持续集成和丰富的Python库生态。


你可能会说,这听起来不错,但硬件验证不是最核心的环节吗?怎么能让Python这种解释型语言来干?

这个问题问得好。但恰恰是这种质疑,说明了传统验证体系的问题有多深。

Cocotb通过三个核心机制,从根本上改变了这个局面。

第一个机制,即时反馈。

Python作为解释型语言,修改测试代码后直接重新运行,无需漫长的编译链接。这大大缩短了调试循环。同时,Python的语法极其简洁,全语言只有25个关键字。同等功能的验证代码,量级只有SystemVerilog的几分之一。

第二个机制,自动化测试发现。

Cocotb利用Python的装饰器机制,比如@cocotb.test(),框架能够自动识别并注册测试函数,无需额外步骤将其添加到回归测试集。这种所见即所得的方式,极大降低了维护回归套件的复杂度。

第三个机制,也是最骚的,它直接调用了Python生态系统中超过40万个第三方扩展包。

这40万个包里,跟验证直接相关的至少有几万个。

网络协议验证?Scapy、Requests,直接生成复杂的协议报文。

信号处理与算法?NumPy、SciPy,构建黄金模型进行对比。

图像处理?OpenCV、Pillow,直接读取真实图像文件作为激励。

形式化验证?PyVSC、Z3,通过SMT求解器实现约束随机激励生成。

应用领域

Python 生态支持

网络协议验证

Scapy, Requests

信号处理与算法

NumPy, SciPy

图像与视频处理

OpenCV, Pillow

形式化与约束

PyVSC, Z3

一个搞芯片的人,坐在电脑前,用Python写验证脚本,旁边挂着SciPy和NumPy的文档。

这画面,放在五年前,几乎没人敢想。


说到这,我突然想到了一个细节。

Cocotb不是通过外部进程间通信来跟仿真器打交道的。

它是把Python解释器直接嵌入到仿真器的进程空间里。

这意味着什么?

意味着没有跨进程通信带来的巨大延迟。交互是实时的、高效的。

它的底层架构设计了一个叫GPI的C++抽象层。Generic Procedural Interface。这个抽象层的作用,类似于软件开发中的HAL,将不同标准的仿真器接口统一为一套通用的C API。

它支持包括Synopsys VCS、Cadence Xcelium、Siemens Questa在内的商业软件,以及Icarus Verilog、Verilator、GHDL等开源工具。

仿真器中立性。这玩意在商业世界里太重要了。

你不需要绑定某个特定的仿真器,你可以换。


硬件电路本质上是高度并发的。为了在单线程的Python环境中模拟这种并发性,Cocotb用了Python 3.5+引入的异步编程框架。

在Cocotb中,每一个测试用例或独立的验证逻辑都被定义为一个协程。协程通过显式地挂起自己来允许其他任务运行或让仿真时间推进。

这种协作式多任务模型,相比于多线程模型,具有极低的上下文切换开销,且不存在复杂的锁机制,使得代码逻辑更加清晰。

核心触发器是协程调度的关键点。

Timer,用于表示物理时间的经过,比如await Timer(10, units='ns')

Edge、RisingEdge、FallingEdge,用于同步信号的变化,比如等待时钟上升沿。

ReadOnly,这是一个极其关键的同步点,它确保Python代码在仿真器完成当前时间步的所有信号更新后再读取值,从而避免竞争条件。

Combine、First,允许对多个触发器进行逻辑组合,比如等待信号A上升沿或超时计时器先到达。

听起来很复杂对吧。

我还是用大白话举个例子。

你想验证一个SPI接口,传统的做法是写一堆VHDL的always块,然后手动处理时序。

用Cocotb的话,你只需写

await RisingEdge(clk)data = yield dut.mosidut.miso <= expected_data

就这么几行。


但Cocotb的出现,并非旨在完全消灭现有的验证工具,而是通过提供一种更高效、更具现代性的替代路径,重塑验证栈的各个层级。

我来逐一展示一下它能替代什么。

替代传统HDL测试平台。

Cocotb普及之前,大多数验证工作是使用VHDL或Verilog编写测试平台。这种方法的一大局限在于,HDL语言本质上是为描述硬件结构设计的,缺乏处理复杂算法、文件I/O和动态内存管理的能力。

Cocotb替代了这些冗长且难以维护的HDL代码,将验证逻辑转移到Python中。这使得复杂的测试场景变得异常简单,比如从CSV文件读取数千个测试向量,或者动态构建大型随机数据包。工程师不再需要编写复杂的HDL包装器,DUT可以直接以顶层模块的形式在仿真器中实例化。

作为SystemVerilog UVM的有力竞争者或补充。

虽然SystemVerilog UVM是目前ASIC验证的工业标准,但其极高的复杂度已成为中小型项目和FPGA开发的重担。Cocotb提供了一种轻量级UVM的替代方案。

它替代了UVM的复杂语法,使用Python语言特性实现了UVM中的设计重用和随机测试哲学,但没有复杂的宏和深奥的类分层结构。

它替代了受限随机生成,通过集成pyvsc库,能够替代SystemVerilog原生的rand和constraint语法,利用SMT求解器提供同等强度的约束随机测试能力。

它替代了UVM报告系统,利用Python标准logging模块,提供了更灵活的日志控制、格式化和外部集成方案。

替代专用C/C++ PLI/DPI开发。

在需要极高性能或需要与C语言模型交互时,工程师传统上会编写基于VPI、DPI的C/C++代码。这类代码开发难度大,容易导致内存泄漏和仿真崩溃。

Cocotb实际上扮演了仿真器与高级语言之间的通用网关。通过Python的ctypes和cffi,工程师可以直接在Python测试平台中调用C函数,或者像IBM那样使用Cython编写适配器来利用现有的C++验证IP。

这替代了为每个新项目编写特定PLI逻辑的需求,使接口开发变得模块化和可重用。

替代落后的自动化与脚本体系。

传统的EDA环境通常依赖于由Makefile、Perl和Shell脚本组成的复杂胶水层来驱动仿真。这种体系维护困难,跨平台兼容性差。

Cocotb通过内置的Python测试运行器和pytest的原生支持,替代了零散的脚本工具。验证环境本身就是一个完整的Python包,可以利用标准的包管理工具进行版本控制和分发。

替代层级

传统方法

Cocotb 替代方案

激励产生与监测

VHDL/Verilog Task/Always

Python Async Coroutines

验证架构

UVM Class Library

Python Classes / pyuvm

交互接口

专用 C/C++ PLI 代码

Python + PyGPI

回归与自动化

Shell/Perl/Makefile 脚本

Python + Pytest


我读到这儿的时候,突然被一个细节击中了。

Antmicro利用Cocotb为谷歌的CFU Playground项目优化了一个SoC互联总线。

他们采用了软件工程中流行的测试驱动开发模式

先写测试,在修改总线逻辑以支持猝发模式之前,先编写覆盖所有总线事务类型的Python测试用例。

单元测试,针对FIFO、SRAM等每个外设编写独立的单元测试。

快速迭代,利用pytest运行数千个参数化的随机测试用例,确保新功能的加入没有破坏原有Classic模式。

通过这种方法,他们成功将VexRiscv核心的顺序内存读取速度提升了26%。

测试驱动开发。

这在软件行业已经是一个再普通不过的概念了。

但在硬件设计领域,用TDD来优化SoC互联总线,这画面,太科幻了。


Cocotb 2.0的发布,标志着该框架进入了成熟期。

这一版本通过破坏性的API清理和性能增强,解决了1.x系列中长期存在的痛点,并进一步强化了其作为现代验证工具的地位。

数据模型的重构。

1.x版本中,信号值的处理依赖于BinaryValue类。虽然功能完备,但在处理符号数、不同位宽的算术运算以及与Python原生整数的转换时存在诸多不便。

Cocotb 2.0引入了全新的LogicArray类型作为默认的逻辑向量表示。这一改变不仅提升了类型安全性,还显著增强了代码的可读性。

提供to_unsigned()、to_signed()、from_bytes()等直观方法。引入Range对象,显式定义downto和to属性,并支持Python风格的切片。部分核心逻辑下沉到C++,减少了Python层的开销。

性能优化的突破。

性能一直是Cocotb的一个挑战,特别是在时钟周期极短的大规模仿真中。2.0版本针对这一瓶颈引入了两项重大技术。

GpiClock,在1.x中,时钟生成通常是一个在Python协程中循环的Timer。这意味着每个时钟半周期都会产生两次跨Python仿真器边界的上下文切换。GpiClock将时钟生成的逻辑下沉到了底层C++ GPI库中。一旦配置完成,时钟在仿真器内部运行,不再需要频繁唤醒Python解释器,从而大幅提升了纯逻辑仿真的吞吐量。

信任惯性写,这是一个可选模式,允许Cocotb直接利用仿真器原生的写操作行为,减少了为了保证原子性而进行的额外握手开销。

构建系统的现代化。

传统Cocotb严重依赖GNU Make。虽然强大,但对Windows用户和习惯于现代Python开发流的人来说并不友好。2.0版本正式推广了基于Python的测试运行器。

通过Runner.build()和Runner.test()函数,验证环境可以完全通过Python脚本进行配置。这种方式的优势在于跨平台一致、参数化极其简单,一套代码生成数十个不同硬件配置的仿真任务,以及IDE支持,配置信息是纯Python代码,支持IDE的语法检查和自动补全。


Cocotb的生命力通过一系列成功的工业级案例得到了验证。这些案例不仅展示了其功能,更揭示了不同类型的企业如何根据自身需求定制验证流程。

IBM Research的故事已经提过了,新人在24小时内写出第一个测试。但更深层的意义在于,IBM用Cython编写了转换层,保护了过去数十年积累的庞大C++验证IP。这让Python代码可以像调用原生对象一样操作复杂的C++ TileLink驱动程序。

早期验证优势也体现在这里,设计师在将代码移交给专门的验证团队前,已经通过Cocotb进行了充分的单元验证。当验证工程师接手时,他们可以基于设计师留下的Python脚本直接扩展随机化场景和覆盖率分析。

CERN的ATLAS项目是另一个典型案例。

在CERN的粒子探测器升级项目中,验证的准确性至关重要。宾夕法尼亚大学工程团队使用Cocotb验证了多款65nm和130nm工艺的ASIC芯片。

他们选择Cocotb的理由非常务实在一个物理研究环境中,大部分参与者是软件工程师或物理学家,他们对Python极其精通,但对SystemVerilog却感到陌生。Cocotb允许这些专家直接编写验证数学模型,并将其与硬件实现进行逐周期比对,显著降低了开发成本。

这不是一个技术驱动的故事,而是一个人才驱动的故事。

你想想看,一群物理学家,不会写SystemVerilog,但会用Python。Cocotb让他们能够直接参与到硬件验证中。

这桥接了硬件与软件之间的团队鸿沟。

在现代SoC开发中,硬件设计与固件/驱动开发往往是并行进行的。Cocotb由于采用了软件开发人员更为熟悉的Python语言,成为了跨团队协作的天然桥梁。软件工程师可以直接参与到硬件IP的早期验证中,编写驱动级别的测试用例,而无需学习深奥的HDL语法。

这种协作模式不仅提升了IP的交付质量,还促进了软硬件协同设计的落地,使得设计在流片前就能在接近真实软件环境的激励下进行验证。


但我也必须坦诚地说,Cocotb不是万能的。

它在超大规模芯片验证中的性能开销,是一个不可回避的话题。

Cocotb性能损耗的80%以上来源于跨语言边界的上下文切换。当仿真器遇到上升沿并唤醒Python解释器时,操作系统需要保存仿真器的CPU寄存器状态并加载Python的状态。对于每一个时钟周期都需要交互的测试,比如总线监视器,这种开销会呈几何级数增长。

仿真环境对比运行效率,

SystemVerilog UVM极高,主要是仿真器算法开销。

Icarus Verilog + Cocotb中等,瓶颈在Icarus引擎本身。

Questa/VCS + Cocotb较高,存在VPI/FLI回调延迟。

为了在ASIC级验证中保持可接受的仿真速度,经验丰富的团队通常采用以下优化手段

减少测试中不必要的信号访问。在编译仿真模型时,仅对Cocotb必须访问的信号开启读写访问权限,而非开启全局可见。

对于极高性能要求的监测逻辑,可以考虑将其移回到硬件包装器中,通过产生一个单一的聚合标志信号触发Cocotb。这被称为将复杂度下沉,将灵活性上浮。

对于需要数小时才能进入待机状态的大型系统,可以先运行仿真到稳定状态并保存检查点。后续的Cocotb测试直接从检查点加载,跳过昂贵的复位和引导过程。

在Cocotb中,尽量通过协程一次性传递一组数据包,而非每个字节都进行一次握手。利用Python的缓冲区一次性写入内存块,可以大幅减少回调次数。

这些优化手段,本质上跟软件工程里的性能优化思路是一样的,减少不必要的交互,批量处理,缓存状态。

硬件验证,终究是在做软件的事情。


我其实一直在想,Cocotb为什么能做成这件事。

后来我想明白了。

不是因为它的技术有多牛。不是因为它解决了多少问题。

而是因为它做了一件事,把硬件验证从HDL的孤岛中解放出来。

在Cocotb出现之前,硬件验证是一个封闭的生态系统。你要学SystemVerilog,你要用特定的仿真器,你要写特定的测试平台,你要用特定的脚本工具来驱动。这些工具之间相互绑定,换一样东西,整个链条都要动。

Cocotb用Python把这个链条打断了。

Python是开放的、社区驱动的、有40万+包的。你不需要学习新的语言,你不需要适应新的工具链,你只需要写Python。

而写Python的人,全世界有上千万。

学习SystemVerilog的人呢?可能只有几十万。

这不是一个技术选择的问题,这是一个生态选择的问题。

Cocotb让硬件验证从一个小众的、封闭的、高门槛的领域,变成了一个开放的、可共享的、低门槛的领域。

这就像Git让代码协作从一个需要特定工具的事情,变成了任何人都能用的事情。


这玩意,放在芯片验证上是真理。放在嵌入式开发上是真理。放在任何硬件相关的领域上,也是真理。

把封闭的工具链换成开放的生态。把高门槛的语言换成低门槛的语言。把需要专门培训的技能换成大众已经掌握的技能。

这不是在降低标准。这是在提高效率。

Cocotb让硬件测试变得更像软件测试。

而半导体行业通往全自动化、高效率验证时代的必经之路,就是让硬件工程师像软件工程师一样思考和工作。


吹爆了的东西,炸了。这帮人很开心。

因为他们知道,炸了的这一次,比上一次更接近正确答案。

这就够了。


以上,既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~

谢谢你看我的文章,我们,下次再见。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-29 03:57:39 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/597718.html
  2. 运行时间 : 0.189237s [ 吞吐率:5.28req/s ] 内存消耗:4,816.69kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9a206f058f4ebec43c984a48ff29a781
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000838s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000892s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000378s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000247s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000470s ]
  6. SELECT * FROM `set` [ RunTime:0.000198s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000545s ]
  8. SELECT * FROM `article` WHERE `id` = 597718 LIMIT 1 [ RunTime:0.001112s ]
  9. UPDATE `article` SET `lasttime` = 1779998259 WHERE `id` = 597718 [ RunTime:0.001963s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000238s ]
  11. SELECT * FROM `article` WHERE `id` < 597718 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000497s ]
  12. SELECT * FROM `article` WHERE `id` > 597718 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000454s ]
  13. SELECT * FROM `article` WHERE `id` < 597718 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003859s ]
  14. SELECT * FROM `article` WHERE `id` < 597718 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000977s ]
  15. SELECT * FROM `article` WHERE `id` < 597718 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004048s ]
0.193179s