Verilog入门经验分享

作为一名数字电子技术学生对Verilog HDL语言的学习经验分享

  1. 数电基础

    • 逻辑代数基础.
    • 组合逻辑电路:各种门电路,一些常用电路比如数据选择器,加法器,编码器,译码器,比较器等要十分熟练,要会看电路推导逻辑表达式和真值表,也要熟练逆推.
    • 时序逻辑电路:双稳态电路,锁存器,触发器,寄存器,一些常用电路比如移位寄存器,计数器等要十分熟练,状态转移图/状态机要十分熟练,要会看电路图推波形图,也要熟练逆推.
  2. Verilog基础

    ! 强烈建议初学者不要使用行为建模方式设计电路
    Verilog一开始并不是为了设计可综合电路而提出的,它的本质是一门基于事件队列模型的电路建模语言。因此,行为建模很容易会让初学者偏离描述电路的初衷: 开发者需要看着电路图,心里想象电路的行为,然后转化成事件队列模型的思考方式,最后再用行为建模方式来描述电路的行为,综合器再来根据这样的描述推导出相应的电路。从这个过程来看,这不仅是没有必要的,而且还很容易引入错误:

    • 如果开发者心里本身就已经有电路图,直接描述它是最方便的
    • 如果开发者心里本身就已经有电路图,而开发者对行为建模方式的理解所有偏差,可能会采用了错误的描述方式,从而设计出非预期的电路
    • 如果开发者心里没有电路图,而是期望通过行为建模方式让综合器生成某种行为的电路,这就已经偏离“描述电路”的本质了。大部分同学非常容易犯这样的错误,把行为建模当作过程式的C语言来写,尝试把任意复杂的行为描述映射到电路,最终综合器只会生成出延迟大,面积大,功耗高的低质量电路

    所以,直到大家掌握“描述电路”的思维而不被行为建模误导之前,我们强烈建议初学者远离行为建模方式,仅通过数据流建模和结构化建模方式直接描述电路。例如,上文关于if和always的说法从某种程度上来说是正确的,但下面的问题可以帮助大家测试自己是否已经掌握了Verilog的本质:

    • 在硬件描述语言中,“执行”的精确含义是什么?
    • 是谁在执行Verilog的语句? 是电路,综合器,还是其它的?
    • if的条件满足,就不执行else后的语句,这里的“不执行”又是什么意思? 和描述电路有什么联系?
    • 有“并发执行”,又有“顺序执行”,还有“任何一个变量发生变化就立即执行”,以及“在任何情况下都执行”,它们都是如何在设计出来的电路中体现的?
      如果你无法对这些问题作出明确的回答,我们强烈建议你不要使用行为建模方式。如果你真的想弄懂它们,你需要阅读 Verilog标准手册 。

    真正的描述电路 = 实例化 + 连线
    忘记行为建模方式,就可以很容易回归到描述电路的简单本质。想象一下,你手中有一张电路图纸,如果你需要向其它人描述图纸上的内容,你将会如何描述? 你一定会说出类似“有一个A元件/模块,它的x引脚和另一个B元件/模块的y引脚相连”的描述,因为这才是描述电路的最自然的方式。用HDL设计电路,就是在用HDL来描述电路图纸,图纸上有什么,就直接描述什么。所以,用HDL描述电路,无非是做两件事情:

    • 实例化:在电路板上放一个元件/模块,可以是一个门电路,或者是由门电路组成的模块
    • 连线:用导线将元件/模块的引脚正确地连起来
      大家可以体会一下,数据流建模和结构化建模是如何体现这两件事的,而行为建模又是如何把这两件简单的事情复杂化的。
  3. 进阶:时序约束与优化
    竞争冒险,建立/保持时间,时序约束与时序优化…


Verilog入门经验分享
http://example.com/2025/05/08/Verilog入门经验分享/
作者
lethe
发布于
2025年5月8日
许可协议