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

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

3天内不再提示

如何将算法“翻译”成Verilog?

ruikundianzi 来源:IP与SoC设计 作者:IP与SoC设计 2022-11-03 15:38 次阅读

我是一名数字前端IP设计工程师,方向为通信芯片IP设计,我的主要工作就是“翻译”算法代码。

经典的ASIC开发流程主要有:

以算法设计为主导

算法C代码手工转换为RTL

RTL与算法C代码生成的测试向量对比进行验证

依赖FPGA做大量实时、现场测试

适合通信信号处理,音视频处理或图像处理等产品

我的工作主要就是将算法C代码手工转换为RTL,尤其是通信芯片的设计,算法主要是将浮点运算近似成定点运算,定点的精度决定了系统的性能,所以一种开发模式就是,用C平台生成的case数据和RTL仿真的数据进行对比,保证定点化后的仿真性能。

所以对于单个计算模块的开发来说,可以说就是体力活了,算法的计算过程已经摆在那里,单就是纯翻译。

然而再复杂的算法,在设计工程师的眼里,也就是一堆数学公式,算法设计者也应该尽量做简单的算法实现,比如除法,求幂次方、开平方等复杂运算到了设计工程师这里都已经转化成了简单的乘法和加法运算。更复杂的就是累加、累乘(我所能接触到的)。

做芯片第一应该关注的是芯片的PPA(Performance, Power, Area),如何设计的出更高性能的电路,占用更少的资源/面积,更低的功耗。这才是我们的专业知识。

通过学习算法代码和文档以及协议,了解算法的计算意图。然后进行数据通路的分析,整体的数据流走向。哪些需要计算的数据可以用寄存器存储,哪些数据需要用RAM存储。模块的划分可拆解,哪些计算单元是功能类似的,可以做成一个小IP,乘法器同时使用的最大数量,是否能在整个大模块中分时复用。

算法的设计中没有时序的概念,也没有计算时间的长短。需要设计工程师去整理整个模块的计算流水,流水线排的时间长,需要的计算逻辑就越少,反之,面积越大。面积与速度互换思想,贯穿始终。现成乘法器的数量有限,是否能加上几个乘法器而获得模块整体运算速度提高30%的收益,都需要去折中(Trade off)考虑。

排好计算流水,控制通路,一般都使用状态机去做,当然,状态机怎么设计算法可不会教你。整个模块与更高层模块的交互,接口控制时序需要讨论确定。数据通路可能还需要用到RAM/Regfile去缓存中间数据的结果,RAM/Regfile的读写地址控制也是常见设计。数据通路的运算,是主要消耗资源的部分,所以一个好的详细设计方案非常重要,同样的设计,别人可以用比你小30%的面积和少30%的时间来实现。这可能就是设计工程师真正的价值体现之处。

对于通信算法中,矩阵运算也是比较常见的,复杂矩阵的运算是最耗费资源的,矩阵运算的拆解也需要很多技巧,比如矩阵的乘法是A的第一行乘以B的第一列,累加得到第一个元素,这部分的运算电路可以复用流水起来做。一个矩阵需要拆解合并成数个小矩阵,想要保持并行,用寄存器存储,就会消耗的资源多。存在RAM中就是串行流水做会消耗的时间长,所以这都需要在模块架构设计阶段去计算处理时间和评估消耗资源、折中是否采取(Trade off)。

这种大型矩阵运算动辄几百上千bit的寄存器输出,连线选择运算,可能会造成后端congestion问题,所以方案设计的重要性又体现出来了。组合逻辑的运算,如果路径过长,时序会出现问题,插寄存器的位置也非常重要,消耗的寄存器的数量也是不同的,甚至可以通过手动retimming,找个寄存器把打拍的位置换一下,消耗的资源还是相同的。

对于芯片的功耗前端能做的就是,去加一些时钟门控,模块不用时候可以关掉,组合逻辑计算单元不用的时候避免翻转,乘法器的使能信号的控制,避免无效翻转,数据通路寄存器带着使能打拍,工具也会自动插时钟门控,这些就和算法没关系了。

至于算法,当然不同领域的相关知识不同,虽然设计方法是完全类似的,但是在一个领域深扎,成为这个领域的专业的人,可以更好的理解算法到硬件的实现。

IP设计工程师经常调侃自己是算法“翻译官”,虽然也没什么问题,但是自嘲归自嘲,如果感兴趣的话,还是应该去想着如何更好的做好自己的设计,做好芯片。即使是“翻译官”也是一个十分有价值的“翻译官”。

审核编辑 :李倩

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

    关注

    23

    文章

    4599

    浏览量

    92636
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109978

原文标题:如何将算法“翻译”成Verilog?

