1. 硬件设计概述:从软件思维到硬件思维的转变
各位同学,欢迎来到《从Verilog到硬件设计:系统化修炼》的第一章。我是你们的讲师,一个在数字芯片设计领域摸爬滚打了十几年的老工程师。今天咱们不聊虚的,直接切入正题——硬件设计到底是怎么回事,它和写软件有什么本质区别。
1.1 数字电路基础回顾
先别急着翻白眼,觉得这是大学课本内容。我见过太多人,Verilog写得飞起,结果综合出来的电路完全不是那么回事。为什么?因为基础不牢。
数字电路的核心就三个东西:组合逻辑、时序逻辑、状态机。说白了,组合逻辑就是“输入一变,输出立马变”,比如与门、或门、加法器。时序逻辑呢?它有个“记忆”功能,靠时钟沿来更新状态,比如触发器、寄存器。
核心要点:组合逻辑没有记忆,时序逻辑有记忆。这是硬件设计的基石。
我记得刚入行那会儿,有个同事写了一个计数器,代码看起来完全正确,但仿真就是不对。折腾了两天,最后发现是组合逻辑里用了寄存器赋值,导致产生了锁存器。嗯,这种坑,你们以后也会遇到。
1.2 从软件思维到硬件思维的转变
这是本章的重头戏。很多从软件转过来的同学,最容易犯的毛病就是——把Verilog当C语言写。
你想想看,软件是顺序执行的。CPU一条一条地读指令,按部就班地跑。但硬件呢?所有模块是同时工作的。你写一个always块,它和另一个always块是并行执行的。这就像一个大工厂,每个车间都在同时运转,而不是等一个车间干完活再启动下一个。
我给大家画个图,看看软件和硬件的本质区别:
为什么会这样?因为硬件里每个模块都是独立的物理电路。你写一个加法器,它就是一坨门电路,通电就开始算,不需要等谁。你写一个状态机,它也是独立的一块逻辑,和旁边的计数器各干各的。
我个人习惯,在写Verilog之前,先画一个模块框图。把输入输出标清楚,把每个模块的功能想明白。这样写出来的代码,综合后基本就是你想要的结构。
小技巧:写Verilog时,脑子里要想着“这行代码会综合成什么电路”。如果想不到,那就先别写,回去翻翻数字电路教材。
1.3 FPGA与ASIC设计流程简介
好,接下来聊聊FPGA和ASIC。这两个东西,说白了就是硬件设计的两种“落地方式”。
FPGA(现场可编程门阵列),你可以把它理解成一块“万能积木”。里面预置了大量逻辑单元和连线,你通过编程(下载比特流)来“拼”出你想要的电路。优点是灵活,改起来快,适合原型验证和小批量生产。
ASIC(专用集成电路),则是“定制芯片”。从设计到流片,周期长、成本高,但性能好、功耗低、量大便宜。手机里的主芯片、AI加速芯片,基本都是ASIC。
我给大家整理了一个对比表,一目了然:
| 对比项 | FPGA | ASIC |
|---|---|---|
| 开发周期 | 短(几周~几个月) | 长(半年~两年) |
| 成本 | 前期低,批量单价高 | 前期高(光罩费),批量单价低 |
| 性能 | 中等 | 高(可定制优化) |
| 功耗 | 较高 | 低(可精细控制) |
| 灵活性 | 可重复编程 | 流片后无法修改 |
| 典型应用 | 原型验证、通信基站、工业控制 | 手机芯片、CPU、AI芯片 |
设计流程上,FPGA和ASIC的前端设计基本一样:
- 需求分析——搞清楚要做什么,性能指标是多少
- 架构设计——划分模块,定义接口
- RTL编码——用Verilog/VHDL写代码
- 功能仿真——验证逻辑对不对
- 综合——把RTL代码转成门级网表
- 时序分析——检查能不能跑到目标频率
区别在于后端。FPGA只需要布局布线、生成比特流,然后下载到芯片上就能跑。ASIC则要经过物理设计、流片、封装测试,每一步都烧钱。
避坑指南:我曾经有个项目,FPGA上跑得好好的,结果转ASIC时发现时序收敛不了。为什么?因为FPGA的布线资源是固定的,而ASIC的布线可以优化。所以,做FPGA原型时,一定要留时序余量,别卡着极限频率跑。
嗯,这里要特别强调一点:设计流程不是死板的。我见过很多团队,花大量时间在仿真上,结果综合出来一堆问题。我的建议是:早期多花时间在架构设计上,把模块划分清楚,接口定义好。代码写起来反而快。
最后,给大家看一个典型的设计流程图,感受一下整体脉络:
好了,第一章的内容就到这里。记住一句话:硬件设计,本质是“用代码画电路”。别把它当成写软件,也别把它当成画原理图。它是两者的结合——用软件的方式,描述硬件的结构。
课后思考:你写一个always块,里面有两个if-else分支。综合后,它会变成什么电路?是组合逻辑还是时序逻辑?为什么?
公众号:蓝海资料掘金营,微信deep3321