news 2026/8/25 14:59:40

源码编译安装 yosys 在 ubuntu 上

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
源码编译安装 yosys 在 ubuntu 上

1. 安装依赖

1.1. 安装常用依赖

$sudoapt-getinstallgawkgitmakepython3 lld bison clang flex\libffi-dev libfl-dev libreadline-dev pkg-config tcl-dev zlib1g-dev\graphviz xdot

1.2. 安装 gtest

sudoaptinstalllibgtest-dev libgmock-dev

2. 编译 yosys

下载源码:

$gitclone https://github.com/YosysHQ/yosys.git $cdyosys $gitcheckout v0.68 $gitsubmodule update--init

2.1. 方案1: 依赖使用内嵌库 -DYOSYS_USE_BUNDLED_LIBS=ON

cd~/ex_yosys/yosysrm-rfbuild# 先确保所有内嵌子模块都拉完整了gitsubmodule update--init--recursive# 强制使用内嵌依赖,跳过所有系统包查找cmake-Bbuild.--fresh\-DYOSYS_USE_BUNDLED_LIBS=ON\-DCMAKE_BUILD_TYPE=Release cmake--buildbuild--parallel$(nproc)sudocmake--installbuild

2.2. 方案2: 依赖使用系统库 安装依赖

2.2.1. 构建命令

后边会安装依赖,等依赖安装就绪后,执行如下构建命令:

$ cmake-Bbuild.# 查看 tcl 的配置:$grep-E"YOSYS_WITHOUT_TCL|tcl_INCLUDE_DIRS|tcl_VERSION|tcl_FOUND"build/CMakeCache.txt# 输出为:# YOSYS_WITHOUT_TCL:BOOL=OFF# tcl_FOUND:INTERNAL=1# tcl_INCLUDE_DIRS:INTERNAL=/usr/include/tcl8.6;/usr/include# tcl_VERSION:INTERNAL=8.6.12

编译:

cd~/ex_yosys/tmp01/yosys# 编译cmake--buildbuild -j$(nproc)#检查./build/yosys--version#输出类似:# Yosys 0.68 (git sha1 38e001a6f, GNU /usr/bin/c++ 11.4.0)# 安装sudocmake--installbuild# 验证 Tcl 支持yosys-h|grep-itcl# 应显示:# -c, --tcl-scriptfile <tcl_scriptfile># execute the commands in the TCL <tcl_scriptfile># 确认版本yosys-V
2.2.2. 源码装 tomlplusplus

Yosys 新版本的 CMake 构建系统依赖tomlplusplustomlplusplus是一个 header-only 的 C++17 TOML 解析库。Yosys 的 CMake 构建会通过find_package(tomlplusplus)来查找它,找不到就会报tomlplusplus_DIR-NOTFOUND

以下是几种解决方法,按推荐程度排序:


方法 1:二进制安装 tomlplusplus

Ubuntu 24.04+ 可能有包,但旧版本 ubuntu 通常没有。可以尝试:

sudoaptinstalllibtomlplusplus-dev

如果没有这个包,请使用方法 2。

vcpkg:

vcpkginstalltomlplusplus

方法 2:手动编译安装 tomlplusplus

tomlplusplus使用 Meson 构建系统,编译安装后会生成 CMake 配置文件,Yosys 就能找到了。

# 1. 下载源码gitclone https://github.com/marzer/tomlplusplus.gitcdtomlplusplusgitcheckout v3.4.0# 建议用稳定版本# 2. 编译安装(需要 meson 和 ninja)meson setup build meson compile-Cbuildsudomesoninstall-Cbuild

安装后,CMake 配置文件通常会在:

  • /usr/local/lib/cmake/tomlplusplus/
  • /usr/lib/cmake/tomlplusplus/

方法 3:手动指定 tomlplusplus 路径

如果你已经安装了tomlplusplus但 CMake 找不到(比如装到了非标准路径),可以在配置 Yosys 时手动指定:

cdyosys cmake-Bbuild.\-Dtomlplusplus_DIR=/usr/local/lib/cmake/tomlplusplus\-DCMAKE_BUILD_TYPE=Release

把路径换成你系统中tomlplusplusConfig.cmake所在的实际目录。


2.2.3. 验证 tomlplusplus 的安装

