在Synthesizable Verilog中定义1D或2D浮点阵列作为输入端口



我想定义一些浮点输入和输出端口,所以我选择了实数数据类型,但根据我的搜索,我们无法将实数值作为输入端口,并且可用的转换不可合成。

input real [0:10] delta; 
parameter ndelta= 100;
input real [0:10] ly;
input real [0:10] nly;
output real [0:20] w[0:20];
output real [0:20] oldw[0:20];

*所有的实数都是C代码中最初的"浮点"值。

此外,我决定在ISE的CoreGenerator中使用浮点IP,但它只对两个32位矢量进行操作,每个矢量都提供一个浮点值。如果我想对浮点数的1D或2D数组进行操作,我应该首先自定义FP核心,然后使用generate for循环来创建2D数组吗?有没有一些很好的教程可以学习如何在一维浮点数数组上进行简单加法?

generate
for(i=0; (i<100); i=i+1) begin: FPU_unit
    begin
        floating_point_v5_0 U_FPU_ins(
        .a(a[i]),
        .b(b[i]),
        .clk(clk),
        .result(result[i])
        );
    end
endgenerate

此外,当我将C代码转换为HDL级别时,我想知道这里是否有人建议我使用Vivado HLS将部分C代码转换成HDL语言。

比较Vivado HLS和ISE,哪一种方法更有效地处理浮点密集型计算?

(1)需要使用$realtobits$bitstoreal在端口之间传递实值。给自己买LRM——你可以在网上找到草案版本;摘录如下。

"12.3.7端口连接中的实数

真实数据类型不应直接连接到端口。它应间接连接,如下例所示。系统函数$realtobits和$bitstoreal应用于在模块端口之间传递位模式。(有关这些系统任务的描述,请参见17.8。)"

module driver (net_r);
  output net_r;
  real r;
  wire [64:1] net_r = $realtobits(r);
endmodule
module receiver (net_r);
  input net_r;
  wire [64:1] net_r;
  real r;
  initial assign r = $bitstoreal(net_r);
endmodule

(2) 使用generate。您所要做的只是创建n模块,每个模块的端口都连接到阵列中的不同元素;你已经把它复杂化了。例如,试试一个带有AND门阵列的例子。原则上,您可以使用旧的"实例数组"形式,但我不会这么做。

(3) 我不会为C转换的工具而烦恼。您应该试着理解代码并自己进行转换。

最新更新