很多刚入门FPGA/IC设计的同学,最开始的困惑不是“写复杂代码”,而是分不清Verilog的语法规则、不会区分硬件与软件编程逻辑。
和C语言纯软件顺序执行不同,Verilog是硬件描述语言,核心是描述电路结构、并行逻辑,这也是新手最容易踩坑的地方。
今天这篇文章,我把Verilog最核心、最常用、面试必问的基础语法一次性讲清楚,零基础也能看懂,适合收藏入门、复习巩固!
一、Verilog 核心认知:和C语言最大的区别
1.C语言:串行执行,一行跑完再跑下一行,用于软件运算;
2.Verilog:并行执行,所有模块、逻辑同时工作,用于搭建硬件电路;
3. Verilog 所有代码最终都会被综合成真实硬件电路,不是单纯的程序运行。
新手口诀:Verilog写的不是程序,是电路! |
二、最基础:模块结构(所有代码的框架)
模块(module)是Verilog的最小单元,所有代码都必须包在模块里,相当于电路的“外壳”。
1. 标准模块格式
verilog |
2. 最简示例(二输入与门)
verilog |
3. 端口类型详解
•input:输入端口,接收外部信号
•output:输出端口,向外输出信号
•inout:双向端口,既可输入也可输出(常用在I2C、SPI等总线)
三、数据类型(新手重中之重)
Verilog 核心只有两种数据类型,对应两种硬件电路,绝对不能混用。
1. wire 线型(组合逻辑专用)
•代表硬件导线、连线
•数值随时变化,无记忆功能
•必须用assign持续赋值
•常用于组合逻辑电路(与或非门、加法器、多路选择器)
2. reg 寄存器型(时序逻辑专用)
•代表硬件触发器(DFF)
•有记忆功能,时钟触发才更新数值
•只能在always块内部赋值
•常用于时序逻辑电路(计数器、状态机、寄存器缓存)
核心规则: assign 赋值 → 用 wire always 块赋值 → 用 reg |
四、两大核心逻辑块:组合逻辑 + 时序逻辑
Verilog 99%的代码,都是由这两种逻辑组成,吃透就掌握大半语法。
1. 组合逻辑(无时钟、无记忆)
特点:输入变,输出立刻变,不需要时钟,无延迟。
两种写法:
① assign 连续赋值(简单逻辑首选)
verilog |
② always @(*) 通用组合逻辑
verilog |
注意:组合逻辑必须用 @(*),不能写时钟,否则会生成锁存器(BUG源头)。
2. 时序逻辑(有时钟、有记忆)
特点:时钟边沿触发,只有时钟到来才更新数据,保持数据稳定。
最常用:上升沿触发
verilog |
边沿关键词:
•posedge:上升沿
•negedge:下降沿
五、赋值语句:阻塞 vs 非阻塞(最高频考点)
这是新手最容易出错、面试必问的语法点!
1. 非阻塞赋值 <= (时序逻辑专用)
•用于 always 时钟块(时序逻辑)
•并行赋值,不会阻塞后续代码
•不会产生竞争冒险,电路稳定
标准用法:
verilog |
2. 阻塞赋值 = (组合逻辑专用)
•用于 always @(*) 组合逻辑块
•顺序执行,写完一句再写下一句
•时序逻辑乱用会导致时序错乱、仿真报错
标准用法:
verilog |
终极口诀: 时序用 <= ,组合用 = 永不混用,杜绝BUG |
六、常用运算符(日常编码全覆盖)
1. 逻辑运算(判断条件)
•&& 逻辑与
•|| 逻辑或
•! 逻辑非
2. 位运算(硬件电路核心)
•& 按位与
•| 按位或
•^ 按位异或
•~ 按位取反
3. 移位运算(高频使用)
•<< 左移(等价乘2)
•>> 右移(等价除2)
4. 三目运算符(精简组合逻辑)
verilog |
释义:en为真取a,否则取b,替代简单if-else,代码更简洁。
七、流程语句:if / else + case
1. if-else 语句(条件判断)
多用于简单分支逻辑,支持多级嵌套
verilog |
避坑:组合逻辑if必须写全else,否则生成锁存器!
2. case 语句(多分支首选,状态机专用)
多条件判断比if-else层级清晰,不易出错
verilog |
八、位宽定义(Verilog必备规范)
Verilog所有信号必须指定位宽,默认32位极易出错!
标准格式
verilog |
示例
verilog |
九、新手必须遵守的编码规范
1.组合逻辑:用assign或always@(*)、阻塞赋值=、分支写全不缺项
2.时序逻辑:用always@(posedge clk)、非阻塞赋值<=
3.wire只用于连线,reg只用于时序寄存器
4.所有多分支逻辑,必须加default/else,杜绝锁存器
5.所有常量明确位宽,不使用默认位宽
十、总结
Verilog入门核心不在于记复杂语法,而在于建立硬件思维:
分清wire/reg、区分阻塞/非阻塞、拆分组合/时序逻辑,掌握这三点,你就搞定了80%的基础语法。
后续的计数器、移位寄存器、状态机、接口逻辑,都是以上基础语法的组合复用。
需要完整Verilog入门案例、新手练习代码包,可以持续关注后续更新!