尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

VS Code 搭建 AI 辅助 FPGA 开发环境:Verilog 插件与 Agent 配置指南

VS Code 搭建 AI 辅助 FPGA 开发环境:Verilog 插件与 Agent 配置指南 如果你已经在 Vivado 或 Quartus 里写了很久 Verilog又总感觉代码补全停留在“关键字高亮”阶段那么这篇文章就是为你准备的。这两年 AI 辅助 FPGA 逻辑设计的热度上升得非常快从寄存器级代码生成到跨时钟域检查再到 AXI 总线接口的自动拼接大模型确实能把很多重复劳动压缩掉。但想用好这些能力需要一个称手的编辑器来承接 AI Agent 的输入输出。很多老工程师的第一反应是既然我都在 Vivado 里写了为什么还要额外装一个 VS Code原因很简单Vivado 自带编辑器的主业是综合布线它的代码编辑体验停留在十年前。而 VS Code 拥有丰富的插件生态既能补齐 Verilog/SystemVerilog 的语法检查、格式化、信号跳转又能无缝接入 Continue、GitHub Copilot 这类 AI 编程辅助工具让大模型直接读懂你当前打开的文件上下文。本文作为系列教程的第一讲先把 VS Code 装好、调顺手、把 FPGA 开发常用的插件和 AI 辅助通道配通为后面搭建完整 Agent 环境打好基础。1. 背景AI 辅助 FPGA 开发为什么偏偏是 VS Code1.1 FPGA 开发的传统痛点FPGA 开发的流程大致是编写 RTL 代码、功能仿真、综合、实现、上板调试。当前主流厂商的 IDE 都集成了编辑器但实际的开发体验并不是很好。突出表现在几个方面代码补全能力弱基本停留在关键字补全和模板片段插入。对 SystemVerilog、UVM 的支持不够深入错误提示不够准确。多文件工程的导航体验差很难快速查看模块实例化关系。插件生态封闭无法根据团队规范灵活扩展。编辑器与 Git、代码审查工具、CI 流程的集成度低。当 RTL 代码量变大以后这些问题会被急剧放大。一个动辄几十万行的 FPGA 工程如果只靠传统 IDE 的编辑器去维护效率会明显下降。正因如此越来越多的 FPGA 工程师开始把代码编写和仿真测试放到 VS Code 中完成只在综合、实现、上板阶段才打开厂商工具。1.2 AI Agent 进入 FPGA 开发AI Agent 的概念并不复杂它不是一个简单的问答机器人而是一个能感知当前任务、调用工具、生成代码并反馈结果的智能体。在 FPGA 开发场景中AI Agent 可以做这些事情根据接口时序描述生成对应的 Verilog 模块。根据 AXI-Lite、AXI-Stream 等协议规范生成总线接口代码。根据仿真波形或日志分析定位 RTL 逻辑错误。将 Python 脚本与 Vivado/Quartus TCL 命令结合实现自动化构建。根据约束文件或时序报告给出优化建议。无论是哪类 Agent它们都需要一个与代码仓库、编辑器、命令行深度绑定的“工作台”。VS Code 因为扩展机制开放、终端集成完善、支持远程开发天然适合作为 Agent 的宿主环境。1.3 为什么把 VS Code 当作第一步搭建 AI 辅助 FPGA 开发的完整 Agent 环境不是只装一个大模型客户端就行。一个可工作的环境至少包含四部分编辑器本体负责代码编写、文件浏览、多工程切换。硬件描述语言插件负责语法高亮、格式化、模块导航、语法检查。AI 插件负责连接大模型服务。工具链命令封装负责把 Vivado、Quartus、Icarus Verilog 等编译仿真工具集成进 VS Code。第一步先把 VS Code 安装好再完成插件配置和 AI 通道调试后续逐步引入代码库索引、自动测试脚本、RTL Lint 工具Agent 才能真正开始“辅助开发”而不只是一个悬浮在浏览器里的对话框。2. 环境准备安装前的版本与系统说明安装 VS Code 本身并不复杂但 FPGA 开发涉及多个工具链提前确认版本与操作系统兼容性可以避免很多后续问题。本节不针对某个具体版本写死细节而是给出通用选型建议。2.1 支持的操作系统VS Code 支持 Windows、Linux、macOS 三大平台。对于 FPGA 开发需要根据你的厂商工具链选择WindowsVivado、Quartus、ModelSim、QuestaSim 都能正常使用VS Code 的 Windows 版本最常用。LinuxVivado、Vitis、Quartus Prime 在 Linux 下性能更稳定适合服务器端综合和批量回归验证。macOS适合编写 RTL 代码和进行轻量级仿真例如使用 Icarus Verilog但厂商综合工具支持有限。如果你使用 Windows建议优先选择 Windows 10/11 的 64 位版本并确保系统已更新到较新的补丁版本。如果你是 Ubuntu 用户建议使用 20.04 LTS 或 22.04 LTS因为大多数 FPGA 厂商工具都基于这两个版本验证过。2.2 安装包选择VS Code 的官方下载页面会提供 User Installer、System Installer 等不同安装包。对于普通开发者我建议选择Windows下载 User Installer安装到当前用户目录避免 UAC 权限干扰。Linux下载 .deb 或 .rpm 包或使用官方软件源安装。macOS下载 Apple Silicon 或 Intel 版本注意区分。不要下载第三方渠道的绿色版、精简版后续升级和插件兼容性容易出问题。VS Code 每月都会发布迭代版本功能更新较快安装完成后再根据需要决定是否开启自动更新。2.3 硬件配置建议VS Code 本身非常轻量但如果你同时打开多个大型工程、运行 Verilog 语法检查插件、并让 AI 插件保持后台索引建议内存16GB 起步建议 32GB。CPU主流多核处理器即可对单核性能有一定要求。硬盘SSD 必不可少尤其当工程包含多个 IP 核和综合结果时。网络需要能够连接 VS Code 插件市场和 AI 模型接口建议保持稳定网络。3. VS Code 安装与基础设置3.1 Windows 下的安装步骤在 Windows 下安装 VS Code流程非常标准。从官网下载好 User Installer 后双击运行选择安装路径你可以一路默认。为了后续开发更顺手建议在安装界面勾选以下选项“添加到 PATH”允许在终端中直接使用 code 命令打开文件或文件夹。“将‘通过 Code 打开’操作添加到文件资源管理器目录上下文菜单”方便在工程文件夹上右键直接打开。“将‘通过 Code 打开’操作添加到 Windows 资源管理器文件上下文菜单”方便单独打开某个文件。“注册为受支持的文件类型的编辑器”可勾可不勾如果你暂时不想让 VS Code 接管所有文本文件可以取消。安装完成后打开开始菜单找到 Visual Studio Code 并启动。首次启动会进入欢迎页左上角会显示版本号此时基本安装已经完成。为了验证“添加到 PATH”是否生效可以打开新的终端窗口Windows Terminal 或 CMD执行code --version如果正常输出版本号就说明命令行启动模式已经可用。以后你可以直接在工程目录下运行code .快速打开当前文件夹。3.2 Linux 下的安装步骤以 Ubuntu 为例推荐使用官方软件源安装。先依次执行wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor packages.microsoft.gpg sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/ sudo sh -c echo deb [archamd64,arm64,armhf signed-by/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main /etc/apt/sources.list.d/vscode.list sudo apt update sudo apt install code如果你使用的是离线环境可以下载 .deb 安装包后执行sudo dpkg -i code_xxx_amd64.deb如果提示依赖缺失则继续执行sudo apt install -f安装完成后在终端输入code也可以启动 VS Code。需要注意的是Linux 环境下的 VS Code 沙箱限制有时会影响插件运行如果遇到插件无法正常启动的情况可以尝试在启动命令中加--no-sandbox参数但该方法仅建议在个人开发机中使用。3.3 首次启动后的核心设置VS Code 默认配置偏保守对于 FPGA 开发环境建议先调整以下几项打开设置界面点击左下角齿轮图标选择“设置”或者直接按快捷键Ctrl ,。设置文件自动保存files.autoSave: afterDelay, files.autoSaveDelay: 1000对于 RTL 代码自动保存可以避免因为软件崩溃导致代码丢失。但要注意如果你经常在编辑器里修改文件后马上切到其他工具操作自动保存可能造成文件变更过于频繁触发 Git 状态刷新。建议设置为 1 秒延时。设置字体和字号。FPGA 工程师经常需要长时间盯着代码推荐使用等宽字体editor.fontFamily: Consolas, Courier New, monospace, editor.fontSize: 14, editor.lineHeight: 22开启代码缩略图与括号对高亮editor.minimap.enabled: true, editor.guides.bracketPairs: true, editor.bracketPairColorization.enabled: true界面语言。如果你希望使用中文界面可以安装“Chinese (Simplified) (简体中文) Language Pack”插件。安装后右下角会提示重启重启即生效。3.4 安装常用基础插件在安装 FPGA 相关插件之前建议先把以下基础插件装好它们能显著提升整体体验Chinese Language Pack中文界面。Bracket Pair Color DLW彩色括号匹配阅读嵌套逻辑更方便。GitLens查看 Git 历史、代码作者、文件变更。Path Intellisense文件路径自动补全。Todo Tree高亮 TODO/FIXME 注释。Error Lens在代码行内直接显示错误和警告信息。这些插件都可以在 VS Code 的扩展市场中搜索安装。点击左侧扩展图标或者按快捷键Ctrl Shift X在搜索框中输入插件名称点击 Install 即可。4. FPGA 开发必备插件安装与配置FPGA 开发最核心的插件是硬件描述语言相关的扩展。下面这些插件覆盖了 Verilog/SystemVerilog 的编写、语法检查、格式化和模块导航等需求。4.1 TerosHDLTerosHDL 是目前 VS Code 中功能最完整的 FPGA 开源插件之一它集成了Verilog/SystemVerilog/VHDL 语法高亮。模块实例化自动生成。基于 svls 或 verible 的语法检查。波形查看器接口。常用模板代码。Vivado、Quartus、Yosys 等工具链配置。安装 TerosHDL 后需要确认它推荐的辅助程序是否安装。TerosHDL 依赖 Python 环境部分功能需要 Python 解释器。如果你没有 Python 环境可以暂时跳过辅助程序安装后续用到具体功能再补齐。TerosHDL 的配置界面可以设置综合工具路径。打开设置搜索teroshdl找到综合工具配置项把 Vivado 的安装路径填写进去。这样 TerosHDL 可以直接调用 Vivado 的命令行工具执行综合与仿真。4.2 Verilog-HDL/SystemVerilog这个插件是 FPGA 开发中非常流行的扩展提供了完整的语言支持关键字高亮。模块实例化提示。自动补全。代码片段。模块定义跳转。lint 配置。安装后该插件会自动识别文件夹中的.v、.sv文件。打开 Verilog 文件后状态栏会显示当前语言模式。如果打开文件后没有语法高亮需要检查是否安装了正确的语言插件。4.3 Verilog FormatVerilog Format 是一个基于 Python 的代码格式化插件安装后可以自动整理代码缩进、对齐端口列表和模块参数。配置方式如下先安装 Python 环境并安装 verilog-format 包pip install verilog-format在 VS Code 设置中配置格式化工具路径verilog.formatting.compact: false, verilog.formatting.columnLimit: 120使用时在代码文件中按Shift Alt F或者右键选择“格式化文档”。好的代码格式化风格对后续 AI Agent 理解代码非常重要。如果代码缩进混乱、对齐不统一大模型生成补全时也会受到影响。4.4 C/C 扩展FPGA 开发中经常需要编写 Testbench 或与 HLS高层次综合相关的 C/C 代码。Vivado HLS 和 Vitis 都支持 C/C 仿真因此安装微软官方的 C/C 扩展是值得的。扩展名称为“C/C”由微软发布。安装后VS Code 能提供C/C 代码语法高亮和自动补全。调试支持。通过 tasks.json 配置编译命令。IntelliSense 对头文件路径的解析。对于 PYNQ 这类基于 Python 的 FPGA 开发板还可以安装 Python 扩展。Python 扩展能在 VS Code 中提供代码提示和调试能力对后续写脚本控制 FPGA 外设非常方便。5. AI 辅助插件配置打通 Agent 通道环境搭建的核心目标就是让 AI 辅助开发真正可用。目前 VS Code 中最流行的 AI 辅助插件有 GitHub Copilot、Continue、CodeGeeX 等。对于 FPGA 开发我更推荐从 Continue 开始因为它的模型切换更自由也可以接入本地部署的模型。5.1 安装 Continue 插件Continue 是一个开源的 AI 代码助手插件它的特点是支持调用 OpenAI 兼容接口。支持本地模型。可以自定义 Prompt 模板。能把当前代码文件、选中代码作为上下文交给大模型。有 Chat 面板和代码补全两种交互方式。在扩展市场搜索 Continue点击安装即可。安装完成后左侧会出现 Continue 的图标点击即可打开对话面板。5.2 配置大模型接口Continue 的配置方式是编辑config.json文件。在插件面板中点击右上角设置齿轮选择“Open config”会打开配置文件。下面是一个典型的本地模型配置示例{ models: [ { title: Local LLM, provider: openai, model: qwen2.5-coder:7b, apiBase: http://localhost:11434/v1, apiKey: EMPTY } ], slashCommands: [ { name: review, description: 对当前代码进行审查, prompt: 请以资深 FPGA 工程师视角审查当前 Verilog 代码重点检查同步逻辑、跨时钟域处理和状态机完整性。 }, { name: improve, description: 优化当前代码, prompt: 请分析当前文件中的 RTL 设计问题并给出优化后的代码。 } ] }上面这段配置中apiBase指向本地 Ollama 服务的兼容接口。如果你使用云端 API只需要把apiBase替换为对应服务的地址填入真实的 API Key。5.3 在 Continue 中指定 FPGA 工程师角色AI 辅助的效果很大程度上取决于 Prompt 的质量。建议在 Continue 中增加一个系统级 Prompt你是资深 FPGA 逻辑设计工程师精通 Verilog、SystemVerilog、VHDL熟悉 Xilinx 和 Intel FPGA 架构。你擅长 RTL 设计、跨时钟域处理、时序约束、仿真验证和调试。你回答问题时会给出具体的代码示例和解释。然后在每次提问时尽量带上完整上下文。例如你可以选中一个状态机代码片段然后问帮我检查这个状态机是否存在不完全解码问题并给出修复方案。Continue 会把当前文件内容和选中代码发送给模型。这样得到的回答比直接问“状态机怎么写”要精准得多。5.4 GitHub Copilot 作为备选如果你有 GitHub Copilot 订阅也可以同时安装 GitHub Copilot 和 GitHub Copilot Chat。Copilot 的代码补全能力在通用编程领域较为成熟但在 FPGA/Verilog 场景下它的训练语料相对偏少。所以我的建议是Copilot 用于写 Python 脚本、C 语言驱动、命令行工具类代码。Continue 或 Chat 面板用于 Verilog 的代码生成与原理分析。两者可以共存不会冲突。6. 完整实战配置一个最小可用的 FPGA 开发工作台下面我们动手配置一个完整的 VS Code FPGA 开发工作台。这个工作台的目标是能打开 Verilog 工程目录。能进行语法高亮和模块跳转。能调用 Vivado 或 Icarus Verilog 做语法检查。能通过 AI 插件生成和审查代码。集成 Git 版本管理。6.1 创建工程目录在任意位置创建一个新的 FPGA 工程目录例如my_fpga_project/ ├── rtl/ │ └── led_blink.v ├── sim/ │ └── tb_led_blink.v ├── constraint/ │ └── top.xdc ├── scripts/ │ └── build.tcl └── .vscode/ ├── settings.json └── tasks.json在终端中执行mkdir -p my_fpga_project/{rtl,sim,constraint,scripts,.vscode} cd my_fpga_project code .6.2 编写一个 LED 闪烁模块在rtl/led_blink.v文件中输入以下代码module led_blink #( parameter CLK_FREQ 50_000_000, parameter BLINK_MS 500 ) ( input wire clk, input wire rst_n, output reg led ); localparam COUNTER_MAX CLK_FREQ * BLINK_MS / 1000; reg [31:0] counter; always (posedge clk or negedge rst_n) begin if (!rst_n) begin counter 32d0; led 1b0; end else begin if (counter COUNTER_MAX - 1) begin counter 32d0; led ~led; end else begin counter counter 1b1; end end end endmodule在这个文件中你可以测试插件的语法高亮是否正常。将鼠标悬停在COUNTER_MAX上如果安装了 Verilog-HDL 插件可以看到参数定义的提示。6.3 配置 tasks.json 实现一键语法检查VS Code 的 Tasks 功能可以自定义编译命令。下面配置一个调用 iverilog 做语法检查的任务。前提是你已经安装了 Icarus Verilog并且 iverilog 命令在 PATH 中。在.vscode/tasks.json中写入{ version: 2.0.0, tasks: [ { label: iverilog check, type: shell, command: iverilog, args: [ -g2012, -o, ./sim/sim.out, ./rtl/led_blink.v, ./sim/tb_led_blink.v ], group: { kind: build, isDefault: true }, problemMatcher: [] } ] }然后按Ctrl Shift BVS Code 会执行 iverilog 语法检查。如果代码有语法错误会在终端输出错误信息。6.4 调用 AI 助手审查代码打开led_blink.v在 Continue 面板中发送以下提示请审查这个 LED 闪烁模块的代码重点关注 1. 计数器位宽是否足够。 2. 复位逻辑是否安全。 3. 是否存在亚稳态风险。 4. 如何改进代码风格。AI 模型会基于当前文件内容给出分析。这个过程验证了 AI Agent 与编辑器的正向链路已经打通。6.5 添加 Git 版本管理在项目根目录执行git init echo sim/sim.out .gitignore git add . git commit -m init: 添加 LED 闪烁模块和语法检查任务配合 GitLens 插件你可以在 VS Code 中直接看到每次提交的代码变化。7. 常见问题与排查思路7.1 插件市场无法访问或下载缓慢问题现象常见原因解决思路扩展市场搜索无结果网络无法访问插件市场检查网络连接确认代理设置考虑使用企业镜像或等待网络恢复插件下载卡住网络波动或镜像源缓慢重试下载或检查 hosts 配置不建议使用来路不明的第三方破解插件包插件安装后不生效VS Code 未重启完整重启 VS Code或按Ctrl Shift P执行“Developer: Reload Window”7.2 Verilog 语法高亮不生效如果你打开.v文件后仍然是纯文本模式首先检查右下角语言模式是否显示为 Verilog。如果未识别可以手动点击语言模式选择 Verilog。也可以安装“Verilog-HDL/SystemVerilog”插件后重启窗口。还需要注意如果用 Vivado 生成的.vh头文件部分插件可能不会自动识别。此时可以在设置中添加文件关联files.associations: { *.vh: systemverilog }7.3 ctrl点击无法跳转定义Verilog 模块跳转依赖插件对多个文件的索引。如果你打开的是单个文件而不是整个文件夹跳转功能可能不生效。解决方法是确保通过文件 - 打开文件夹打开工程根目录。确保所有 RTL 文件都在工程目录下。重新加载窗口。如果跳转仍然失败检查插件是否需要先生成 symbol 索引。7.4 中文界面没有生效安装中文语言包后如果没有弹出切换提示可以按Ctrl Shift P输入Configure Display Language选择zh-cn重启后生效。7.5 AI 插件提示连接失败对于 Continue 或 Copilot如果对话无法发送优先检查API Key 是否正确填写。本地服务是否启动例如 Ollama 是否在运行。网络是否能访问模型接口。企业内网是否需要配置代理。在开发环境中如果使用本地模型需要确保模型已提前下载完成并且服务端口可以被本机访问。8. 最佳实践与工程建议8.1 规范 VS Code 工作区设置不要把个人偏好写进全局配置。建议每个 FPGA 工程都维护一份.vscode/settings.json把该工程的格式化规则、文件关联、Python 路径等写入其中。这样团队成员克隆代码后打开工程就能获得一致的开发环境。推荐的最小工程配置如下{ editor.tabSize: 4, editor.insertSpaces: true, files.autoSave: afterDelay, files.autoSaveDelay: 1000, verilog.linting.iverilog.enabled: true, verilog.linting.iverilog.arguments: [ -g2012, -Wall ] }8.2 设计一套合理的 Prompt 模板AI 辅助 FPGA 开发并不是万能药合理的提问方式能显著提升回答质量。以下是几个适合 FPGA 场景的 Prompt 模板状态机模板请生成一个用于 UART 接收的状态机包含空闲、起始位、数据位、停止位状态。要求 1. 使用三段式状态机写法。 2. 对起始位进行滤波。 3. 输出接收完成标志。 4. 附带参数定义。跨时钟域检查模板以下代码中信号 a 从时钟域 clk_a 传递到 clk_b请检查是否存在跨时钟域问题并给出修复方案。约束文件模板请根据以下时钟定义生成 XDC 约束输入时钟 50MHz引脚位于 J16时钟名为 sys_clk。将常用模板保存为 Continue 的快捷命令后续使用时只需选中代码点击对应命令即可让 AI 按固定结构生成或审查代码。8.3 用 AI 做验证助手而不是代码生成器对于 FPGA 开发AI 最擅长的往往不是从头写复杂逻辑而是将文字描述转换为状态机骨架。将 Protocol Manual 中的时序要求转换为接口代码。为已有 RTL 补齐 Testbench 和断言。分析编译报错日志并给出修复建议。优化组合逻辑的写法。在实际开发中不要直接信任 AI 生成的关键时序逻辑必须自行检查并仿真验证。AI 生成的代码只能作为初稿工程师仍需对功能正确性负责。8.4 保持与厂商工具链接的清晰VS Code 是前端编辑器不是综合工具。建议在工程里维护一个scripts/目录专门存放调用 Vivado 或 Quartus 的 TCL 脚本。VS Code 的 tasks.json 只负责调用这些脚本不应该在 VS Code 中硬编码厂商工具的完整路径。一个简单的 build.tcl 示例set project_name my_fpga_project set part xc7a35tcsg324-1 create_project $project_name ./build -part $part add_files -norecurse [glob ./rtl/*.v] add_files -fileset constrs_1 [glob ./constraint/*.xdc] update_compile_order -fileset sources_1 launch_runs synth_1 -jobs 4 wait_on_run synth_1有了这些脚本VS Code 就变成一个调度中心而 Vivado 只作为后台任务运行整体流程更清晰。8.5 用 AI 生成文件头模板FPGA 工程的文件头包含模块名、作者、创建日期、修改记录、功能说明等信息。可以编写一个 Continue 快捷命令让它根据模块功能自动生成标准文件头。例如在 Continue 中定义命令{ name: fileheader, description: 为当前 Verilog 文件生成标准文件头, prompt: 请为当前代码文件生成一个符合 FPGA 团队规范的文件头注释包含模块名、功能描述、作者、创建日期、版本记录。文件名和模块名从当前上下文推断。 }这样可以保证所有新文件都包含完整元信息方便后续维护。9. 总结与下一步学习建议当你完成这一讲的练习后你的开发环境中已经具备了三层能力VS Code 基础编辑器环境已经安装并配置完成。Verilog/SystemVerilog 插件环境已经就绪语法高亮、格式化、语法检查、模块跳转都能使用。AI 辅助通道已经打通可以通过 Continue 或 GitHub Copilot 与大模型交互并用它辅助生成和审查代码。此时你已经把自己的开发环境从“传统 IDE 的文本编辑器”升级成了一个“AI 可感知、可交互的代码工作台”。这一步是整个系列中最重要的地基。虽然它看起来只是安装一个软件、安装几个插件但后续要配置 Agent 自动化工程、编写智能脚本、生成 Testbench都依赖这个工作台的稳定性和开放性。下一讲中我计划围绕“构建 FPGA 项目仓库的 AI 索引机制”展开讨论如何把工程内的 RTL 文件、约束文件、仿真脚本和文档统一喂给 Agent让它可以基于整个工程上下文回答问题而不仅仅是依赖当前单个文件。与此同时你可以在真正动手前先把本文配置好的环境用起来尝试让 AI 为你生成一个简单的 Testbench或者在 open-source 的 VexRiscv、PicoRV32 等 RISC-V 处理器工程中打开几个文件让 AI 解释模块间的连接关系。如果你在配置过程中遇到插件安装失败、语法检查不生效、AI 接口无法连接等问题可以在评论区留下具体的报错信息和操作系统版本我看到后会尽量给出针对性的排查建议。也建议你先收藏本文后续需要重新搭建环境时可以直接对照步骤操作。动手练一遍比单纯看文章更有效。
返回列表