文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何将LVDS/OLDI桥接到HDMI/DVI

    电子发烧友网站提供《如何将LVDS/OLDI桥接到HDMI/DVI.pdf》资料免费下载
    发表于 09-27 09:35 1次下载
    <b class='flag-5'>如何将</b>LVDS/OLDI桥接到HDMI/DVI

    如何将BQ35100配置为EOS模式

    电子发烧友网站提供《如何将BQ35100配置为EOS模式.pdf》资料免费下载
    发表于 09-11 10:03 0次下载
    <b class='flag-5'>如何将</b>BQ35100配置为EOS模式

    如何将LMH34400评估模块设置电流输入模式?

    LMH34400 评估模块手册里注明默认电压输入模式,如何设置电流输入模式没有说明,烦请说明下如何将LMH34400 评估模块设置电流输入模式,谢谢。
    发表于 08-01 07:35

    如何将GPIO修改为QSPI SLSO?

    我们使用的是 TC49x,我能否 GPIO 用作 SLSO(SLSO 不是专用的),如果可以,请告诉我们如何将 GPIO 修改为 QSPI SLSO。 我正在使用 QSPI1,需要使用 P31.6 作为 SLSO ,请提供指导。
    发表于 07-22 06:25

    verilog function函数的用法

    Verilog 中被广泛用于对电路进行模块化设计,以简化和组织代码。 本文详细介绍 Verilog 函数的用法,并探讨函数在硬件设计中的重要性和实际应用场景。 一. Verilog
    的头像 发表于 02-22 15:49 5042次阅读

    如何将互感器输出的正弦波信号转化为比例的直流电压信号?

    我想用互感器和单片机测交流电路的电流,不知道如何将互感器输出的正弦波信号转化为比例的直流电压信号,请各位高手指点一二,非常感谢!
    发表于 02-22 07:08

    TC275 GTM如何将TIM配置读取引脚电平状态模式?

    如何将TIM配置读取引脚电平状态模式
    发表于 02-19 06:32

    在hightec中如何将源代封装,并编译链接.a的库函数?

    在hightec中如何将源代封装,并编译链接.a的库函数
    发表于 02-18 08:10

    如何将LED连接到Arduino板并使其闪烁

     在本快速入门指南中,您将学习如何将 LED 连接到 Arduino 板并使其闪烁。
    的头像 发表于 02-11 10:53 2056次阅读
    <b class='flag-5'>如何将</b>LED连接到Arduino板并使其闪烁

    如何将按钮连接到Arduino板

    在本快速入门指南中,您将学习如何将按钮连接到Arduino板,并根据按钮是否被按下来读取HIGH或LOW。您将使用电路板上随附的发光二极管 (LED)通过按钮打开和关闭,以便验证按钮按下代码是否正常工作。
    的头像 发表于 02-11 10:52 3455次阅读
    <b class='flag-5'>如何将</b>按钮连接到Arduino板

    如何将Klayout Cell动态导入Lumerical Multiphysics

    在本例中,演示了如何将KLayout Library Cell动态导入 Lumerical 以执行设计扫描和表征。该功能支持动态导入到Lumerical FDTD、MODE以及Multiphysics的所有工具,包括CHARGE、HEAT、FEEM、MQW、DGTD。
    的头像 发表于 01-22 14:27 612次阅读
    <b class='flag-5'>如何将</b>Klayout Cell动态导入Lumerical Multiphysics

    请问如何将M482的X32_IN X32_OUT设定GPIO_OUTPUT?

    请问如何将M482的X32_IN X32_OUT设定GPIO_OUTPUT?
    发表于 01-16 06:40

    如何将读到的电能寄存器中的数字量转换成测量值?

    问题: 我设置了有功电能的阀值寄存器,校准了电压和电流,得到的各种功率也是正确的,知道怎么换算测量值,但是这个电能怎么获取测量值呢?现在读有功电能寄存器的值是:1753。 请大神指导一下如何将读到的电能寄存器中的数字量转换成测量值。。。。多谢了, 主要是公式。
    发表于 12-26 07:26

    如何将sigmastudio的compressor压缩限幅参数换算DSP的设置值?

    如何将sigma studio的compressor压缩限幅参数换算DSP的设置值(特别是压缩曲线各个点的参数如何得来)?另外,ADAU1452与ADAU1442的compressor算法控件
    发表于 11-29 06:43

    如何将AD5750接地?

    目前我正在利用AD5750-1做一个项目——“用于PLC和DCS应用的灵活、中级性能、电压和电流输出电路”。 我想询问如何将AD5750接地。AD5750有两个GND引脚,引脚5靠近DVCC,引脚
    发表于 11-27 08:25