
上期内容:create_clock你用对了吗

异或运算是基本的逻辑运算,在FPGA设计中经常遇到。其实现方式也很简单,例如1bit的a和b相异或,只需要一个2输入查找表(LUT2)就可以完成。但是,如果a和b的位宽达到了512位,而且实际算法包含很多此类运算,且要求时钟运行在600MHz,采用LUT实现就有点捉襟见肘了。
高速设计中,采用LUT实现512位异或运算会有哪些弊端呢?从资源角度而言,a和b都是512位,那么就要消耗512个LUT2。如果存在很多这样的操作,意味着LUT的利用率会提升,从而增大了布线拥塞的风险。从时序角度而言,作为设计的一部分,这些LUT2很有可能分散到不同列的Slice中,如下图所示。图中红色标记即为LUT。这意味着某些LUT输出端的布线延迟会很大,从而给时序收敛带来压力。

为此,我们想到了DSP48。DSP48包含一个逻辑运算单元ALU,可实现多种逻辑运算,其中就包括异或运算,如下图所示(图片来源,Table 2-10, ug579)。观察图中红色方框标记的行,将相应的OPMODE和ALUMODE设置为指定的常数,就可以实现一个48位的异或运算。这就要用到DSP48E2的原语(Primitive),要求对原语中的参数、输入/输出端口的含义有所了解,这个过程较为繁琐。好在Vivado提供了一个综合属性USE_DSP,通过该属性可以将异或运算映射到DSP48中。这里我们重点讨论这种方法。

看看如下图所示的SystemVerilog代码,属性use_dsp的值为logic,作用于module(当use_dsp值为logic时,对于SystemVerilog,只能作用于module),这里位宽为36。对输入、输出均采用了寄存,从而使得输入到输出的Latency为2。这个模块可以很好地映射到DSP48中,包括其中的寄存器,不会消耗Slice中的任何资源。这里需要注意一点的是只有当输入数据位宽大于某个值且use_dsp属性值为logic时,才可以将异或运算映射到DSP48中。两个条件缺一不可。有兴趣的同学可以测试一下,这里要求位宽的最小值是多少。

但是,如果将其中的位宽改为512,综合后的资源报告如下图所示。可以看到,此时只消耗了4个DSP48,同时消耗了320个LUT,这意味着并不是所有位的异或运算都映射到DSP48中。那么该如何解决这个问题呢?且看下回分解。

技巧1:对于大位宽且要求运行在较高时钟频率下的逻辑运算,例如:与、或、非、同或、异或等,可采用DSP48实现。
技巧2:采用DSP48实现逻辑运算时,除了直接使用原语的方式外,采用use_dsp属性实现映射更为简洁可控。只有当输入数据位宽大于某个值且use_dsp属性值为logic时,才可以将异或运算映射到DSP48中。两个条件缺一不可。有兴趣的同学可以测试一下,这里要求位宽的最小值是多少。


create_clock你用对了吗
字符串和列表之间的转换
列表排序其实不难
警惕设计中的DONT_TOUCH
老生常谈的复位,你真的用对了吗
如何优化高扇出net?
常用的跟Pblock相关的Tcl命令
比较器如何用DSP48实现
HLS案例分析:数组求和(2)HLS案例分析:数组求和(1)关于Pblock的8个必知问题一次创建多个PblockPblock可以这么画在Vivado HLS中使用TclVivado 2019.1新特性(5):更新的report_qor_suggestionsVivado 2019.1新特性(4):VHDL 2008 Generic2019年上半年文章汇总Tcl知识库(更新至2019.1)Vivado HLS知识库(更新至2019.1)Vivado知识库(更新至2019.1)


文 | Lauren 图 | Lauren
Copyright @ Lauren的FPGA
转载事宜请私信 | 获得授权后方可转载
