学 Verilog HDL 这件事,最容易被误导的地方在于:很多人把它当成一门“编程语言”去学,背语法、抄代码、跑仿真,然后发现一到 FPGA 板子上就不工作。问题不在于语法没背熟,而在于你还没有建立“硬件描述”的思维方式。这个 8 阶段学习计划,就是按我自己带过一批又一批新人的经验整理出来的:先解决工具链和验证闭环,再逐步进到组合逻辑、时序逻辑、状态机、接口协议和综合约束,最后用一个能跑在真实板子上的小项目收尾。它适合电子、通信、计算机相关专业的学生,也适合想转 FPGA 岗的软件工程师。全文没有浮夸的东西,每个阶段都有明确的验收标准和常见坑。
1. 学 Verilog HDL 之前,先搞清它到底在干什么
1.1 Verilog HDL 是硬件描述语言,不是写软件
Verilog HDL 的学名是 Hardware Description Language,硬件描述语言。它的核心作用不是“写程序”,而是描述一个数字电路:有哪些输入、哪些输出、哪些寄存器、信号之间怎么连接、时钟沿来的时候发生了什么。
换句话讲,你写的每一行代码,最终都会被综合工具映射成真实的逻辑门、触发器和连线。CPU 不会像执行 C 语言那样一条条跑你的 Verilog 代码。它是把这些代码翻译成电路,然后让电路去工作。
所以学习 Verilog HDL 时最怕的一件事,就是用软件思维硬套。比如看到一个for循环,就觉得它是“循环执行”;看到一个always块,就觉得它是“一个线程”。这种理解短期能应付考试,到了综合、时序约束阶段会全面失控。
1.2 这个 8 阶段计划解决问题的顺序
我把整个学习过程拆成了八层:语法基础、仿真验证、组合逻辑、时序逻辑、状态机、接口模块、综合约束、项目实战。这个顺序不是按知识难度线性排的,而是按“你能不能亲眼看到运行结果”来排的。
前两个阶段,你用不到 FPGA 开发板,只需要电脑和免费仿真工具,目标是跑通“代码 → 编译 → 仿真波形 → 看到结果”这个闭环。中间四个阶段,疯狂刷组合逻辑和时序逻辑模块,积累模块设计手感。最后两个阶段,才真正接触综合工具、约束文件、时序报告和硬件实测。
这样的安排有一个好处:进度可验证。你不会出现“学了一个月还不知道自己学得怎么样”的情况。每个阶段都有一个具体的交付物,或者是一个仿真波形,或者是一段综合报告,或者是一块跑起来的外设。
1.3 哪些人适合按这个计划学
先说结论:零基础可以学,纯软件背景也可以学,但都要接受一个前提——前两周可能会比较挫败。
如果你是电子类学生,数字电路基础还在,那这个计划会非常顺,前四个阶段几乎是一马平川。如果你是计算机背景,数字电路知识比较薄弱,那我的建议是第一阶段先补两件事:二进制与十六进制换算、寄存器与组合逻辑的基本概念。不需要学得特别深,只要知道“组合逻辑的输出只跟当前输入有关,时序逻辑的输出还跟历史状态有关”,就够用了。
这个计划不适合想要速成的人。它更接近一条踏实的工程路径:每个阶段都留了练习量,练到不查笔记也能写对为止。
2. 工具链决定学习效率:先从开源仿真入手
2.1 最低成本组合:iverilog + GTKWave
学习 Verilog HDL 最怕的不是语法难,而是环境没搭好。很多初学者一上来就装全家桶,结果在安装和破解环节就耗掉一个周末。
我更建议前四个阶段用一套开源组合,完全免费,覆盖前期的所有仿真需求:
- 编译仿真工具:Icarus Verilog,命令行里叫
iverilog - 波形查看工具:GTKWave
- 编辑器:VS Code,配上 Verilog 语法高亮插件
这套组合在 Windows、Linux、macOS 上都能跑。装完以后,你的工作流就是四步:
iverilog -o tb_counter.vvp tb_counter.v counter.v vvp tb_counter.vvp gtkwave tb_counter.vcd第一步编译源码和测试平台,第二步跑仿真并生成 VCD 波形文件,第三步打开波形查看器看信号变化。
这套流程的优点是简单、快、够用。前几个阶段你只需要关心逻辑对不对,不需要关心综合成什么电路,所以完全不需要装大体积的商业软件。
2.2 综合和布局布线工具单独划分
进入第 7 阶段以后,你才需要真正的 FPGA 工具链。目前主流的两家:
- Xilinx / AMD 的 Vivado / Vitis,对应 Artix-7、Kintex、Versal 等系列
- Altera / Intel 的 Quartus Prime,对应 Cyclone、MAX、Agilex 等系列
这两款软件都属于“大而全”的类型,安装包动辄几十 GB,初次打开还会要求联网获取 license 或确认设备信息。不要在第 1、2 周就装这种东西,否则你会把大量精力消耗在环境配置上,而不是消耗在学习本身。
综合工具解决的是“把 Verilog 变成真实电路”的问题,它包含:综合(Synthesis)、布局布线(Place & Route)、生成比特流(Bitstream)、时序分析(Timing Report)。这些概念在前四个阶段其实用不到,等你能熟练写状态机和接口模块之后再接触,理解成本会低很多。
2.3 千万不要急着先买开发板
每次看到有人还没开始学就先下单一块 FPGA 开发板,我都想拦一下。不是说开发板不重要,而是开发板的学习节奏和仿真学习完全不同。
开发板上的真实调试比仿真复杂得多:你需要处理时钟引脚、复位按键、LED 点亮条件、引脚约束、下载器驱动、板卡选型。如果在写模块的能力还不够的时候同时处理这些问题,很容易把所有时间花在“为什么下载报错”上面,没精力体会 Verilog 本身的逻辑。
用这个 8 阶段计划的话,开发板在第 6 到第 8 阶段之间再入手完全来得及。而且到那时候你已经能写出计数器、状态机和 UART 回环,上板调试能够做到“只处理硬件特有问题”,而不是把语法错误和硬件配置混在一起。
注意:前四个阶段请坚持仿真验证,不要跑去买板子。省下来的钱可以在阶段 7 之后买一块真正合适的板子,而不是随便买一块吃灰。
3. 8 个阶段到底怎么划分:先看总览再进入细节
3.1 阶段划分总表
这里先把 8 个阶段完整列出来。后面 4 到 7 章会逐段展开,可以直接当作学习清单来用。
| 阶段 | 主题 | 核心交付物 | 环境要求 |
|---|---|---|---|
| 1 | Verilog 语法最小集 | 能看懂并改写基础模块 | iverilog + 文本编辑器 |
| 2 | Testbench 仿真验证 | 写出测试平台并查看波形 | iverilog + GTKWave |
| 3 | 组合逻辑建模 | 完成加法器、选择器、编码器 | 仿真工具 |
| 4 | 时序逻辑建模 | 完成计数器、分频器、移位寄存器 | 仿真工具 |
| 5 | 状态机设计 | 完成按键消抖、交通灯控制器 | 仿真工具,可准备开发板 |
| 6 | 常用接口模块 | UART 回环、SPI 读写 | 仿真,适合上板 |
| 7 | 综合约束与时序分析 | 生成比特流并查看时序报告 | Vivado 或 Quartus + 开发板 |
| 8 | 综合项目实战 | 完成一个含外设和状态机的小系统 | 开发板完整验证 |
这个表格里的每个交付物都有明确判断标准,不是“我好像学会了”,而是“我已经跑通了,波形正确,综合没有致命警告”。
3.2 为什么前四个阶段不碰 FPGA 开发板
前四个阶段的核心是培养两项能力:第一,看到功能需求能想清楚需要哪几个模块;第二,写出的代码在仿真环境里能产生预期波形。
这两项能力都与具体板卡无关。你用任何一台电脑都能完成。如果过早引入开发板,会引入大量无关变量,比如引脚分配不对、时钟频率不匹配、复位极性选错、板卡驱动没装好。这些问题会把“我写代码”和“我做验证”之间的专注力打散。
很多学习者在前四个阶段里遇到的最大障碍,并不是看不懂基本语法,而是缺少高频的“完成一个模块 - 仿真 - 修正 - 完成下一个模块”的正向循环。仿真工具可以把循环缩短到 1 分钟以内。开发板做不到这个频率,因为你每次都要经过编译、综合、布线一长串流程。
所以我一直认为:前四阶段是用来建立手感的,不是用来跑硬件的。手感够了之后,第 6 阶段再上板,你会觉得几乎所有报错都变得可以推断。
4. 阶段 1 和阶段 2:语法最小集与第一个仿真波形
4.1 阶段 1 只学这些语法
Verilog 的语法体系非常庞大,但不是所有内容都适合新手。前两个星期如果去啃 IEEE 标准文档,基本等于劝退。这里我给一份“最小可用的语法集”:
- 模块声明:
module ... endmodule - 端口声明:
input、output、inout - 信号类型:
wire、reg - 位宽与常量:
[7:0]、8'd0、4'b1010、16'hFF - 运算符:位运算、逻辑运算、算术运算、比较运算、移位运算
- 组合逻辑结构:
assign、always @(*)、case - 时序逻辑结构:
always @(posedge clk)、always @(posedge clk or negedge rst_n) - 阻塞赋值
=和非阻塞赋值<=
先不要碰的东西:文件操作函数、系统任务($fopen、$readmemh等)、宏定义的复杂用法、二维数组、生成块。这些后面需要时再查,不影响前几个阶段的学习。
4.2 阶段 2:用 testbench 验证一个计数器
阶段 2 的核心是:你不仅会写设计模块,还会写 testbench 去验证它。testbench 用大白话讲就是一个“模拟世界里的测试插座”:你给它接上时钟、给上复位信号,然后把设计模块放上去,看它的行为。
先写一个最普通的 8 位计数器:
module counter ( input wire clk, input wire rst_n, output reg [7:0] cnt ); always @(posedge clk or negedge rst_n) begin if (!rst_n) cnt <= 8'd0; else cnt <= cnt + 1'b1; end endmodule对应的测试平台:
`timescale 1ns/1ps module tb_counter; reg clk; reg rst_n; wire [7:0] cnt; counter u_counter ( .clk(clk), .rst_n(rst_n), .cnt(cnt) ); initial begin clk = 1'b0; rst_n = 1'b0; #100 rst_n = 1'b1; #2000 $finish; end always #5 clk = ~clk; endmodule这个 testbench 做了三件事:产生一个周期 10ns 的时钟,在前 100ns 内保持复位有效,然后释放复位,让计数器跑了 2000ns。如果你在 GTKWave 里看到的 cnt 能每隔 10ns 加 1,并且复位期间保持 0,这个模块就算验证通过了。
4.3 仿真波形怎么看才算“正常通过”
新人在阶段 2 最容易犯的错误,是看着波形觉得“差不多”,但实际上时序关系不对。
我的判断标准有三条:
- 复位释放后,第一个时钟上升沿到来时 cnt 变成 1,而不是在复位释放瞬间立刻变成 1。
- 每个时钟上升沿之后 cnt 只变化一次,不会在一个沿内跳两次。
- 复位拉低后,在非时钟沿场景,cnt 尽快归零,且不再变化。
如果第一条不满足,说明你写的是组合逻辑捕获信号,或者 testbench 里时钟和复位关系写错了。如果第二条不满足,说明赋值方式有问题,大概率是把非阻塞赋值<=写成了阻塞赋值=。
4.4 常见坑:分号、模块名和文件路径
先说分号。新手在阶段 1 最常见的报错就是漏分号,原因是 Verilog 每一条声明、赋值、实例化语句都以分号结尾,但endmodule、always块首行后面不加分号。这类报错通常一编译就会提醒,不会太隐蔽,但反复出现会打击信心。
再说模块名。Verilog 里没有强制要求“模块名和文件名一致”,工程实践中建议一致,否则多人协作或者脚本编译时会非常混乱。我自己就见过因为模块名和文件名对不上,导致综合时版本混乱的案例。
最后说路径。使用 iverilog 时,注意先进入源码目录,再用相对路径编译。如果报 “Unable to find file”,第一反应应该是:我当前在哪个目录,我的文件叫什么,扩展名对不对。很多编译问题不是语法问题,而是路径和权限问题。
5. 阶段 3 和阶段 4:组合逻辑与时序逻辑的分水岭
5.1 阶段 3:组合逻辑题目库
阶段 3 的练习方向非常明确,不搞理论深度,直接刷模块。
这个阶段可以练这些模块:
- 多路选择器:用
case或三元运算符实现 - 全加器:用
assign和位运算实现,再对比行为级写法 - 编码器 / 译码器:理解输入输出位宽映射
- 比较器:实现无符号数、有符号数比较
- 二进制转 BCD 码:可以先做基础版,不用上移位算法
每种模块都建议用两种方式实现:一种是用逻辑表达式直接描述,另一种是always @(*)加case描述。这样能快速体会行为级描述和结构级描述的区别。
验收标准是:写完模块后,自己写 testbench,覆盖所有输入组合或关键边界。比如全加器,不仅要测 0+0、1+1,还要测低位进位为 1 的情况。只测正常输入不测边界,是仿真验证经常翻车的原因。
5.2 阶段 4:时序逻辑注意阻塞与非阻塞赋值
到了阶段 4,你开始接触真正的“边沿触发”设计。这个阶段最关键的就是理解阻塞赋值和非阻塞赋值的区别。
组合逻辑建模,建议使用阻塞赋值=;时序逻辑建模,也就是在always @(posedge clk)里面,必须使用非阻塞赋值<=。原因不复杂:非阻塞赋值能把“采样旧值”和“更新新值”分开,从而模拟真实寄存器在时钟沿同时采样的行为。
典型错误是把计数器写成这样:
always @(posedge clk) begin cnt = cnt + 1'b1; // 阻塞赋值 end在小计数器上,仿真看不出明显差异;一旦出现多个寄存器同时更新、或者后续逻辑依赖前一个寄存器的中间状态,阻塞赋值就会产生竞争冒险。这种 Bug 在仿真环境随机出现,非常烦人。
阶段 4 的练习集合:
- 同步复位和异步复位计数器
- 二分频、四分频、任意整数分频器
- 移位寄存器、环形计数器、约翰逊计数器
- 按键消抖里的计数器模板
5.3 为什么仿真过了,综合不一定过
阶段 3 和 4 结束时,很多人会有一种错觉:仿真过了,说明我已经会设计了。这只是完成了一半。
仿真工具只模拟功能,不会管这条路径是不是“物理上可实现的”。综合工具则不同,它会把代码映射为查找表、触发器和布线资源。代码里有以下几种情况,仿真没问题但综合会出问题:
- 循环变量不可综合,比如用一个
integer i在always里做动态循环上界 - 过大的
case分支没有补全 default,导致综合后产生锁存器 - 在
always @(*)里对某个信号部分赋值,某些路径没有赋值,综合时会推断出锁存器 - 使用
initial初始化寄存器,这在仿真里有效,但真实 FPGA 上寄存器上电状态是不确定的,应当由复位信号控制
这也是为什么阶段 7 要专门看综合报告和时序报告。前四个阶段可以暂时依赖仿真,但从阶段 5 开始,意识上要逐渐向“可综合设计”靠拢。
注意:看到
Latch inferred这类警告时,不要直接忽略。先判断它是不是由缺失 default 或 else 引起的,再决定怎么修。锁存器不是一定不能用,但很多时候它意味着你的代码结构和预期电路不一致。
6. 阶段 5 和阶段 6:状态机与接口模块
6.1 状态机:先别炫技,用一段式打底
到了阶段 5,很多学习者会卡在状态机上。状态机的本质是:把设计的行为分成若干个稳定状态,每个状态下做固定的事情,再根据条件跳转到下一个状态。
第一遍学状态机,我不建议直接写三段式。先老老实实地用一段式把所有逻辑写在一起,目的是把状态的跳转条件和每个状态下的输出行为理解清楚。等熟悉了,再切成两段式或三段式。
一段式的写法是把状态寄存器、状态跳转、输出逻辑写在一个always块里。优点是直观,缺点是输出逻辑混在里面容易产生违例。它作为入门理解阶段非常合适,但不适合做复杂设计。
建议练习:
- 输出序列检测器:检测 1011 序列
- 交通灯控制器
- 按键消抖状态机
- 简易自动售货机状态机
6.2 阶段 5 验收标准:跑通一个按键消抖
按键消抖是这个阶段最值得认真做的小项目。它涉及异步输入、计数器、状态机和稳定输出四个关键能力,难度不高但完整性很高。
验收时可以这样设计:
| 功能点 | 判断标准 |
|---|---|
| 按键按下 | 抖动期间输出不变化 |
| 按键稳定按下 20ms 后 | 输出变为有效电平 |
| 松开按键 | 重新计时,不误触发 |
| 计数功能 | 每按一次,计数器加一 |
你会用到两个计数器:一个用于 20ms 延时判断,一个用于最终按键次数统计。写完之后,用仿真工具构造一个带有抖动窗口的输入信号,看输出是否只变化一次。这一步比单纯看语法更接近真实工程判断。
6.3 阶段 6:接口协议模块怎么做
阶段 6 的三件套是 UART、SPI、I2C。对新手来说,我建议先做 UART 回环,再做 SPI 从机,I2C 可以放到阶段 8 之后,因为它的时序复杂度和调试成本更高。
UART 回环的意思是:FPGA 收到一条串口数据,再原样发出去。你需要在 PC 上开一个串口助手,给开发板发送一个十六进制数据,然后 FPGA 回传同样数据。跑通这个之后,你就正式迈进了“真实硬件通信”的门槛。
UART 回环里最核心的是波特率计数:比如系统时钟 50MHz,波特率 115200,那么每个数据位对应的时钟周期数约等于 434。你需要根据一个 init 脉冲,从接受中间采样、移位寄存器接收、帧完成判断、再到发送模块启动,每一段都用状态机或计数器完成。
这个阶段一定要上板验证,因为仿真时不会暴露波特率误差、机械开关抖动、电源纹波造成的偶发错误。但也不要一上来就调大波特率,先按 9600 或 115200 跑通,再把速率提高。串口偶尔乱码时,不要急着改代码,先检查波特率是否匹配、时钟频率设置是否正确、USB 转串口线是否接触不良。
7. 阶段 7 和阶段 8:跨时钟域、约束和综合项目
7.1 阶段 7 重点看综合报告和时序报告
到阶段 7,你已经能写出不少功能正常的模块,但真正决定系统能不能稳定运行的,是时钟和时序。这个阶段要开始使用 Vivado 或 Quartus Prime,学习怎么添加约束文件,把你代码里的时钟引脚、复位引脚、LED 引脚绑定到开发板的具体管脚上。
约束文件的本质,是把你代码里的抽象端口映射到真实的物理引脚,同时告诉工具:这个时钟频率是多少,哪些信号是异步的,哪些路径需要特别关心。
阶段 7 的验收标准不是“生成了比特流”,而是:
- 综合报告里没有不明所以的锁存器推断
- 时序报告里的 WNS(最差负时序裕量)大于 0,或者至少是接近 0
- 没有未连接端口和隐式单比特网络警告
- 抓取任意一条关键路径,能看出它从哪个触发器到哪个触发器,路径延迟主要由哪些逻辑级数组成
如果 WNS 是负的,说明某些路径不满足你设定的时钟频率。处理顺序是:先看是不是代码逻辑级数太深,再看是不是约束频率写得太激进,最后检查跨时钟域路径有没有做异步处理。
7.2 阶段 8 选项目:按钮呼吸灯、数码管扫描、串口回环
阶段 8 的综合项目不建议一上来就做 CPU 或复杂图像处理。我推荐按这个顺序:
第一个项目:按键控制呼吸灯。用 PWM 模块和计数器实现 LED 亮暗渐变,再通过按键切换模式。这个项目覆盖了分频、计数、状态机、输出控制几个核心能力,而且反馈直观。
第二个项目:数码管动态扫描。你需要做七段译码、位选扫描刷新,还要处理刷新频率不能闪烁的问题。这个项目能加深你对“时间分片”的理解。
第三个项目:UART 回环并扩展一个寄存器读改写功能。接收两字节命令,根据命令控制 LED 或读取按键状态并回传。这个项目已经具备一个小型设备控制器的雏形。
7.3 项目做完以后要怎么检查
一个项目不是说“功能看起来正常”就算通过。我建议按这个检查单过一遍:
- 上电后所有状态是否可控,不会出现不可预知初始状态。
- 按键和输入信号是否都需要做消抖或同步处理,处理之后有没有副作用。
- 复位释放后模块是否进入已知初始状态。
- 连续运行 10 分钟以上,观察是否出现偶发错误或系统卡死。
- 查看时序报告,确认没有负裕量或严重扇出问题。
- 把所有关键改动放到版本控制里,不要用
final_v2这种文件命名方式。
这个阶段的重点不是“代码写得多花哨”,而是“系统是否在你的板子上稳定可复现”。稳定性比炫技重要得多。
8. 学习中最容易误判的几类问题
8.1 学不会真不是理解力问题
我观察过很多学习者,前两个阶段很顺利,到了状态机就停滞。他们通常把原因总结为“我逻辑能力不行”,其实真正的问题是没有把状态机拆成“状态寄存器 + 跳转条件 + 输出逻辑”三块来看。
你不需要一上来就理解有限状态机的全部数学含义。你只需要会画一张简单的状态转移图,然后照着图写代码。如果不会画图,说明需求还没拆清楚。这时候不要硬写代码,拿一张纸把状态和跳转条件都列出来,问题往往就清晰了。
8.2 报错不一定是你写的代码有问题
在学习中后段,你会遇到很多“看起来很奇怪”的问题。比如功能仿真正常,上板却不跑;或者第一次下载没问题,第二次下载后行为变了。这些不一定是代码逻辑问题,很可能是以下几类原因:
| 现象 | 优先排查顺序 |
|---|---|
| 下载成功但板子无反应 | 引脚约束是否正确,电源指示灯是否亮,复位键电平是否匹配 |
| 仿真正常但综合后功能不对 | 是否产生了锁存器,是否有未复位寄存器,是否有跨时钟域路径未处理 |
| 偶尔乱码或数据错位 | 波特率误差、通信线接触、电平标准不匹配 |
编译报一堆Port does not exist | 模块例化时端口名写错,或模块名与文件名不一致 |
| 时序违例但功能看起来没问题 | 约束频率是否合理,逻辑级数是否太深,是否使用了错误的时钟缓冲资源 |
排查顺序一定是:先看现象,再查输入,再看环境,再查参数,最后才怀疑工具和代码本身。不要一上来就把代码重写一遍。
8.3 多阶段项目先从最小样例验证
阶段 8 的综合项目会比前面的练习复杂得多。很多人习惯把所有模块写完再一次性仿真,结果出错后不知道是哪个模块引起的。
更稳妥的方式是先做最小样例:
- 搭一个只包含时钟和复位的最小顶层,确保它能综合并生成比特流。
- 加入第一个外设模块,比如按键输入,先看按键能不能正常控制 LED。
- 再加入第二个模块,比如呼吸灯,验证它和按键之间的交互。
- 最后加入通信模块,把系统串起来。
每增加一个模块就做一次完整验证。宁可多花几次综合时间,也不要一次加入太多不可控因素。这个习惯在真实项目里特别重要。
9. 8 个阶段速查表与后续方向
9.1 阶段速查表
| 阶段 | 核心目标 | 建议耗时 | 通过标志 |
|---|---|---|---|
| 1 | Verilog 语法最小集 | 1 周 | 能不看笔记写出计数器模块 |
| 2 | Testbench 仿真验证 | 1 周 | 能用波形判断模块时序正确 |
| 3 | 组合逻辑建模 | 1-2 周 | 完成全加器和译码器并仿真通过 |
| 4 | 时序逻辑建模 | 2 周 | 完成分频器和移位寄存器并仿真通过 |
| 5 | 状态机设计 | 2-3 周 | 完成按键消抖并上板验证通过 |
| 6 | 接口协议模块 | 2-3 周 | 跑通 UART 回环,数据不丢不错 |
| 7 | 综合约束与时序分析 | 2-3 周 | 时序报告无负裕量,能读懂关键路径 |
| 8 | 综合项目实战 | 3-4 周 | 完成一个含人机交互的小系统并运行稳定 |
这个时间是基于每天能抽出 1 到 2 小时来估算的。如果全天脱产学,可以压缩到 6 到 8 周。反过来,如果只能周末学,拉长到三个月也很正常。重点不是快,是每个阶段的验收标准都能达成。
9.2 学完之后怎么选进阶方向
走完 8 个阶段后,你已经具备独立设计中小规模数字系统的能力。下一步方向可以按兴趣选:
- 数字信号处理方向:学 FIR 滤波器、FFT、CORDIC,配合 DSP 和除法器 IP。
- 图像处理方向:学 VGA 时序、HDMI 接口、帧缓存、图像缩放,往往需要外部 DDR 和 PLL 配合。
- 接口控制器方向:深入学 PCIe、Ethernet、DDR3/DDR4 控制器,这些模块通常需要额外板卡和参考设计。
- 低功耗设计与验证方向:学 UPF、SystemVerilog Assertion、UVM,走验证路线。
- SoC 方向:学 MicroBlaze / NIOS II / RISC-V 软核处理器,把 Verilog 和嵌入式软件打通。
这几个方向都建立在基础模块设计能力之上,所以前 8 个阶段属于地基工程,越扎实越好。
9.3 我的学习优先级建议
最后给一个最直接的建议。如果你目前是零基础,请严格按照顺序走,不要跳阶段。尤其是前四个阶段,虽然看起来简单,但它们会帮你建立“硬件描述”而不是“软件书写”的思维。
如果你已经知道基本语法,想快速进入实际设计,那至少要把阶段 5 和阶段 6 补完,再开始碰综合约束。如果直接上手综合工具,你会在约束文件和时序报告里碰到大量名词,它们每一个背后都对应着你在阶段 3、4 就该理解的电路结构。
Verilog HDL 的学习曲线不是一条陡坡,而是一组阶梯。每爬一个阶段,你都需要能独立“演示”出自己的能力,要么是一个仿真波形,要么是一段综合报告,要么是开发板上的一个功能。这个 8 阶段计划给你的不是一份资料清单,而是一套可以自我检查的路径。把每个阶段的“通过标志”写在一张纸条上,完成一个划掉一个,比收藏任何学习资料都更管用。