VHDL 为何至今仍让工程师偏爱:一颗“确定性明珠”照见 HDL 语言分野

一门老语言的“王冠宝石”,其实不是语法,而是秩序
如果你问硬件工程师,VHDL 最让人头疼的是什么,答案多半会是:啰嗦、严格、写起来像在和编译器打官司。但如果换一个问题——VHDL 最珍贵的地方是什么——那答案很可能就像 Sigasi 这篇旧文说的那样:它对“确定性”的执念。
这篇题为《VHDL's crown jewel》的文章,作者 Jan Decaluwe 把焦点放在一个平时不太出圈、却几乎决定了语言气质的机制上:delta cycle。中文常译作“增量周期”或“零时延调度周期”。这个概念听起来有点学院派,实际上它处理的是一个非常工程化的问题:当多个并发过程在“同一时刻”发生时,仿真器到底该按什么顺序执行,才能保证结果稳定、不飘忽、不靠运气。
这件事为什么重要?因为 HDL 从来不是普通编程语言。你写的不是一个按行执行的脚本,而是在描述一堆可能同时发生的硬件行为。并发,是硬件的天性;而并发一旦进入仿真环境,就很容易变成“今天这么跑,明天那么跑”的噩梦。VHDL 的高明之处,不在于它让并发消失,而在于它给并发建立了一套交通规则。
Delta cycle:不给时间流逝,也要给事件排队
按照文章里的解释,VHDL 会把一个零物理时间内发生的事情拆成不同阶段处理。先统一处理信号值更新,再统一触发受影响的进程,然后这些进程如果又产生新的信号赋值,就把它们放进下一轮 delta cycle。注意,这里最关键的一刀是:信号更新和进程求值被分开了,而且是分阶段、成批处理。
这意味着什么?意味着即便同一个阶段里事件的内部顺序不固定,最终结果仍然是稳定的。因为所有相关进程看到的,都是同一批、已经完成更新的信号状态。就像一场考试,大家先统一发卷,再统一答题;而不是有人一边发卷,有人一边已经开始改答案。前者可能有点繁琐,但至少公平,结果也可复现。
这就是作者所谓的“确定性”。它不是说系统里没有并发,也不是说所有顺序都被写死,而是说:在语言规则层面,某些顺序差异不会影响最终结果。这在芯片设计里几乎是奢侈品。因为一旦仿真结果依赖某个隐含执行顺序,团队就会陷入无休止的争论:是代码有问题,还是工具有问题,还是某位同事“刚好写对了、但讲不清为什么对”。
很多软件工程师初看这里会觉得,这不就是调度策略吗?但在 HDL 世界,调度策略不是实现细节,而是语言语义的一部分。它决定了设计能否跨工具、跨团队、跨年份稳定存在。说白了,好的语言规则,会替工程师挡掉很多“本不该由人脑负责”的麻烦。
Verilog 的自由,也是一种危险的自由
文章接着把 VHDL 和 Verilog 做了一个很尖锐的对比。作者的判断非常明确:Verilog 在这件事上没做到位。原因不复杂——它没有像 VHDL 那样,把值更新事件和进程求值事件硬性隔离成不同阶段。于是,某个值更新可以出现在进程执行之前,也可以出现在之后。只要满足基本因果关系,很多执行顺序都“合法”。问题是,合法不等于安全。
这也解释了为什么 Verilog 社区里,关于 blocking assignment 和 nonblocking assignment 的讨论会常年循环上演,像一场没有结局的技术辩论。blocking 像普通变量赋值,立即生效;nonblocking 会延迟到未来一个 delta cycle。它确实在同步设计里提供了一套相对安全的写法,所以才有“时序逻辑用非阻塞赋值”的行业箴言。但 Jan Decaluwe 的批评也很直接:这只是个“半成品解法”。
因为 nonblocking assignment 只是把事件往后推了一步,并没有从根本上重构事件调度的相位关系。一旦离开纯同步设计,进入 testbench、高层建模或者更复杂的交互式仿真环境,工程师还是得自己小心翼翼地避坑。语言没替你兜住,规范、代码评审和经验主义就只能顶上来。
这恰恰是 Verilog/SystemVerilog 多年来的真实生态:它强大、灵活、工业应用广,但也留下大量“知道的人就知道,不知道的人迟早踩”的隐性知识。老工程师把这些规则口口相传,新人一边写一边交学费。这种文化当然能运转,但成本极高,而且很难优雅。
为什么今天再谈这件事,依然不过时
表面看,这是一篇 2010 年的博文,讨论的是 VHDL 和 Verilog 的语言哲学差异;可放到今天,它一点都不陈旧。恰恰相反,在芯片复杂度飙升、验证成本吞噬开发预算的当下,确定性比十几年前更值钱。
过去小团队做 FPGA,很多问题还能靠经验和直觉压过去。今天无论是 SoC、AI 加速器,还是汽车电子、航天控制,设计规模、跨团队协作和验证链条都复杂得多。一个“偶发的、不稳定复现的仿真问题”,足以让一个项目组连续几天睡不好觉。你以为是在查 bug,实际上是在跟语言语义留下的历史债打架。
这也是为什么我认为,这篇文章真正戳中的,不只是 VHDL 支持者的语言自豪感,而是一个更普遍的行业问题:我们到底希望硬件描述语言更像“自由的工具箱”,还是更像“有护栏的工程系统”? Verilog 家族长期赢在生态、工具、人才储备和验证体系;VHDL 则在语义严谨性上保留了很高的下限。两条路线各有拥趸,但随着设计复杂度继续上升,“语言帮你减少不确定性”这件事,价值只会更大,不会更小。
顺着这个问题再往前看,也能理解近些年为什么 Chisel、Bluespec、SpinalHDL 乃至一些 DSL 化的硬件生成语言会受到关注。大家并不只是想换一套更现代的语法糖,更是在寻找一种方式,把更多正确性约束前移到语言和编译阶段。说得直白一点,工程师已经不太想再靠背诵“阻塞赋值/非阻塞赋值使用口诀”来维持秩序了。
VHDL 的优雅,也不是没有代价
当然,夸 VHDL 的确定性,不代表它没有缺点。作者自己也承认,VHDL 也存在一些边角上的非确定性来源,比如 shared variables、文件 IO、非对称 resolution functions。只是这些情况在实践中相对边缘,不足以动摇它的整体设计哲学。
真正的问题在于,VHDL 的“严谨”常常伴随着“沉重”。它像一位要求极高的老派总工程师:规矩很多,情绪不多,但你出了问题,他会说“我早提醒过你”。这会劝退一部分开发者,尤其是在追求快速迭代的商业环境里。Verilog/SystemVerilog 则更像经验丰富、手很快的车间老师傅,招式灵活,适应范围广,但不少诀窍只能意会,难以言传。
所以这场比较,从来不是简单的谁先进谁落后,而是谁在什么场景下更合适。问题在于,当一个语言需要长期依赖“最佳实践”去修补语义层面的不确定性时,它终究会把成本转嫁给人。今天的 EDA 工具当然越来越聪明,静态检查、lint、形式验证也越来越成熟,但这些工具很多时候是在弥补语言早年留下的缺口,而不是天然拥有一个更干净的起点。
我尤其认同文中那种略带调侃、却并不轻佻的感叹:VHDL 这套机制看上去并不复杂,几乎像是一个“零成本解法”,那 Verilog 当年为什么没有这么设计?这是个很有意思的问题。也许答案与历史兼容性、实现成本、市场时机甚至用户群体偏好都有关系。技术史里常有这种场面:最优雅的方案未必赢得最广泛的采用,先跑起来的那一个,往往更有机会定义世界。
而这也正是半导体行业迷人的地方。语言设计不是纸上谈兵,它会穿透几十年的工具链、教材、招聘市场和工程文化。一个当年的语义选择,可能在今天仍左右着数百万行 RTL 代码的命运。
不是“谁消灭谁”,而是谁更能承受未来复杂度
如果把这篇文章放到今天看,我更愿意把它理解为一次提醒:在硬件设计里,确定性不是奢侈配置,而是基础设施。VHDL 的 delta cycle 机制之所以被称为“王冠上的宝石”,不是因为它多么炫技,而是因为它解决的是最容易被忽视、却最容易让团队付出代价的问题。
Verilog/SystemVerilog 短期内当然不会被这种讨论动摇。它的工业地位太稳了,尤其在数字 IC 设计和验证领域,生态壁垒深得惊人。但这并不妨碍行业重新审视一个老问题:未来的 HDL,究竟该把多少正确性内建进语言本身?如果一种语言的常见误用,几十年后仍要靠培训和戒律来修正,那它就不只是“学习曲线陡”,而是把系统复杂性悄悄外包给了工程师。
某种程度上,VHDL 的这颗“明珠”真正照亮的,不是过去,而是未来。它提醒我们,优秀的语言设计,不只是让代码能运行,更是让系统在复杂协作中依然可预测、可解释、可复现。对芯片行业来说,这种能力,比任何时髦语法都更耐用。