一个异或运算引发的设计技巧(2)

  • 2019 年 11 月 27 日
  • 筆記

上篇文章中我们提到了可以利用use_dsp属性,将异或运算映射到DSP48中。但存在的问题是如果直接将位宽设置为512,就会出现很大一部分位的异或运算仍然采用LUT实现。为此,我们想到了将如图1所示的代码模块,在顶层通过for-generate语句实例化多次。这依然存在一个问题,use_dsp属性值无法在顶层灵活修改,如果需要将异或运算通过LUT实现,就要找到底层修改,多有不便。这里,我们可以采用如下技巧。

图1

技巧1:采用条件编译

采用条件编译时,定义一个头文件macro.vh,文件内容如图2所示。同时,在myxor.sv中使用该头文件,具体如图3所示。这样的好处是,只需修改头文件即可调整综合结果。顶层如图4所示。在顶层中将模块myxor的位宽设置为48位,这是因为一个DSP48可实现输入数据为48位的异或运算。

图2
图3
图4

技巧2:采用宏

采用宏定义的方式,需要先定义一个包含宏的文件macro_v2.sv。该文件的内容如图5所示。可以看到宏是可以嵌套的。这里只需修改宏IS_LOGIC的值为logic,即可将异或运算映射到DSP48中;将其值修改为no,则异或运算会采用LUT实现。在myxor.sv中,使用已定义的宏,如图6所示。可以看到采用宏定义的方式也实现了在顶层调整use_dsp属性值的目的。

图5
图6

技巧3:采用package

熟悉VHDL的同学对package应该不陌生。SystemVerilog引入了package。我们定义一个mypkg.sv文件,文件内容如图7所示。该文件中定义了一个参数(parameter):USE_DSP_VALUE。在myxor.sv中,引入已声明的package,并使用该参数,如图8所示。这样,只需在mypkg.sv中修改参数值即可调整综合结果。

图7
图8

结论:

可分别采用条件编译、宏定义和package的方式,避免回到底层模块修改综合属性。