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

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

3天内不再提示

怎么才能写出高覆盖率的Verilog代码?

电子工程师 来源:硅农 作者:硅农 2021-06-01 10:13 次阅读

芯片前端工程中,测试验证的核心理念:以提高覆盖率为核心。设计工程师需要关心的主要有行覆盖率(Block),条件覆盖率(Expression),翻转覆盖率(Toggle),状态机覆盖率。本文从ASIC设计的角度上来讨论,如何写出高覆盖率的Verilog代码。assign慎用按位运算逻辑,& | ^ ^~和三目运算符,慎用。使用这样的描述方式本身功能并没有什么问题,而且写起来很爽,但是在很多情况下覆盖率是真的不好收。

assign mult_a[3:0] = ({4{mult0_vld}} & mult_a0) | ({4{mult1_vld}} & mult_a1) | ({4{mult2_vld}} & mult_a2)

用或门和与门实现的一个选择器的功能,前提是vld不能同时有效,相对于下面第二种写法可能会节省一点门。但是问题我们在收集Expression时需要分析每一个条件是否跑到0/1,上面一共有六个信号,所以0、1随机组合的情况就有2的6次方种,mult_a0作为数据端,如果没有出现过全0的情况,通过定向case可以覆盖到,但如果是参数作为选择器的输入端,那么参数本身就是有永远不为0的情况,定向case也无法通过。

所以这个时候就只能把它waive(放弃)/exclude(排除)掉,并解释原因。如果只有几条这样的写法还好,如果有成百上千条,那么就需要重复上面的操作上千次。单纯的体力活,没有任何技术含量。但是直接换一种写法。

always @(*)begin if(mult0_vld) mult_a[3:0] = mult_a0; else if(mult1_vld) mult_a[3:0] = mult_a1; else // if(mult2_vld) mult_a[3:0] = mult_a2;end

这样写覆盖率只会检查行覆盖率,基本上哪一行没跑到一目了然,也并不需要多余的体力劳动。代码可读性也很高。第二种可能会消耗更多的逻辑,但是对于整体的系统而言,也是不值一提的。换句话说,扣这一毛两毛的,要抓大头。if-else括号中的条件不要太多

always @(*)begin if(data_vld && mode_sel && enable_flag && (data_num[3:0] 》 4‘d7) && (ram_addr[4:0] 》 4’d15) && 。。。)end else 。。。

当然最开始的时候肯定不是这样的设计,造成如此冗长的逻辑,大概率是后期调试打的补丁,可以把一些条件拿出来专门做一个信号,会让条件覆盖率分析容易很多,不然这么长的选择,真不是给人看的。cur_state不可能同时出现在两个状态上在控制上用状态机中,假如有这样的逻辑。

assign enable = ((cur_state != STATE_A) && (next_state == STATE_A)) || ((cur_state != STATE_B) && (next_state == STATE_B))

这样的写法目的是在状态跳转时产生一个脉冲信号,不过在条件覆盖率中会检查这两个选择条件,cur_state != STATE_A为0与cur_state != STATE_B为0同时满足的情况。仔细想一下,cur_state != STATE_A为0就代表cur_state现在就是STATE_A状态,cur_state != STATE_B为0就是代表cur_state现在就是STATE_B状态,那么,cur_state怎么可能同时为两个状态呢。这样的情况要么就拆开写要么就别写。case语句的default分支考虑周全

always @(*)begin case(in[1:0]) 2‘d0 : data[1:0] = 2’d0; 2‘d1 : data[1:0] = 2’d1; 2‘d2 : data[1:0] = 2’d2; default : data[1:0] = 2‘d3; endcase end

case语句不写default分支会产生锁存器,如果case中的所有情况都达到,就可以不用写default分支,但在ASIC设计中可能工具会报lint,所以这样的写法是最完美的。这样的写法对于in这个变量如果有规定取值范围,哪一个值没取到也一目了然。教科书式的反面教材

always @(*)begin if(start) cnt 《= ’d0; else if(((para == 3) && (cnt != 3)) || ((para == 4) && (cnt != 7)) || ((para == 5) && (cnt != 15)) || ((para == 6) && (cnt != 31))) cnt 《= cnt + 1‘d1;。。.end

这样的写法我愿称之为教科书式的反面教材。首先,计数器的常规套路是给一个使能进行计数,记到一个值然后给清零,上面这样的写法是直接给一个使能信号清零,然后用未记到想要的最大值来做使能。第二点是,这样的写法和上面cur_state同时出现在两个状态上,是一样的。else if里面的条件进行条件覆盖率检查,会出现cnt != 3 cnt != 7 cnt != 15 cnt != 31 两两之间或者及以上同时为0的随机组合,那么cnt一个时刻只能是一个值,必不可能满足同时等于多个值的情况。参数的取值范围一个参数的取值范围是0,1,2三个值,你做了一个这样的vld

assign data_vld = (param == 0) || (param == 1) || (param == 2);

条件覆盖率检查会出现,上面三个条件都为0的情况,但是这个参数配置只有这三个值,不可能去其他值,也是一个典型的情况。换一种写法。最后很多的代码写法,工具有smart exclude也会自动waive一些分支,不过工具也没那么smart,还是需要自己在编码的时候注意,尽量避免很多体力活。评论区支持互动回复盖楼了,关于这个问题你还有什么想法,欢迎评论区留言交流。

编辑:jq

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

    关注

    455

    文章

    50810

    浏览量

    423525
  • asic
    +关注

    关注

    34

    文章

    1200

    浏览量

    120499
  • 锁存器
    +关注

    关注

    8

    文章

    906

    浏览量

    41508
  • 选择器
    +关注

    关注

    0

    文章

    108

    浏览量

    14539

