不管是设计数字电路还是软体,每增加一个变数,每增加一个功能,test cases的数量往往是指数增长(终于找到软硬体设计的共同点了??)。这造成数字电路开发的一大难题,即验证(design verification,简称DV)太耗时。一般晶元大厂DV攻城狮的数量大于逻辑设计攻城狮(当然,也有极个别厂让逻辑设计攻城狮自己做验证的,在此先不点名)。

你经过DV的工位,发现他们竟然也在敲代码,而且进化到了像是C++的语言。那叫UVM(Universal Verification Methodology)。UVM严格说来并不是一个语言,而是一个库,它提供了各种class来帮助DV提高测试代码的重复利用率,简化测试设计。这就像有了TensorFlow等等库之后,多数码工不用再关心下面的SGD。据说UVM一开始是为不懂C++的硬体攻城狮设计的,而对于已经学了C++的人,第一眼看到UVM的时候,感觉犹如梅超风看到欧阳锋练的九阴真经(不好意思梅姐,我假设您能看到欧阳锋练的九阴真经)。我曾经见过一个UVM的class,它的写法像是一个CNN能给自己产生训练集。

扯得有点远了。Anyways,DV之所以要用看起来高级那么一点点的UVM,是因为他们确实有太多的测试需要写了,而正巧测试代码不用做到晶元上。STE同学们会说,我们也是啊。但是,写测试只是DV工作的比较小的一部分。写完测试之后就是模拟。说起模拟,就一个字:「漫长的等待」。有多慢呢?公平滴说,模拟的速度取决于设计的复杂度(跟代码质量也有关,又找到一个软硬体的共同点了??)。对于一个中等大小的晶元,模拟的速度可能是一秒钟跑100到1000个时钟周期。为了不过分曝露年龄,咱们用1986年推出的80386 CPU做个比较(实在是抱歉,如果吓到90后和00后小朋友们了),它能一秒钟跑几千万个时钟周期。所以码工同学们,请想像一下,把你们的计算机换成33年前的产品,再把速度降低一万倍,然后在上面测试一下人脸识别是什么感觉?(不要笑,去问问那些现在正在做XXU验证的DV攻城狮,他们有人在这样跑CNN。)

码工同学会问,都几十年了,你们为啥不想办法加快一下模拟?先小声提醒一下,这个问题最好是去请教为晶元行业写模拟软体的码工同学们(他们那两三个厂最近几天热度比较高)。其实办法还真的是想了,而且想了不少办法。前面说的模拟是基于RTL的模拟。比它更高级一点的是SystemC,一种C++写的库,可以在更高的抽象层来模仿硬体逻辑。甚至还有直接用C来模拟数字电路的(回忆一下前一篇提到的多线程、while循环,真的是可以这么做的)。然而,越是高级的模型,跟下面的电路在细节上的差别就越大,因而越容易漏掉一些bug。各种权衡之下,在晶元设计的不同阶段会跑不同形式的模拟。这相当于增加了DV的工作量,因为各种测试又得重写。

加快模拟还有一个办法,就是用晶元来模拟晶元,这叫emulation。有一些晶元并不是那么「硬」,比如FPGA,上面有很多基本电路单元,电路单元之间的逻辑连接是可以被反复重构的,因此可以在逻辑上构建一个跟你设计的晶元具有相同功能的晶元。然而,因为FPGA上有大量资源被用来做重构,可以用来做逻辑的资源就比较有限,所以当你的晶元设计大到一定程度,一块FPGA就装不下了。码工同学说,这好办,学习一下我们的MapReduce。是的,emulation就是这么干的。一个emulator里面有多块FPGA,可以把晶元设计拆分之后放上去。跟MapReduce也有瓶颈一样,FPGA跟FPGA之间通信的速度极大地限制了emulation的速度。如果运气好,emulation能跑到每秒钟百万个时钟周期,快赶上33年前的CPU了。然而,那只是emulation光鲜亮丽的一面。那个重构的过程动辄需要花十几个小时甚至更长时间。另外,码工同学改一行代码,一般只需要重新编译那行代码所在的文件,但是逻辑设计改一行代码,整个FPGA需要重构一遍??(也有人在尝试partially重构,但目前似乎还没有大规模使用,而且速度也还是远远落后于重新编译一个C文件)。

另外,emulation发现了bug怎么办?FPGA上面没有printf,只有一个类似于fprintf的东西,且不是你想print什么就能print什么,只能dump出一些逻辑节点上的波形。更悲催的是,这一dump,emulation速度立马掉十倍甚至几十倍。因为数据量往往很大(为什么大?我们等于是在用33年前的CPU模拟今天的CPU,而今天的CPU一秒钟能轻松跑出十亿个时钟周期,dump其中一段就很多了),所以还得再花几个小时把它转换成攻城狮可以看的格式。转换好的波形就跟中学物理老师的示波器上的波形差不多,但是数字电路的信号非常多,等于是说在教室里摆几十上百个示波器一起看。Debug一个227x227x3的图像输出(Alex老师拿到之后是输入),攻城狮们可能就得花一晚上甚至几天时间好好研究这几十上百个示波器上的无数0和1(下图仅供参考)。

(未完待续)

作者声明:

  1. 题图和文末波形图引用于网路,版权归原作者所有。
  2. 本文为作者个人兴趣之作,仅代表作者个人观点,与任何公司或机构无关。
  3. 欢迎讨论。如需转载,请务必取得作者同意,并注明出处。

推荐阅读:

相关文章