在Verilog中直接调用*实现乘法器,其延迟和占用资源如何?

您所在的位置:网站首页 verilog吧 在Verilog中直接调用*实现乘法器,其延迟和占用资源如何?

在Verilog中直接调用*实现乘法器,其延迟和占用资源如何?

#在Verilog中直接调用*实现乘法器,其延迟和占用资源如何?| 来源: 网络整理| 查看: 265

老石若干年前在伦敦做的博士课题涉及了不少FPGA上的算术运算单元的性能分析和优化。对于题主的问题,简单的回答是:大部分情况直接写*即可

下面是完整的回答。

老石比较喜欢抠字眼,题主问的是延迟,而非频率时钟周期,这很赞。我们在接触硬件电路设计时,通常将这几个概念混为一谈。这并非本题重点,但需要注意的是延迟和周期并不能简单的划等号,老石接下来会提到。

下面是真正完整的回答。

我们首先需要明确乘法器在FPGA中的实现方式,这一般有两种:

基于FPGA片上DSP里的乘法单元 通过组合逻辑实现的乘法器IP。

这两种实现方式在调用乘法器IP时可以指定,或者在综合工具里设置。下面说一下这两种乘法器的优缺点比较。

前者是固化在FPGA片上DSP里的硬件模块,优点是速度很高,相比逻辑延时和布线延时等可以忽略不计,且调用时不会占用额外的可编程逻辑资源(LUT等)。缺点是乘法器的位宽固定,例如18x18,这样如果你需要一个19位的乘法器,就需要调用两个DSP资源,外加额外的DSP间的布线延时。

后者也是FPGA厂商提供的经过高度优化的IP核,往往用于位宽比较小的情况,如不超过十位的乘法器。它的主要实现方式是利用了FPGA内部的快速进位链电路。快速进位链是FPGA中固化的电路结构,本质上实现的是行波进位加法器的进位链逻辑,如下图所示:

Xilinx Virtex系列FPGA中,每个Slice里的快速进位链结构

由于进位链是FPGA固化的电路结构,因此传输延时极小,可以忽略不计。

在下图中,老石用组合逻辑实例化了了一个9位乘法器,目标器件是Xilinx的Virtex-6,关键路径延时为4.85ns,不加流水线的话对应最大频率206MHz。

使用组合电路实现的9-bit 乘法器

可以看到结构非常规整,大量使用了片上的快速进位链电路,因此占用的Slice数量非常少。

同样的,17位乘法器的关键路径如下图所示,同样非常规整。关键路径延时为6.09ns,不加流水线的话相当于164MHz。

使用组合逻辑实现的17位乘法器

回到题主的问题,如果直接使用,比如assign c=a*b,综合工具会根据a和b的位宽自动决定使用哪种乘法器的实现形式。同时也会兼顾在开发环境中指定的其他考虑因素,如面积优先、时序优先等。

也可以使用更小粒度的配置,即调用IP配置库,选择乘法器,在里面可以指定希望使用何种实现方式。如果是纯组合逻辑实现,还可以选择是否加入流水线以提高工作频率。

再回到题主的另一个问题

是否需要自己写一个乘法器逻辑并优化?

这取决于题主的主要目的:

如果题主只是想使用乘法器实现自己的算法设计,答案是不需要,直接调用给定的乘法器即可,多数情况也不用关心设计工具是具体使用何种方式实现的。如果题主想进一步优化自己的设计,且设计不是乘法器本身,答案是不需要。可以通过上面老石提到的多种途径,对采用的乘法器单元进行进一步优化。具体的优化方法取决于优化的目的。如果题主的设计就是乘法器或相关的算术运算单元,答案是需要。不过你可能更需要做的是设计一个在FPGA上能更加高效实现的乘法器结构。这里需要注意的是,在ASIC上高效的乘法器结构,不一定在FPGA上有同样的性能,这是由于FPGA的底层逻辑架构是固定的。而厂家提供的IP已经针对诸如快速进位链等底层架构,进行了非常细致的优化。如果题主看了第三条之后,仍然像老石一样想挑战自己,就去做吧少年。

希望老石的回答对各位有帮助。附上老石做的乘法器结构,仅供参考,发表在2014年的DAC会议上:

欢迎各位关注老石的公众号和专栏“老石谈芯”,里面有更多视角独特的原创芯文、芯情、芯事。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3