安装完tomlplusplus后,先验证 CMake 能否找到它:

cmake --find-package-DNAME=tomlplusplus-DCOMPILER_ID=GNU-DLANGUAGE=CXX-DMODE=EXIST

总结:最推荐的方法是方法 1(包管理器安装)或方法 2(手动编译安装)。

2.2.4. 编译安装 fmt
cd~/ex_yosysgitclone https://github.com/fmtlib/fmt.gitcdfmtgitcheckout12.2.0# 或最新稳定版mkdirbuild&&cdbuild cmake..\-DCMAKE_BUILD_TYPE=Release\-DFMT_TEST=OFF\-DBUILD_SHARED_LIBS=ON cmake--build.--parallel$(nproc)sudocmake--install.

3. Liberty 文件与 PPA

Liberty 文件是 PPA(Power, Performance, Area)验证的基础数据输入。没有它,综合工具就无法量化评估这三个指标。


1. 为什么 Liberty 文件是 PPA 验证的前提?

PPA 三个维度都依赖 Liberty 文件中的数据:

PPA 维度依赖 Liberty 中的数据说明
P (Power)internal_powerleakage_powerswitching_power每个单元的动态功耗和静态漏电
P (Performance)cell_risecell_fallsetuphold门的传播延迟和时序约束
A (Area)area每个标准单元的硅面积(通常以 μm² 或等价门数表示)

2. 在 Yosys 中验证 PPA 的流程

# 1. 综合并映射到标准单元库 read -sv design.v synth -top top_module dfflibmap -liberty mycells.lib abc -liberty mycells.lib # 2. 生成 PPA 报告 # 面积报告 stat -liberty mycells.lib # 时序报告(需要额外的 SDC 约束文件) # Yosys 本身时序分析能力有限,通常导出到 OpenSTA write_verilog netlist.v

3.stat -liberty输出示例

=== top_module === Number of wires: 123 Number of cells: 89 mylib_INV_X1 23 mylib_NAND2_X1 15 mylib_NOR2_X1 12 mylib_DFF_X1 39 Estimated area: 156.3 <-- 来自 Liberty 中各 cell 的 area 字段累加

4. 仅有 Liberty 文件够吗?

不够。完整的 PPA 验证还需要:

文件作用来源
Liberty (.lib)标准单元电气/时序/功耗特性晶圆厂或开源 PDK
SDC 约束定义时钟频率、输入/输出延迟、虚假路径设计者编写
SPEF/DSPF互连线 RC 寄生参数(后布局布线)提取工具(如 OpenROAD、Magic)
VCD/SAIF实际开关活动率(用于动态功耗)仿真器(如 Verilator、Icarus)

5. 各阶段的 PPA 精度

阶段工具链面积精度时序精度功耗精度
RTL 综合后Yosys + Liberty✅ 准确(已知 cell area)⚠️ 估算(无互连线延迟)⚠️ 估算(无开关活动)
布局后OpenROAD / OpenLane✅ 准确⚠️ 较准(有线载模型)⚠️ 较准
布线后OpenROAD + SPEF✅ 准确✅ 准确(含寄生参数)✅ 准确(含 SAIF)

6. 如果没有 Liberty 文件会怎样?

Yosys 默认使用内部通用单元库$lut$dff$and等),此时:

  • Areastat只能报告"逻辑门数量",无法换算为实际硅面积
  • Performance:无法计算真实延迟,只能做逻辑级数估算
  • Power:完全无法评估
# 没有 Liberty 文件时 stat # 输出: # Number of cells: 100 # $and: 30 # $or: 20 # $dff: 50 # 但没有面积、延迟、功耗数据

7. 开源 PPA 验证完整工具链

如果你要做完整的开源 ASIC 流程 PPA 验证:

RTL (Verilog) ↓ Yosys (综合, Liberty 输入) ↓ OpenROAD / OpenLane (布局布线, DEF/LEF 输入) ↓ OpenSTA (静态时序分析, Liberty + SDC + SPEF) ↓ OpenRoad / ptpx (功耗分析, Liberty + VCD/SAIF)

8. 总结

Liberty 文件是 PPA 验证的必要条件,但不是充分条件。

  • 有 Liberty → 可以做面积估算粗略时序分析
  • 要准确验证 Performance → 还需要SDC + SPEF
  • 要准确验证 Power → 还需要VCD/SAIF 开关活动数据

