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

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

3天内不再提示

关于Verilog代码设计之时分复用详解

电子工程师 来源:开源博客 作者:FPGA开源工作室 2021-04-07 18:49 次阅读

芯片第一要追求的是功能,在保证功能都满足的情况下追求性能,在性能满足的情况下追求成本,也就是面积。当然功耗也十分重要。

提高速度和降低面积属于两个矛盾的目标,各自努力的方向基本相反,想要更快的运行速度,就得堆更多的资源,在具体的设计中往往需要折中(Trade off)。

在性能允许条件下采用时分复用更多的逻辑来减少芯片的面积,面积及成本。

加比选

通常情况下面积关系为加法器 》 比较器 》 选择器,乘法器可以认为是多个加法器。所以就有先选后比,先选后加,先选后乘。

assign sum[4:0] = enable ? (data_a + data_b) : (data_c + data_d);assign add_a[3:0] = enable ? data_a : data_c;assign add_b[3:0] = enable ? data_b : data_d;assign sum[4:0] = add_a + add_b;

789a10f2-96ca-11eb-8b86-12bb97331649.png

画个图意思一下。

78a38754-96ca-11eb-8b86-12bb97331649.png

图中的加法器可以替换成,比较器,乘法器,一个运算单元,甚至巨大的一个模块。

乘法器时分复用

在计算模块中乘法器也是非常大的一部分逻辑,一个设计要考虑PPA最优,一个必须要考虑乘法器的数量多少以及复用能不能最大化,追求最好的设计是整个数据通路中乘法器空闲不下来。通常的设计是做一个专门的乘法器模块,按系统最大的位宽开辟乘法器位宽逻辑,根据设计流程最大程度上复用乘法器资源。

78d48be2-96ca-11eb-8b86-12bb97331649.png

每一路乘法配备一个vld,用vld来作为当前有效的乘法运算,乘法器的结果随着vld的下一拍进行锁存。从下图可以看出乘法器的复用需要将各个部分的运算时间区分开,不可避免系统的时间会变长,想要缩短时间则可以用更多的乘法器来大幅缩短时间,想要面积更小,则用更少的乘法器资源来时分复用。面积与速度互换思想核心。

78e78cba-96ca-11eb-8b86-12bb97331649.png

