数字电路初学者
这类题确实挺烦人的,我当年笔试也栽过跟头。高频陷阱其实就那么几类,我总结一下:
第一是 always 块里阻塞和非阻塞赋值混用,这是必考点。组合逻辑用阻塞,时序逻辑用非阻塞,但题目里经常故意在同一个 always 块里混着写,比如先来个非阻塞赋值,紧接着又用阻塞赋值给同一个变量,这会导致仿真和综合结果不一致。
第二是敏感列表不全,尤其是组合逻辑的 always 块。题目可能漏掉某个输入信号,导致仿真时信号变化了但 always 块没触发。现在用 always @() 或 always_comb 可以避免,但老代码或故意挖坑的题里还会出现。
第三是生成块(generate)使用不当,比如 genvar 变量名冲突,或者 generate 里的例化语句写错了层次。
第四是 case 语句没写 default,或者 casex/casez 的用法有歧义。
第五是运算符优先级问题,比如 & 和 && 搞混,或者没加括号导致逻辑错误。
系统性的检查方法,我建议分三步走:
第一步,先看代码结构。检查每个 always 块是组合逻辑还是时序逻辑,赋值方式对不对,敏感列表全不全。时序逻辑看有没有复位,复位信号是同步还是异步。
第二步,看具体语法。检查 case 语句、if-else 分支是否完整,有没有产生锁存器的风险。检查运算符优先级,必要时加括号。检查生成块和循环的边界条件。
第三步,看功能意图。结合注释或上下文,判断代码想实现什么功能,然后看实际代码逻辑是否符合。比如想实现一个移位寄存器,但用了阻塞赋值,那肯定错了。
平时练习时,可以自己整理一个 checklist,把常见错误点列出来,做题时逐个核对。多找一些公司的笔试题做做,做多了就有感觉了。
最后提醒一点,有些题目会故意写一些语法上正确但功能有问题的代码,比如用非阻塞赋值实现组合逻辑,虽然仿真可能没问题,但综合后会有隐患,这种坑要特别注意。
