如何利用verilog验证二分法查找的设计代码

电子说

1.2w人已加入

描述

这篇文章再探讨一下如何利用verilog验证二分法查找的设计代码。

话说IC君当时毕业的时候,拿了一个专门做验证的offer,最终为了爱情放弃了它。现在集成电路的规模越来越大,需要的验证人员越来越多,薪资待遇也是水涨船高。

verilog验证不同于设计,不需要遵循可综合的限制,只要verilog支持的语法都能拿来用,这个时候就需要大家发挥自己的想象力,竭尽所能找到所有的bug,并且能够快速的报告错误。

有时候甚至可以利用一些脚本自动将错误信息发送到邮箱。想象一下,下班前丢一个testbench到服务器上仿真,第二天上班的时候喝喝茶看看邮件就把bug抓了,是不是美滋滋的

如果我不是验证工程师,有没有必要学点简单的验证技术呢?平时在做项目的过程中,大家负责的电路中可能有很多跟二分法查找类似的小模块。你可能一不小心写错了代码,或者搭错了电路。这些小模块我们最好随手验证一下,虽然最终也会有其它人专门验证,但一些明显的错误如果被别人抓到了,还是有点不太爽的。

通常验证的代码要包含三个部分:

1) 产生模拟激励(波形)。

2) 将输入激励加入到测试模块并收集其输出响应;

3) 将响应输出与期望值进行比较。

1

由于verilog是一个模拟硬件并行执行的过程,所以上面三个部分没有顺序之分。

将输入激励加入到测试模块并收集其输出响应:

首先是模块信号的定义,输入信号会作为激励加入到测试模块SAR,SAR的输出信号也会送到tb_sar模块的线网信号pucode。

然后就是产生模拟激励(波形)的过程:

从前2篇文章我们知道,6位的SAR查找过程需要跳5次clk,每次clk上升沿的INCR可能为1,也可能为0。验证过程必须要覆盖所有可能的INCR的值。

这里我们如上图先产生RSTB 信号,接着CLK信号toggle 5次,并用val[0],val[1],val[2],val[3],val[4]分别赋值给这5次的INCR,这是代码中内部小for循环(count)来实现。

为了遍历所有的INCR,我们必须重复前面的过程32次,遍历val[4:0]的取值从0-31,这样就可以覆盖到所有可能的INCR值了。这是代码中外部大for循环(val)来实现。

下面是产生输出文件的过程,这里我们设置输出结果的格式是fsdb,当然我们也可以设置成vcd的格式。fsdb的文件size比较小,而且利用verdi的波形工具nWave看起来也比较方便。在实际项目过程中,有时候我们要跑的testbench很多,跑出来的结果文件就会很多,如果不用fsdb格式,最终需要更大的存储空间。

fsdb(fast signal database)文件是verdi使用一种专用的数据格式,类似于VCD,但是它是只保留了仿真过程中信号的有用信息,除去了VCD中信息冗余,就像对VCD数据进行了一次huffman编码。因此fsdb数据量小,而且会提高仿真速度。fsdb是通过verilog的PLI接口来实现的。$fsdbDumpfile,$fsdbDumpvars等

VCD是一个通用的波形文件格式,是IEEE1364标准(Verilog HDL语言标准,p325)中定义的一种ASCII文件.可以通过Verilog HDL的系统函数$dumpfile,$dumpvars等来生成,基本所有的Verilog仿真器都会支持。

将响应输出与期望值进行比较:

接下来是产生期望值,期望值这里我们定义为nextpu,验证工程师的主要工作职责就是用与设计工程师不同的方法产生期望值。一般的公司都会是不同的人来做验证,可能有些小公司是一个人既做设计又做验证。

最后是比较期望值和测试模块SAR的输出,如果不同则打印出错误信息。这里用一个always语句实现,如果pucode发生变化就比较结果,有错误就输出到屏幕。

2

下图就是整个验证的波形:

可以看出val从0-31依次变化,pucode和nextpu的值也是一样,没有什么错误。

再看一下某一次的二分法查找过程:

首先rstb会从low到high,这样pucode就会被设置成初始值6'b100000;

在5次clk toggle的过程中,incr一直为0,pucode会一直发生变化,最终pucode变为6'b000001。

验证了我们之前文章的2个版本的设计代码,竟然都没有错误,因为本来就是一个小模块,出现错误的可能性也不大。

不过没有错误,感觉怪怪的,把设计代码改一改,确认我们的验证代码是不是真正起作用了,哈哈。

我们把设计代码中一句:

改成如下所示:

再run一下验证代码:

pucode和nextpu就有了不一致性:

这时候debug一下,就很容易定位错误的代码。

写到这里关于二分法查找(二进制搜索/逐次逼近SAR)的学习就告一段落了。这个模块虽然小,但是起码把开出spec,设计电路,验证电路基本的流程都过了一遍,以后可能还会尝试类似小模块的学习。

不积跬步无以至千里,IC的学习就是一个慢慢积累违反人性的过程,希望大家能一起学习进步~。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分