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

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

    关注

    463

    文章

    54463

    浏览量

    469608
  • asic
    +关注

    关注

    34

    文章

    1278

    浏览量

    124968
  • 锁存器
    +关注

    关注

    8

    文章

    958

    浏览量

    45484
  • 选择器
    +关注

    关注

    0

    文章

    111

    浏览量

    15163

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    半导体嵌入式单元测试的核心技术、工具选型与落地全流程

    2.2.1 全面的覆盖率测试winAMS支持多种覆盖率测试类型,包括语句覆盖、分支覆盖、条件覆盖、MC/DC
    发表于 03-06 14:55

    嵌入式软件单元测试必要性与专业工具重要性的系统性专业研究报告

    强制覆盖率要求 报告审计要求 ‌ISO 26262‌(ASIL D) 汽车电子 ‌100% MC/DC‌(修正条件/判定覆盖) 必须由自动化工具生成‌可追溯矩阵‌(需求→代码→测试用例) ‌IEC
    发表于 03-05 10:41

    海尔智家借助MATLAB技术提高测试覆盖率

    20,000 行。这会增加错误出现的概率。此外,它还会导致调试周期长、测试覆盖率低和效率低下等问题,从而影响项目期限。
    的头像 发表于 02-25 11:14 592次阅读
    海尔智家借助MATLAB技术提高测试<b class='flag-5'>覆盖率</b>

    芯片测试覆盖率99%就够了吗?给DFT设计提个醒

    字逻辑的此项覆盖率要求通常高于99%。但覆盖率数字并不等同于高质量。故障模型本身有局限,无法覆盖所有实际物理缺陷,如跨电源域的泄漏、少数晶体管单元的潜在性能衰退等。 模拟/混合信号测
    发表于 02-06 11:06

    汽车软件质量跃迁的系统性路径:基于ISO 26262标准的单元测试体系重构与中日实践深度对比(2026学术研究报告)

    单元测试 集成后补测,30%模块无覆盖 覆盖率目标 ASIL-D: ≥95%(2025年平均93.5%) ASIL-D:平均38%(头部企业≤50%) 管理认知 质量总监具代码否决权 项目经理以交付
    发表于 01-05 14:58

    嵌入式软件单元测试中AI自动化与人工检查的协同机制研究:基于专业工具的实证分析

    ‌ ‌摘要****‌ 本文系统探讨嵌入式软件相较于通用软件在单元测试层面的特殊性,分析其对覆盖率、可追溯性与实时性验证的严苛需求,并以专业工具winAMS为技术载体,深入研究AI驱动的自动化测试在
    发表于 12-31 11:22

    C语言单元测试在嵌入式软件开发中的作用及专业工具的应用

    编译器生成的中间代码(如GCC/LLVM的IR层) 实现代码结构与硬件行为的精准映射 可检测寄存器位操作异常、中断服务程序(ISR)时序冲突等深层缺陷 ‌目标代码覆盖率验证****
    发表于 12-18 11:46

    光谱成像用于草地可燃物含水估测的研究进展

    、空间覆盖有限等问题。光谱成像技术(Hyperspectral Imaging, HSI)通过捕捉地物在可见光至短波红外波段(400–1700 nm)的连续光谱信息,结合光谱特征与含水的物理关联,为草地可燃物含水
    的头像 发表于 10-20 11:44 393次阅读

    AI赋能标准化流程:智能汽车软件CI/CT最佳实践新范式

    环节依然严重依赖人工用例,导致效率与覆盖率难以满足高频迭代的需求。人工智能(AI)的引入,为这一困境提供了全新的最佳实践范式:AI能够基于需求自动生成覆盖率的测
    的头像 发表于 10-15 10:01 1277次阅读
    AI赋能标准化流程:智能汽车软件CI/CT最佳实践新范式

    嵌入式软件测试与专业测试工具的必要性深度解析

    系统化解决方案,其必要性体现在多个维度:满足行业合规要求汽车电子ISO 26262、航空DO-178C等标准强制要求代码覆盖率指标达到C1(分支覆盖)≥100%、MC/DC(修正条件判定覆盖
    发表于 09-28 17:42

    HarmonyOSAI编程单元测试用例

    根据选中的ArkTS方法名称,CodeGenie支持自动生成对应单元测试用例,提升测试覆盖率。 在ArkTS文档中,光标放置于方法名称上或框选完整的待测试方法代码块,右键选择CodeGenie
    发表于 08-27 14:33

    AI的未来,属于那些既能写代码,又能焊电路的“双栖人才”

    AI的未来,属于那些既能写代码,又能焊电路的“双栖人才”——来自WAIC 2025的一线观察2025年7月,上海世博中心,**第七届世界人工智能大会(WAIC 2025)**上,我们看到一个格外清晰
    发表于 07-30 16:15

    太阳光模拟器关键参数 | 光谱匹配度、光谱覆盖率及光谱偏离

    太阳光模拟器作为模拟太阳辐射环境的核心设备,其性能直接关系到诸多领域实验数据的可靠性。光谱匹配度(SMD)、光谱覆盖率(SPC)和光谱偏离(SPD)作为评估其性能的关键指标,从不同维度决定了模拟
    的头像 发表于 07-24 11:26 1299次阅读
    太阳光模拟器关键参数 | 光谱匹配度、光谱<b class='flag-5'>覆盖率</b>及光谱偏离<b class='flag-5'>率</b>

    太阳光模拟器性能的影响参数:光谱匹配度、光谱覆盖率及光谱偏离

    (SPC)用于评估太阳光模拟器对 AM1.5G 标准光谱的覆盖程度,重点关注模拟器是否能完整复现标准光谱的各个波段,不同材料对光谱覆盖的需求存在显著差异。 光谱覆盖率对太阳光模拟器性能的影响
    发表于 07-21 15:35

    HarmonyOS AI辅助编程工具(CodeGenie)代码测试

    本功能从DevEco Studio 5.1.0 Release版本开始支持。 根据选中的ArkTS方法名称,CodeGenie支持自动生成对应单元测试用例,提升测试覆盖率。 在ArkTS文档中,光标
    发表于 07-14 17:33