2026年,FPGA校招笔试题中Verilog实现状态机,一段式、二段式、三段式到底哪个更受面试官青睐?求具体代码对比和适用场景

开放8 回答 4 浏览

最近在准备FPGA校招,刷了很多笔试题,发现状态机几乎是必考。但关于一段式、二段式、三段式的写法,网上说法不一,有的说一段式简单但容易出锁存器,有的说三段式可读性好但代码量大。想问下2026年面试官到底更看重哪种写法?能不能给个具体的Verilog代码对比,说明各自适合什么场景?比如控制逻辑用二段式,复杂时序用三段式?另外,如果笔试让手撕状态机,一般会给多长时间?

分享:
  • 电路设计初学者

    笔试手撕状态机最好直接上三段式,面试官看到组合和时序分开基本就不会挑剔了。一段式写简单计数器还行,复杂状态机容易把自己绕晕还藏锁存器,校招没必要冒险。时间一般20分钟够写个三状态FSM了,别纠结哪种好,能跑能综合不出latch就是王道。你平时练习用哪个工具仿真?

  • 码电路的阿明

    其实面试官不是非要你选三段式,而是看你代码里有没有无意识的锁存器、组合环路这些雷。我面过几家,他们更在意状态机是否可读、能否直接上板。一段式适合那种状态少、输出只跟当前状态挂钩的简单组合逻辑,比如一个按键消抖里的状态跳转;二段式我一般用在中等复杂度的控制通路,比如SPI接口的发送握手机制;三段式则是复杂时序的标配,比如DDR读写控制器。笔试如果是手撕,正常给20到30分钟,建议先画个状态转移图再动笔,时间够用。但注意,如果你三段式里把next_state写成了阻塞赋值,那还不如一段式呢。你目前练的是哪种写法?

  • 电子入门生

    说个实在的,2026年校招面试官大概率不会因为你用一段式就一票否决,但如果你写了一段式而且里面出现了隐含锁存器,那基本就踩雷了。锁存器的典型场景就是case分支没写全或者if没有else,一段式里状态寄存器和输出逻辑混在一起,很容易漏掉default或else。二段式把状态跳转(时序)和输出(组合)拆成两个always块,常见于控制通路,比如一个简单的流水线握手FSM,状态数在四个以内的时候二段式写起来很快,而且综合结果也不差。三段式是把输出逻辑单独再拆一个always,这样状态寄存器和输出寄存器都清晰,适合状态数多、输出复杂的场景,比如一个带超时重传的UART接收器。笔试的话,我个人建议你只练三段式,因为写熟了之后二段式一段式自然能看懂,反过来不一定。另外,有个小技巧:状态机里状态编码用独热码还是格雷码?如果面试官没要求,对于少于8个状态的小FSM,独热码更省逻辑资源,格雷码适合跨时钟域握手——但这不是校招重点考察的,别在上面花太多时间。你目前对独热码和格雷码的选择有概念吗?

  • 硬件小白

    校招面试官看状态机代码,第一眼扫的是有没有latch和组合环路。一段式把状态寄存器和输出搅在一个always里,case分支少个default就可能生成锁存器,这在面试官眼里是基本素养没过关。二段式把状态跳转和输出分开,中等复杂度的控制逻辑比如SPI收发机用起来挺顺手。三段式是稳妥选择,时序和组合完全分离,面试官看到这种写法通常不会再挑刺。笔试手撕的话,20分钟足够写个四状态FSM了,但前提是你平时用仿真工具跑过,不是纯背代码。你目前用哪种工具做仿真验证?

  • 芯片设计新人

    一段式、二段式、三段式,面试官真正打分的是代码背后的设计思维,不是写法本身。我面试过几家芯片公司,遇到过有人把一段式写得极其清晰,状态转移表列好,输出用组合逻辑独立处理,面试官照样给高分。但那是老手才敢玩的,校招生写一段式最容易踩的坑是:状态寄存器里混了组合输出,综合后生成不必要的锁存器,或者由于敏感列表没写全导致仿真和综合结果不一致。笔试给20-30分钟,如果选一段式,你得额外花时间检查每个case分支是否覆盖完整、每个if有没有else,时间上其实不划算。二段式是性价比比较高的写法,状态跳转单独一个always块用非阻塞赋值,输出逻辑用组合always或assign,适合状态数在八个以内的控制通路,比如I2C主设备的状态机。三段式则把输出也拆成时序块,好处是输出寄存器化,没有毛刺,适合输出需要直接连到外部引脚的场景,比如一个带使能信号的PWM发生器。但三段式也有陷阱:如果你把next_state写成了阻塞赋值,那综合出来的结果可能多出一级延迟,比一段式还差。所以我的建议是:笔试时如果题目没特别说明,直接用三段式框架,把状态编码、跳转条件、输出值分开写,面试官一眼就能看出你理解时序和组合的区别。但别把三段式当成万能模板,遇到状态数很少的输出组合逻辑,硬拆三段反而显得多余。你练状态机的时候,有没有遇到过仿真通过但综合报warning的情况?

  • Verilog入门者

    面试官看状态机,除了写法,还会关注状态编码的选择。如果你写了一段式,状态编码通常用独热码,因为组合输出可以直接用case语句对应,综合工具优化起来也快。但独热码在状态数超过十几个时,寄存器资源消耗会明显增加,这时候格雷码或者二进制编码更省资源。二段式和三段式里,编码选择相对灵活,因为时序和组合分离,你可以把状态位宽单独定义,然后在输出逻辑里用casez或casex处理无关位,减少代码量。笔试手撕时,我见过有人把状态编码写成parameter,然后在case里用独热码比较,结果因为位宽不匹配被综合工具优化掉,功能仿真过了但上板就错。一个小技巧是:写状态机之前先画状态转移图,标清每个状态的输出值和跳转条件,再动手写代码。这样不管用几段式,结构都清晰。另外,如果笔试时间只剩10分钟,别硬写三段式,一段式把状态跳转和输出用assign分开写,也能凑合过。你遇到过状态机综合后面积过大的问题吗?可以聊聊具体场景。

  • 二进制菜鸟

    说实话,2026年校招面试官看状态机,核心不是数你用的几段式,而是看你的代码能不能综合、有没有锁存器、能不能一眼看懂。一段式写个四状态的按键消抖没问题,但如果你在case里把输出和状态跳转搅在一起,漏了default,面试官扫一眼就知道你还没理解可综合设计的边界。二段式我见得最多,因为大部分控制通路的状态数在4到8个之间,比如I2C的写操作序列,二段式写起来快,仿真也直观。三段式是保底选项,尤其当你的状态机输出需要直接连到外部引脚或者控制一个数据通路时,输出寄存器化能省掉后级打拍,面试官看到这种写法通常不会再追问。笔试时间一般给30分钟,如果你选三段式,建议先花5分钟在草稿纸上画状态转移图,标清楚每个状态的输出值和跳转条件,再动手写。我见过有人上来就写代码,结果写到一半发现少了个状态,又回头改,时间根本不够。一个小提醒:状态编码用parameter定义,别直接写数字,否则改状态数时容易漏改位宽。你目前刷题时用过仿真工具验证过自己的状态机吗?

  • Verilog菜鸟

    校招面试官看状态机代码,本质上是在考察你对时序逻辑和组合逻辑边界的理解。一段式之所以容易出问题,是因为它把寄存器和组合逻辑塞在同一个always块里,综合工具在推断敏感列表时可能把组合输出当成寄存器输入,生成你意料之外的锁存器。我曾经帮一个学弟看代码,他用一段式写了一个八状态的SPI控制器,仿真全对,但上板后输出信号一直有毛刺,查了半天发现是case分支里一个if没有else,综合工具自动补了一个锁存器来保持上次的值。二段式把状态跳转和输出分开,但输出用组合逻辑实现,如果输出信号需要跨时钟域或者驱动长线,组合逻辑的毛刺会直接传出去。三段式把输出也寄存器化,代价是多一个时钟周期的延迟,但换来了干净的波形。笔试手撕状态机,我个人建议你只练三段式,因为它的结构固定——三个always块分别管状态寄存器、次态组合逻辑、输出寄存器。你只要记住这个骨架,哪怕状态转移条件写错,面试官也能看出来你是理解框架的,只是细节失误。笔试时间一般20到30分钟,写一个四状态的三段式FSM足够了,但前提是你得把状态编码、复位逻辑、默认分支都写全。另外,状态编码用独热码还是格雷码?如果状态数少于8个,独热码综合后速度快,因为组合逻辑简单;超过8个,格雷码能省寄存器。面试官如果追问这个,你答出来就是加分项。你平时练习时有没有对比过不同编码下的综合结果?

登录后可在本页底部提交回答

提问者

芯片设计新人查看主页

描述场景与已尝试方案,更容易获得有效解答

浏览「其他」

相关问题

同分类问答

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位

技术问答

问完之后的闭环

  • 关联课程精学高频问题往往对应章节,建议回到课程补基础。
  • 产出与互助解决过程可写成笔记,帮助后续同学。

探索全站