原文标题:如何写出高覆盖率的Verilog代码?

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Verilog 与 ASIC 设计的关系 Verilog 代码优化技巧

    Verilog与ASIC设计的关系 Verilog作为一种硬件描述语言(HDL),在ASIC设计中扮演着至关重要的角色。ASIC(Application Specific Integrated
    的头像 发表于 12-17 09:52 112次阅读

    Verilog 测试平台设计方法 Verilog FPGA开发指南

    Verilog设计的仿真需求。 编写测试文件 : 编写Verilog测试文件,对设计的各个模块进行测试。测试文件应覆盖各种情况,包括正
    的头像 发表于 12-17 09:50 196次阅读

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 VerilogVerilog 的语法更接近于 C 语言,对于有 C 语言背景的工程师来说,学习曲线较平缓。它支持结构化编程,代码
    的头像 发表于 12-17 09:44 142次阅读

    如何写出稳定的单片机代码

    这篇文章分享怎么写出稳定的单片机代码。     我对优秀代码的理解,大体分为两个部分:高效和稳定。   两者都能做到很好的,如果靠自己摸索,没有刻意去练习,可能需要花10年,甚至更久
    的头像 发表于 11-15 16:40 409次阅读
    如何<b class='flag-5'>写出</b>稳定的单片机<b class='flag-5'>代码</b>

    如何自动生成verilog代码

    介绍几种自动生成verilog代码的方法。
    的头像 发表于 11-05 11:45 310次阅读
    如何自动生成<b class='flag-5'>verilog</b><b class='flag-5'>代码</b>

    Verilog硬件描述语言参考手册

    一. 关于 IEEE 1364 标准二. Verilog简介三. 语法总结四. 编写Verilog HDL源代码的标准五. 设计流程
    发表于 11-04 10:12 0次下载

    synopsys 的design ware:DW_fpv_div,浮点数除法器,默认32位下,想提升覆盖率(TMAX),如果用功能case去提升覆盖率呢?

    覆盖率只有微微的提升,请问是否要遍历很多数才能提升覆盖率吗?一般这种浮点数有什么方法去跑吗? 每个数都跑岂不是天文数字,本人刚接触不久,请大佬指教下,谢谢
    发表于 10-15 18:38

    FPGA Verilog HDL代码如何debug?

    ,共同进步。 欢迎加入FPGA技术微信交流群14群! 交流问题(一) Q:Verilog代码如何debug?最近学习fpga,写了不少verilog,开始思考如何debug的问题!c语言是顺序执行,而
    发表于 09-24 19:16

    利用静态检查工具完善功能安全中测试覆盖率

    在功能安全中测试覆盖率是比较重要的概念,也是在验证过程中通常需要花费时间较多的步骤,如果能借助于静态检查工具的死逻辑查找和声明、测试用例自动补全等功能往往能取得事半功倍的效果。
    的头像 发表于 09-05 09:15 344次阅读
    利用静态检查工具完善功能安全中测试<b class='flag-5'>覆盖率</b>

    单元测试工具TESSY 新版本亮点速览:提供测试驾驶舱视图、超级覆盖率代码访问分析、增强覆盖率审查

    各种测试对象和方法的所有覆盖率测量结果,并记录在新的测试总结报告中。 了解更多TESSY新版本功能详情或申请免费试用,欢迎咨询TESSY中国授权分销商——龙智。 新版本功能亮点速览: 1、超级覆盖率 逐行评估源代码。 基于标准
    的头像 发表于 07-08 16:20 446次阅读
    单元测试工具TESSY 新版本亮点速览:提供测试驾驶舱视图、超级<b class='flag-5'>覆盖率</b>、<b class='flag-5'>代码</b>访问分析、增强<b class='flag-5'>覆盖率</b>审查

    如何将SystemVerilog断言属性和覆盖属性置于在设计上?

    功能覆盖、激励生成和运行管理是当今功能验证的三大相互关联的任务。其中,功能覆盖率可以说是最重要的,主要是因为覆盖率收敛是tape的主要标准。
    的头像 发表于 05-28 10:30 771次阅读
    如何将SystemVerilog断言属性和<b class='flag-5'>覆盖</b>属性置于在设计上?

    如何写出时序最优的HDL代码?如何写出时序裕量足够的代码

    你想写出可以跑出700M以上的代码吗,直逼FPGA内部PLL的极限。
    的头像 发表于 03-12 09:59 912次阅读
    如何<b class='flag-5'>写出</b>时序最优的HDL<b class='flag-5'>代码</b>?如何<b class='flag-5'>写出</b>时序裕量足够的<b class='flag-5'>代码</b>?

    verilog function函数的用法

    Verilog 是一种硬件描述语言 (HDL),主要用于描述数字电子威廉希尔官方网站 的行为和结构。在 Verilog 中,函数 (Function) 是一种用于执行特定任务并返回一个值的可重用代码块。函数在
    的头像 发表于 02-22 15:49 5688次阅读

    如何写出好的代码?高质量代码的三要素

    脍炙人口的诗"春有百花秋有月,夏有凉风冬有雪",意境唯美,简明易懂。好的代码也是让人陶醉的,那么如何写出好的代码
    的头像 发表于 01-05 11:29 1259次阅读
    如何<b class='flag-5'>写出</b>好的<b class='flag-5'>代码</b>?高质量<b class='flag-5'>代码</b>的三要素

    怎么用Vivado做覆盖率分析

    在做仿真的时候往往会去做代码覆盖率和功能覆盖率的分析,来保证仿真是做的比较充分完备的。
    的头像 发表于 01-03 12:34 1718次阅读
    怎么用Vivado做<b class='flag-5'>覆盖率</b>分析