always @(*)beginif(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

第二种选择器写法

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

第二种写法需要保证vld条件不会同时有效,看上去只用了一些门实现,而且没有优先级,感觉比第一种写法逻辑少,但实际上经过工具的优化后,可能消耗逻辑差不多。但是第二种写法在综合后就会是你写的这个样子,而第一种则会综合成一堆组合逻辑门。对于ECO来说,第二种写法更友好,第一种复杂多了。

而我更喜欢第一种写法,因为第一种在收集覆盖率时会更友好。代码覆盖率会清楚的看到哪一行没跑到,条件覆盖率也比较简单。每个if里面就一个条件。

乘法器调用方法,一般是在乘法器的输入保证寄存器输入,结果输出到各个复用模块时打一拍再使用。可以做成在进行完乘法运算后再打拍,这样消耗的寄存器会少很多。画个图意思一下(单bit)。

78f4248e-96ca-11eb-8b86-12bb97331649.png

修改完后的寄存器省了很多,但是乘法器的输出寄存器负载会变大,不过后端综合时约束了max_fan_out工具会自动插buffer和复制寄存器,经过实测还是会节省很多面积。不过这是在时序较好的情况下,如果时序比较紧,这样插多余的buffer会导致时序过不了。

RAM的复用

大于1k的寄存器组使用,考虑用RAM替代,但用RAM读写数据需要时序控制逻辑,并行度会降低。要求并行度高,可使用多个RAM。

792680f0-96ca-11eb-8b86-12bb97331649.png

从设计的整体来看,RAM也可以复用,前面处理完空闲下来的ram,后面处理也可以使用。

真的要这么多的复用吗?

复用可以是各种的,从单个逻辑运算到一个巨大的IP。那么真的要这么多的复用吗?前面说的复用必然需要分时,所以会导致系统处理时间变长,所以必须在保证处理性能的前提下通过复用来减少面积。

在控制通路上,大大小小的计数器会有很多个,理论上一些计数器也可以复用,但是共用一个计数器意味着,这个计数器的开始和结束逻辑复杂,而到了调试(debug)阶段,必然会是调试变得复杂繁琐。

一个加法器如果要复用的数据比较多,除了是debug看起来复杂之外,增加的选择器逻辑可能也不一定会小。

两个独立的模块中有部分相同的逻辑,是否真的有必要在提高了复杂度和模块之间的耦合度的情况下去复用,这也需要考虑。

到了项目后期一个小改动也是需要回归测试所有的测试用例,为了一小点减少逻辑而付出相对巨大的工作量从而影响进度,总的来说获得的边际收益是非常小的。

所以复用虽好,但也要适时、适度。
编辑:lyn

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

原文标题:Verilog代码设计之时分复用

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

收藏 人收藏

    评论

    相关推荐

    什么是时分复用TDM?时分复用类型 时分复用优劣势

    什么是时分复用TDM?时分复用类型 时分复用优劣势  时分
    的头像 发表于 01-16 16:03 552次阅读

    聚合的载波聚合的时分复用(TDD) 通信系统中发送物理信道方法

    电子发烧友网站提供《聚合的载波聚合的时分复用(TDD) 通信系统中发送物理信道方法.pdf》资料免费下载
    发表于 12-21 09:59 0次下载

    谈谈几种芯片设计增加代码复用性的方法

    很多芯片在设计之初,就已经考虑如何增加代码复用性,尽量减少工作量,降低错误概率。
    的头像 发表于 09-12 09:55 941次阅读
    谈谈几种芯片设计增加<b class='flag-5'>代码</b><b class='flag-5'>复用</b>性的方法

    IC设计之Verilog代码规范

    Verilog规范对于一个好的IC设计至关重要。
    的头像 发表于 08-17 10:14 678次阅读
    IC设计之<b class='flag-5'>Verilog</b><b class='flag-5'>代码</b>规范

    FPGA的Verilog代码编写规范

      注:以R起头的是对编写Verilog代码的IP设计者所做的强制性规定,以G起头的条款是建议采用的规范。每个设计者遵守本规范可锻炼命名规范性。
    的头像 发表于 08-15 16:23 1228次阅读

    gpio接口复用功能是在硬件设计时分配的吗?

    gpio这个接口复用功能是在硬件设计时分配的吗?比如uart两个接口是对应了gpio0 gpio1 是在哪分配的?有io mux在哪?改变复用逻辑。
    发表于 08-11 07:06

    分享一些优秀的verilog代码 高质量verilog代码的六要素

    高质量的verilog代码至少需要包含以下几个要素:可读性、功能、性能、标准化、稳定性、可定位。
    的头像 发表于 07-18 10:09 702次阅读
    分享一些优秀的<b class='flag-5'>verilog</b><b class='flag-5'>代码</b> 高质量<b class='flag-5'>verilog</b><b class='flag-5'>代码</b>的六要素

    Verilog代码封装后门访问

    关于仿真里的后门访问,之前的文章《三分钟教会你SpinalHDL仿真中的后门读写》中有做过介绍,其针对的都是针对以SpinalHDL中的代码进行的后门访问。今天来看看当封装了Verilog BlackBox时,在SpinalHD
    的头像 发表于 07-15 10:22 516次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>代码</b>封装后门访问

    Verilog中Pmod ALS的SPI接口代码

    电子发烧友网站提供《Verilog中Pmod ALS的SPI接口代码.zip》资料免费下载
    发表于 06-15 09:32 0次下载
    <b class='flag-5'>Verilog</b>中Pmod ALS的SPI接口<b class='flag-5'>代码</b>

    [源代码]Python算法详解

    [源代码]Python算法详解[源代码]Python算法详解
    发表于 06-06 17:50 0次下载

    基2FFT的verilog代码实现及仿真

    上文基2FFT的算法推导及python仿真推导了基2FFT的公式,并通过python做了算法验证,本文使用verilog实现8点基2FFT的代码
    的头像 发表于 06-02 12:38 701次阅读
    基2FFT的<b class='flag-5'>verilog</b><b class='flag-5'>代码</b>实现及仿真

    Vivado:ROM和RAM的verilog代码实现

    本文主要介绍ROM和RAM实现的verilog代码版本,可以借鉴参考下。
    的头像 发表于 05-16 16:57 930次阅读

    Verilog边沿检测的基本原理和代码实现

    本文将从Verilog和边沿检测的基本概念入手,介绍Verilog边沿检测的原理和应用代码示例。
    的头像 发表于 05-12 17:05 2372次阅读
    <b class='flag-5'>Verilog</b>边沿检测的基本原理和<b class='flag-5'>代码</b>实现

    如何使用参数化编写可重用的verilog代码

    我们将介绍如何使用verilog参数和generate语句来编写可重用的verilog 代码。 与大多数编程语言一样,我们应该尝试使尽可能多的代码可重用。这使我们能够减少未来项目
    的头像 发表于 05-11 15:59 716次阅读

    无线通信设计秘密:时分和频分复用

    )的挑战。   无线MAC协议有许多种,从解决“发送冲突”的角度来看,大抵分成2种:竞争抢占信道和时分复用。   1.竞争抢占信道   最常见的WiFi就是这种机制的代表,一个WiFi路由器承载多个无线节点
    发表于 05-10 16:26