在可合成Verilog中将1D或2D浮点数组定义为输入端口

在可合成Verilog中将1D或2D浮点数组定义为输入端口,verilog,fpga,xilinx,Verilog,Fpga,Xilinx,我想定义一些浮点型的输入和输出端口,因此我选择了数据类型real,但是根据我的搜索,我们无法将实数值传递为输入端口,并且可用的转换无法合成 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代码中,所有实数值最初都是“浮点”值 我还决定

我想定义一些浮点型的输入和输出端口,因此我选择了数据类型real,但是根据我的搜索,我们无法将实数值传递为输入端口,并且可用的转换无法合成

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
生成
对于(i=0;(i(1)您需要使用
$realtobits
$bitstoreal
跨端口传递实际值。请自己获取LRM-您可以在web上找到草稿版本;摘录如下

“12.3.7端口连接中的实数

真实数据类型不应直接连接到端口。它应间接连接,如以下示例所示。应使用系统功能$realtobits和$bitstoreal在模块端口之间传递位模式。(有关这些系统任务的说明,请参阅17.8)。”

(2) 使用generate。您所做的只是创建
n
模块,每个模块的端口都连接到数组中的不同元素;这太复杂了。例如,尝试使用AND门数组的示例。原则上您可以使用较旧的“实例数组”形式,但我不会这样做


(3) 我不想为C转换工具费心。你应该试着理解代码并自己转换它。

你知道有没有不使用CoreGenerator或FPU的“可合成浮点加法器或乘法器”吗?你能给我一个这些工具的链接吗(比如在OpenCore中)。如果coregen进行FP加法/乘法,我会使用它们-它是“C转换"你需要注意的是,这与实例化加法器和乘法器不同。使用这样的东西怎么样?我想说的是,由CoreGenerator创建的FPU有很多功能,我将只使用其中的一些。所以我认为这可能不是一种有效的方法。coregen core如果你不要求的话,几乎肯定不会添加额外的硬件。在使用OpenCores内核之前,我真的会三思而后行——你需要绝对确保它已经过了正确的验证。
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