0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

8ECz_icstudy 来源:未知 作者:李倩 2018-11-26 14:39 次阅读

这篇文章再探讨一下如何利用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的学习就是一个慢慢积累违反人性的过程,希望大家能一起学习进步~。

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

    关注

    172

    文章

    5901

    浏览量

    172123
  • 服务器
    +关注

    关注

    12

    文章

    9123

    浏览量

    85318
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110070

原文标题:收尾篇:verilog验证二分法查找

文章出处:【微信号:icstudy,微信公众号:跟IC君一起学习集成电路】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用C语言实现高效查找二分法

    今天给分享一下使用C语言实现二分算法,主要包含以下几部分内容:二分查找算法介绍二分查找算法使用场景二分
    的头像 发表于 06-04 08:04 1090次阅读
    如何用C语言实现高效<b class='flag-5'>查找</b>(<b class='flag-5'>二分法</b>)

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找
    发表于 10-19 19:33

    简单的查找算法

    ; } return 0;} 3. 有序数组表的查找:一般使用二分法查找。通过判断查找元素与中间元素(mid)的大小来决定下一次的查找在低
    发表于 12-27 22:33

    Labview实现二分法查找数值区间

    二分法是检索里经常用到的一种方法,可以实现对有序数组进行检索,本程序通过二分法实现对数据进行区间匹配,并输出最小匹配区间和匹配区间的索引值,尤其适合多段函数的数值计算。
    发表于 04-18 13:22

    浅析渐近表示二分法

    《算法图解》NOTE 1 算法的渐近表示以及二分法
    发表于 10-10 10:58

    C语言教程之二分查找

    C语言教程之二分查找,很好的C语言资料,快来学习吧。
    发表于 04-22 11:06 0次下载

    基于C语言二分查找排序源代码

    本文档内容介绍了C语言归并、选择、直接插入、希尔、冒泡、快速、堆排序与顺序、二分查找排序源代码,分享给大家供大家参考。
    发表于 01-04 11:24 1次下载

    基于二分法与移动Sink的无线传感器网络数据收集协议

    传感器节点能量的有限性,严重制约了无线传感器网络的推广与发展。因此,如何改善传感器节点能源的利用率、节约能耗以及提高整个网络的生存周期成为该领域研究者面临的挑战之一。 为延长网络生存周期,提出一种基于二分法与移动Sink的无线传感器网络数据收集协
    发表于 03-12 10:43 0次下载
    基于<b class='flag-5'>二分法</b>与移动Sink的无线传感器网络数据收集协议

    图像处理算法之二分查找

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
    的头像 发表于 03-17 11:29 4868次阅读

    二分法查找在实际电路中的应用

    进制搜索实现的逐次逼近常常用于需要校准的场景中,比如SAR ADC、DRAM ZQ 校准、仪器校准算法等。
    的头像 发表于 10-29 10:03 6302次阅读
    <b class='flag-5'>二分法</b><b class='flag-5'>查找</b>在实际电路中的应用

    详解C语言二分查找算法细节

    我相信对很多读者朋友来说,编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1。
    的头像 发表于 06-22 09:05 2805次阅读
    详解C语言<b class='flag-5'>二分</b><b class='flag-5'>查找</b>算法细节

    现代混合云服务对未来托管数据中心的意义

    与以前的版本不同,新的混合云框架更易于部署,并且消除了“云计算vs托管数据中心”的二分法
    的头像 发表于 08-21 11:00 1841次阅读

    筑基_C_5_对数组的二分查找

    C语言泛型编程,实现对数组中某元素的二分查找
    发表于 12-06 10:21 9次下载
    筑基_C_5_对数组的<b class='flag-5'>二分</b><b class='flag-5'>查找</b>

    如何理解二分查找算法

    本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。 而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的
    的头像 发表于 04-19 11:10 616次阅读
    如何理解<b class='flag-5'>二分</b><b class='flag-5'>查找</b>算法

    FPGA设计中二分法查表算法的实现

    二分查找算法是在软件中广泛应用的一种算法,那么在FPGA的设计中是否可以用这种算法呢?什么场景下会可能用到这种算法呢?
    的头像 发表于 09-06 18:26 1038次阅读
    FPGA设计中<b class='flag-5'>二分法</b>查表算法的实现