电子产业一站式赋能平台

PCB联盟网

搜索
查看: 29|回复: 0
收起左侧

【芯片设计】为什么RTL中谨慎使用function

[复制链接]
匿名  发表于 前天 12:08 |阅读模式
编写RTL一晃十来年了,遇到了很多形形色色工程编码规范、约束和建议,故而在此阶段性汇总。本系列中所提及和讨论的verilog/sv编码建议以及一些工程的要求只是工作过程所接触和了解内容,非普适性的编码规范,也并不代表个人赞同这些规范,一家之言仅和大家探讨这些建议原因和得失。
本系列的前八篇请参见:
  • 为什么要求不在RTL中使用always
  • 为什么避免在RTL中滥用宏定义
  • 为什么避免在RTL中使用task
  • 为什么在设计中优先使用无复位寄存器
  • 为什么RTL中避免使用#delay引入延迟
  • 为什么自研代码的filelist避免-y和-v索引
  • 为什么RTL中避免使用casez/casex
  • 为什么RTL中要谨慎for循环[/ol]RTL中谨慎使用function其实是一个老生常谈的话题,很多公司甚至直接要求避免使用,比如读研时以及前司和前前司等。我个人并不排斥在v和sv for design中使用function(虽然在工作里因为部门要求等原因一直不怎么写( ? ?ω?? )?),只要注意好不会对验证工作有比较大的干扰,确定好是否应该加automatic关键字等事情,就可以放心大胆的用。和之前关于task的讨论一样,关于这个话题同样在小红书发帖看了一下大家的反馈。在共有200人参与的投票中,将将超过60%的小伙伴选择了不在RTL中使用function,另外的部分则是大写特写。这个事情个人感觉完全是公司强相关,有些公司就非常推荐写而有些则不推荐甚至禁止,那作为自由度没有那么高的研发只好令行禁止了。

    那么不推荐使用function的公司一般基于哪些因素考虑呢?无外乎验证和后端实现。从验证的角度而言,首当其冲的是验证过程中的debug环节,当错误发生在function内部时,追踪和调试function问题可能会变得更加困难。大部分情况下,function内部的信号是没法拉到波形上来定位的。这也很容易理解,毕竟function可以在多个地方调用,不同调用的地方其内部的值本来就不一样,等于说别人是“静态”的而他是“动态的”(在之前的文章里也讨论过默认态function和automatic function),效果就比如这样子:

    然后是别人和我提到的覆盖率收集环节,function因为被多个地方“共享”因此其本身的覆盖率很难界定是否准确。同时其内部的覆盖率也难以收集,如果function内包含条件分支、循环等结构时那就更乱了。目前一些相关工具本身似乎不太善于处理function内的覆盖率的,这一点我不是很清楚。还是以这个小的模块为例,至少line coverage是不会管function里面的事情。

    而在后端实现的角度。第一是综合工具的限制,这个是之前的leader经常挂在嘴边的一句话“综合工具对这种语法的支持没有那么好”,对于function而言冠冕堂皇一些就是:综合工具可能会对function的支持有限。不同的综合工具可能有不同的规则和限制,某些情况下function可能不会被正确地映射到硬件结构上,或者可能导致非预期的行为。同时有些综合工具无法处理带有复杂逻辑或循环的函数,这可能导致综合结果不符合预期。但是我对这一点是有些微词的,即使真的工具支持不好,那不是应该努力努力支持好吗。在帖子的评论区也有一些人是持此意见的,在此简单摘录一个吧:

    而后还有一个担忧是时序路径难以预测和定位的隐患,简单说就是信号进到function里之后,在时序路径上确定的时序可能不准确,且在优化时序时不好找相关的信号,关于这点也保持一定怀疑的态度吧。简单的function应该不至于,如果是复杂的比如带循环的那倒是有可能。同时时序路径定位的困难也必然同步带来ECO的困难,这点恐怕也是项目组不推荐使用function的主因。当然也有人提到了可读性和可维护性的角度,过度使用function可能会降低代码的可读性和维护性,如果再把function放在其他文件或者统一管理的化,可读性性就更差了。对于其他工程师来说,理解一个模块的功能及其工作原理可能需要更多的时间和精力。这一点见仁见智吧,function统一或者偏向于集中打包管理的方式见过,散在不同模块中的也见过,这种事情本身很难界定所以就单纯分享下好了。

    系列文章入口【芯片设计】SoC 101(一):绪论【芯片设计】FIFO漫谈(零)从无处不在的FIFO开始说起【芯片设计】计算机体系结构(一)虚拟内存【芯片设计】深入理解AMBA总线(零)绪论
    【芯片设计】握手协议的介绍与时序说明【芯片设计】复位那些小事 —— 复位消抖【芯片设计】快速入门数字芯片设计(一)Introduction【芯片验证】UVM源码计划(零)下定决心读源码前的自测环节
    【芯片设计】异步电路碎碎念(一) 到底什么是异步电路
    【芯片设计】从RTL到GDS(一):Introduction
    【芯片设计】系统中的可维可测状态记录寄存器设计
    其他文章链接【芯片验证】sva_assertion: 15道助力飞升的断言练习【芯片验证】可能是RTL定向验证的巅峰之作【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析
    【芯片设计】verilog中有符号数和无符号数的本质探究
    【芯片设计】论RTL中always语法的消失术
    【芯片设计】代码即注释,注释即代码
    【芯片设计】700行代码的risc处理器你确实不能要求太多了
    入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢
    如何计算系统的outstanding 和 burst length?
    芯片搬砖日常·逼死强迫症的关键词不对齐事件
    熟人社会里,一群没有社会价值的局外人
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表