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

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

3天内不再提示

高覆盖率的Verilog代码的编写技巧

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-05-26 17:30 次阅读

芯片前端工程中,测试验证的核心理念:以提高覆盖率为核心。
设计工程师需要关心的主要有行覆盖率(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的情况,但是这个参数配置只有这三个值,不可能去其他值,也是一个典型的情况。换一种写法。
编辑:黄飞

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

    关注

    28

    文章

    1343

    浏览量

    109951

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

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文详解Modelsim代码覆盖率功能使用

    作者:默宸  Modelsim代码覆盖率功能Code coverage,能报告出statement(语句)、branch(分支)、condition(条件)、expression(表达
    的头像 发表于 12-09 11:45 5719次阅读

    怎么用Vivado做覆盖率分析

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

    如何改善5G覆盖率

    改善5G覆盖率的方法
    发表于 12-15 07:52

    嵌入式仿真平台SkyEye的覆盖率分析相关资料下载

    代码执娜行覆盖情况的功能,来检测代码中未执行覆盖情况。在覆盖率分析时需要分析嵌入式软件的指令覆盖率
    发表于 12-17 07:27

    关于SpinalHDL中的验证覆盖率收集简单说明

    在做RTL仿真验证时,覆盖率收集往往是我们在验证中需要注意的地方,本篇就SpinalHDL中的验证覆盖率收集做一个简单说明。sbt配置在SpinalHDL里进行仿真验证时,我们的待测试代码会生
    发表于 06-24 15:56

    重点厘清覆盖率相关的概念以及在芯片开发流程中跟覆盖率相关的事项

    全盘考量。而覆盖率,就是芯片工程中,评审体系需要重点参考的一项技术指标,但也只是验证相关的其中一项。目前被业界广泛采用的覆盖率指标有功能覆盖率(Function Coverage)和代码
    发表于 09-14 11:57

    Verilog代码覆盖率检查

    Verilog代码覆盖率检查是检查验证工作是否完全的重要方法,代码覆盖率(codecoverge)可以指示
    发表于 04-29 12:35 8338次阅读

    嵌入式代码覆盖率统计方法和经验

    代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例计算得出。代码覆盖率可以有效避免包含未测试
    的头像 发表于 01-06 15:06 3114次阅读
    嵌入式<b class='flag-5'>代码</b><b class='flag-5'>覆盖率</b>统计方法和经验

    嵌入式代码覆盖率如何进行统计有哪些方法和经验

    代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例 计算得出。代码覆盖率可以有效避免包含未测试
    的头像 发表于 01-09 11:12 3015次阅读
    嵌入式<b class='flag-5'>代码</b><b class='flag-5'>覆盖率</b>如何进行统计有哪些方法和经验

    统计嵌入式代码覆盖率的方法和经验

    代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例计算得出。代码覆盖率可以有效避免包含未测试
    的头像 发表于 03-29 11:58 1898次阅读
    统计嵌入式<b class='flag-5'>代码</b><b class='flag-5'>覆盖率</b>的方法和经验

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

    设计的角度上来讨论,如何写出覆盖率Verilog代码。assign慎用按位运算逻辑, | ^ ^~和三目运算符,慎用。使用这样的描述方式本身功能并没有什么问题,而且写起来很爽,但是
    的头像 发表于 06-01 10:13 2571次阅读

    更好地测量代码覆盖率的 9 个技巧

    测量代码覆盖率对于嵌入式系统来说越来越重要,但需要一些经验。这是因为有一些障碍需要克服,尤其是小目标。但是,使用正确的方法和合适的工具,无需过多努力即可测量测试覆盖率。九个实用技巧可帮助您入门
    的头像 发表于 07-14 15:58 2944次阅读
    更好地测量<b class='flag-5'>代码</b><b class='flag-5'>覆盖率</b>的 9 个技巧

    代码覆盖率工具的重要性

    测试覆盖率是软件质量的重要指标,也是软件维护的重要组成部分。它通过提供不同承保项目的数据来帮助评估测试的有效性。这种洞察力允许通过为未经测试的代码定义新的测试用例来改进测试,从而提高代码质量,最终增加
    的头像 发表于 12-08 15:13 1418次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖率</b>工具的重要性

    Vivado仿真器和代码覆盖率简析

    编写 HDL 通常是 FPGA 开发中耗时最少的部分,最具挑战性和最耗时的部分可能是验证。根据最终应用程序,验证可能非常简单,也可能非常复杂,简单的话只需对大多数功能进行检查或执行完全独立开发的测试平台来演示功能和代码覆盖率
    的头像 发表于 08-03 09:23 1865次阅读
    Vivado仿真器和<b class='flag-5'>代码</b><b class='flag-5'>覆盖率</b>简析

    代码覆盖率记录

    为确保具体的产品(例如,医疗或航空电子市场)质量合格, 通常需要提供语句覆盖与判定覆盖认证证明。对于各种嵌 入式系统,规范要求高度优化的代码需要实时测试。禁止 代码插装和运行时篡
    发表于 11-03 11:02 0次下载
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖率</b>记录