在纯 Yosys 综合阶段,Liberty 文件至少能让你得到相对可靠的面积数据基于线载模型的粗略时序估计,这已经足够用于早期设计空间探索(DSE)。

4. Liberty 文件介绍

Liberty(通常以.lib为扩展名)是 ASIC 设计中最核心的标准单元库描述文件格式,由 Synopsys 开发并已成为业界事实标准(IEEE 1801 相关)。它用类似 Tcl 的语法描述一个工艺节点下所有标准单元(Standard Cells)的电气特性、时序特性、功耗特性和物理特性


1. 基本结构

一个 Liberty 文件通常包含以下层级:

library (mylib) { // 库级属性 technology (cmos); delay_model : table_lookup; voltage_unit : "1V"; time_unit : "1ns"; capacitive_load_unit (1, pf); // 工作条件 operating_conditions (typical) { process : 1.0; temperature : 25; voltage : 1.0; } // 标准单元定义 cell (INV_X1) { area : 1.2; pin(A) { direction : input; capacitance : 0.001; } pin(Y) { direction : output; function : "!A"; timing() { related_pin : "A"; cell_rise(table_1) { ... } // 上升延迟查找表 cell_fall(table_1) { ... } // 下降延迟查找表 } } } cell (DFF_X1) { area : 3.5; ff(IQ, IQN) { ... } pin(CLK) { ... } pin(D) { ... } pin(Q) { direction : output; timing() { related_pin : "CLK"; timing_type : rising_edge; cell_rise(table_1) { ... } } } } }

2. 关键内容

部分说明
库属性工艺节点、电压/时间单位、延迟模型(如table_lookupcmos_linear
Operating ConditionsPVT(Process/Voltage/Temperature)角,如 tt(典型)、ss(慢角)、ff(快角)
Wire Load Model互连线延迟估算模型(用于综合阶段,尚未布线时)
Cell 定义每个标准单元的完整描述
Pin 定义引脚方向、电容、驱动能力、功能表达式
时序表 (Timing Tables)基于输入转换时间(slew)和输出负载(load)的二维查找表,描述延迟和转换时间
功耗数据内部功耗、漏电功耗、开关功耗
Sequential Cell触发器/锁存器的 setup/hold 时间、时钟到输出延迟

3. 在 Yosys 中的作用

在你贴出的脚本中,Liberty 文件被用于两个关键步骤:

# 1. 将 D 触发器映射到库中的具体单元 dfflibmap -liberty mycells.lib # 2. 用 ABC 将组合逻辑映射到库中的具体门单元 abc -liberty mycells.lib
  • dfflibmap:扫描网表中的$dff(通用 D 触发器),根据 Liberty 文件中定义的ff单元,映射为具体的 DFF 单元(如DFF_X1DFF_X2等)
  • abc:将组合逻辑(与或非门等)映射到库中的标准门单元(INV、NAND、NOR、AOI 等),同时进行逻辑优化和时序优化

4. Liberty 文件类型

类型说明
.lib人类可读的 ASCII 文本格式(上面示例)
.dbSynopsys 二进制格式(由lcLibrary Compiler编译.lib生成,读取更快)
CCS / ECSM更先进的电流源模型,用于纳米级工艺的高精度时序分析

5. 免费开源 Liberty 库资源

你提到的链接是 VLSI Technology 提供的开源库,适合学习和实验:

  • vsclib013(130nm):http://www.vlsitechnology.org/synopsys/vsclib013.lib
  • 还有其他工艺节点如 180nm、90nm 等

此外,著名的开源 PDK 也提供 Liberty 文件:

  • SkyWater 130nm (SKY130)sky130_fd_sc_hd__tt_025C_1v80.lib
  • GF180MCU(GlobalFoundries 180nm)

6. 简单示例解析

以 Yosys 自带的examples/cmos/cmos_cells.lib为例:

library(cmos_cells) { cell(NOT) { pin(A) { direction: input; } pin(Y) { direction: output; function: "!A"; } } cell(NAND) { pin(A) { direction: input; } pin(B) { direction: input; } pin(Y) { direction: output; function: "!(A&B)"; } } cell(DFF) { pin(CLK) { direction: input; clock: true; } pin(D) { direction: input; } pin(Q) { direction: output; } ff("IQ", "IQN") { clocked_on: CLK; next_state: D; } } }

这是一个极度简化的 Liberty 文件,只定义了逻辑功能,没有时序和功耗数据。实际的工艺库会有复杂的cell_risecell_fallrise_transition等查找表。


7. 总结

Liberty 文件是连接 RTL 设计和物理实现的桥梁——它告诉综合工具"我的工艺库有哪些门、每个门有多大、多快、功耗多少"。Yosys 通过读取 Liberty 文件,才能将抽象的 RTL 映射到具体的、可制造的标准单元上。

5. README.md 参考: Yosys —— Yosys 开源综合套件

这是一个 RTL 综合工具的框架。目前它对 Verilog-2005 提供了广泛的支持,并为各种应用领域提供了一套基本的综合算法。

Yosys 使用 sv-elab 和 slang 库来提供全面的 SystemVerilog 支持。
它支持(非正式定义的)可综合的 SystemVerilog 子集,版本为 IEEE 1800-2017 或 IEEE 1800-2023。

Yosys 可以通过组合现有的处理流程(算法)来执行任何综合任务,使用综合脚本,并根据需要通过扩展 Yosys C++ 代码库来添加额外的处理流程。

Yosys 是在 ISC 许可证下发布的自由软件(一种与 GPL 兼容的许可证,在条款上类似于 MIT 许可证或 2 条款 BSD 许可证)。

与本软件一起分发的第三方软件在兼容的许可证下获得许可。
请参阅abclibs子目录以了解其许可条款。

网站及其他资源

更多信息和文档可以在 Yosys 网站上找到:

  • https://yosyshq.net/yosys/

如果您有任何与 Yosys 相关的问题,请发布到 Discourse 讨论组:

  • https://yosyshq.discourse.group

来自本仓库的文档会自动构建并在 Read the Docs 上提供:

  • https://yosyshq.readthedocs.io/projects/yosys

对形式验证感兴趣的用户可能希望使用 Yosys 的形式验证前端 SBY:

  • https://yosyshq.readthedocs.io/projects/sby/
  • https://github.com/YosysHQ/sby

Yosys 博客上有来自用户的新闻和文章:

  • https://blog.yosyshq.com

安装

Yosys 是 Tabby CAD Suite 和 OSS CAD Suite 的一部分!使用 Yosys 最简单的方法是安装二进制软件套件,其中包含所有必需的依赖项和相关工具。

  • 联系 YosysHQ 获取 Tabby CAD Suite 评估许可证和下载链接
  • 或者前往 https://github.com/YosysHQ/oss-cad-suite-build/releases 下载免费的 OSS CAD Suite
  • 按照 GitHub 上的安装说明进行操作

如果您需要行业级 SystemVerilog 和 VHDL 解析器等功能,请务必获取 Tabby CAD Suite 评估许可证!

有关 Tabby CAD Suite 和 OSS CAD Suite 之间差异的更多信息,请访问 https://www.yosyshq.com/tabby-cad-datasheet

许多 Linux 发行版也提供 Yosys 二进制文件,有些比其他更新。请查看您的包管理器!

从源码构建

更多详细信息以及其他平台的说明,请查看 Read the Docs 上的从源码构建。

克隆 Yosys 时,一些必需的库作为 git 子模块包含在内。确保执行例如:

$gitclone https://github.com/YosysHQ/yosys.git $cdyosys $gitsubmodule update--init

需要支持 C++20 的 C++ 编译器,以及一些标准工具,如 GNU Flex、GNU Bison (>=3.8)、CMake (>=3.28)、Make(或其他 CMake 生成器如 Ninja)和 Python (>=3.11)。一些额外的工具:readline、libffi、Tcl 和 zlib;如果可用将被使用,但它们是可选的。Graphviz 和 Xdot 被show命令用于显示原理图。

例如在 Ubuntu Linux 22.04 LTS 上,以下命令将安装构建 Yosys 的所有先决条件:

$sudoapt-getinstallgawkgitmakepython3 lld bison clang flex\libffi-dev libfl-dev libreadline-dev pkg-config tcl-dev zlib1g-dev\graphviz xdot

注意:默认情况下,Ubuntu 22.04 LTS 通过apt只能使用 CMake 3.22。要安装更新版本并满足构建 Yosys 的最低要求,请使用sudo snap install cmake --classic

CMake 用于构建配置,并且需要一个单独的构建目录:

$ cmake-Bbuild.

生成后,可用的构建变量可以通过ccmake或打开生成的build/CMakeCache.txt文件来检查和修改:

$ ccmake build# 或者..$vibuild/CMakeCache.txt

设置一次性变量时,CMake 提供-D <var>=<value>命令行选项。例如,禁用 zlib 支持:

$ cmake-Bbuild.-DYOSYS_WITHOUT_ZLIB=ON

对于更持久的配置,我们建议在根yosys目录中创建并使用CMakeUserPresets.json文件。下面是一个示例文件,当调用cmake --preset clang时启用 ccache 并将默认编译器设置为 clang:

{"version":1,"configurePresets":[{"name":"default","binaryDir":"build","generator":"Unix Makefiles","cacheVariables":{"CMAKE_C_COMPILER":"clang","CMAKE_CXX_COMPILER":"clang++","YOSYS_COMPILER_LAUNCHER":"ccache"}}]}

生成后,构建系统可以按如下方式运行:

$ cmake--buildbuild# 或者..$cdbuild $ cmake--build.

要使用默认设置快速安装 Yosys:

$ cmake-Bbuild.-DCMAKE_BUILD_TYPE=Release $ cmake--buildbuild--configRelease--parallel$(nproc)$sudocmake--installbuild--strip

测试位于 tests 子目录中,可以使用test目标执行。请注意,您需要 gawk、较新版本的 iverilog 和 gtest。
通过以下方式执行测试:

$ cmake--buildbuild--targettest--parallel$(nproc)

快速入门

Yosys 可以与交互式命令 shell、综合脚本或命令行参数一起使用。让我们使用交互式命令 shell 执行一个简单的综合任务:

$ ./build/yosys yosys>

help命令可用于打印所有可用命令的列表,help <command>可用于打印指定命令的详细信息:

yosys>helphelp

使用 Verilog 前端读取和细化设计:

yosys>read-svtests/simple/fiedler-cooley.v yosys>hierarchy-topup3down5

以 Yosys 内部使用的 RTLIL 格式将设计写入控制台:

yosys>write_rtlil

将进程(always块)转换为网表元素并执行一些简单的优化:

yosys>proc;opt

使用xdot显示设计网表:

yosys>show

使用gv作为 PostScript 查看器执行相同操作:

yosys>show-formatps-viewergv

将网表转换为门级逻辑并执行一些简单的优化:

yosys>techmap;opt

将设计网表写入新的 Verilog 文件:

yosys>write_verilog synth.v

或者使用简单的综合脚本:

$catsynth.ysread-svtests/simple/fiedler-cooley.v hierarchy-topup3down5 proc;opt;techmap;opt write_verilog synth.v $ ./yosys synth.ys

如果在 Yosys 构建配置中启用了 ABC,并且 Liberty 文件mycells.lib中给出了单元库,则以下综合脚本将为给定的单元库进行综合:

# 读取设计 read -sv tests/simple/fiedler-cooley.v hierarchy -top up3down5 # 高层级处理 proc; fsm; opt; memory; opt # 映射到内部单元库 techmap; opt # 将触发器映射到 mycells.lib dfflibmap -liberty mycells.lib # 将逻辑映射到 mycells.lib abc -liberty mycells.lib # 清理 clean

如果您没有 Liberty 文件但想测试此综合脚本,可以使用 yosys 源代码中的文件examples/cmos/cmos_cells.lib作为简单示例。

有关免费和开源 ASIC 标准单元库的 Liberty 文件下载和信息可以在这里找到:

  • http://www.vlsitechnology.org/html/libraries.html
  • http://www.vlsitechnology.org/synopsys/vsclib013.lib

synth命令提供了一个很好的默认综合脚本(参见help synth):

read -sv tests/simple/fiedler-cooley.v synth -top up3down5 # 映射到目标单元 dfflibmap -liberty mycells.lib abc -liberty mycells.lib clean

prep命令提供了一个很好的默认字级综合脚本,如基于 SMT 的形式验证中所使用的那样。

附加信息

默认情况下,当使用 Verilog 源输入调用read时使用的read_verilog命令不执行语法检查。您应该首先使用其他工具(如 [Verilator](https://www.veripool.org/verilator/)对源代码进行 lint 检查,例如通过调用verilator --lint-only

构建文档

请注意,如果您只是想阅读手册,则无需构建它。
只需访问 https://yosys.readthedocs.io/en/latest/ 即可。
如果您处于离线状态,可以阅读源代码,将.../en/latest替换为docs/source

除了上面列出的用于从源码构建 Yosys 的包之外,构建网站还需要以下包:

$sudoaptinstallpdf2svg faketime

或者在 MacOS 上使用 homebrew:

$ brewinstallpdf2svg libfaketime

大多数 LaTeX 发行版中包含的 PDFLaTeX 在构建网站期间也需要。或者,运行以下命令:

$sudoaptinstalltexlive-latex-base texlive-latex-extra latexmk

或者在 MacOS 上使用 homebrew:

$ brewinstallbasictex $sudotlmgr update--self$sudotlmgrinstallcollection-latexextra latexmk tex-gyre

需要 Python 包 Sphinx,以及docs/source/requirements.txt中列出的包:

$ pipinstall-Usphinx-rdocs/source/requirements.txt

文档(例如):

$ cmake--buildbuild--targetdocs-html--parallel

这将根据需要构建/重建 yosys,然后从 yosys 帮助命令生成网站文档。要构建 pdf 而不是 html,请使用docs-latexpdf目标。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 14:54:02

请求绑定 binding(binding/ 包)

1.1 Binding 接口源码位置:binding/binding.go:30-35// Binding describes the interface which needs to be implemented for binding the // data present in the request such as JSON request body, query parameters or // the form POST. type Binding interface {Name()…

作者头像 李华
网站建设 2026/8/25 14:53:36

4GDTU支持哪些协议?

在工业物联网&#xff08;IIoT&#xff09;和智能终端设备中&#xff0c;4G DTU&#xff08;4G Data Terminal Unit&#xff09;是一种基于4G网络的远程通信设备&#xff0c;广泛应用于工业自动化、智能监控、电力系统、环境监测等领域。4G DTU 通常支持多种通信协议&#xff0…

作者头像 李华
网站建设 2026/8/25 14:51:51

未来展望:CXL、智算网络与RDMA的融合演进

&#x1f4d1; 目录 一、前言/背景二、核心原理与硬件架构三、硬件实现深度剖析四、协议/算法的RTL与寄存器级实现五、实战部署与配置六、性能分析与尾延迟评测七、常见问题排查八、总结与最佳实践参考资料 摘要&#xff1a;本文从芯片设计验证视角&#xff0c;深入剖析CXL 3.…

作者头像 李华
网站建设 2026/8/25 14:45:37

070、列表输出与页眉页脚

070、列表输出与页眉页脚 调试老报表时遇到一个邪门问题:同一个程序,在测试环境输出页眉正常,到生产环境页眉就“长”到了第二页,第一页反而是空的。折腾半天发现是有人偷偷改了程序里的LINE-COUNT,把默认行数调大,而页眉输出条件TOP-OF-PAGE触发时机跟着变了。 ABAP的…

作者头像 李华
网站建设 2026/8/25 14:45:24

打卡信奥刷题(3526)用C++实现信奥题 P10957 环路运输

P10957 环路运输 题目描述 在一条环形公路旁均匀地分布着 NNN 座仓库&#xff0c;编号为 1∼N1 \sim N1∼N&#xff0c;编号为 iii 的仓库与编号为 jjj 的仓库之间的距离定义为 dist(i,j)min⁡⁡(∣i−j∣,N−∣i−j∣)dist(i,j)\min⁡(|i-j|,N-|i-j|)dist(i,j)min⁡(∣i−j∣,…

作者头像 李华
网站建设 2026/8/25 14:39:29

无线充电电动牙刷的五大核心优势:便利、安全、美观与智能体验全解析

引言 在电动牙刷日益普及的今天&#xff0c;充电方式的选择也成为了影响用户体验的重要因素。从早期的有线充电到如今的无线充电&#xff0c;技术的进步为我们的日常口腔护理带来了更多便利。无线充电技术应用于电动牙刷&#xff0c;不仅仅是简单的“去掉一根线”&#xff0c;它…

作者头像 李华