如何将多个输入安排到实例化的 SystemVerilog 模块中?

问题描述 投票:0回答:1

我正在尝试构建一个模块,该模块采用 32 位输入(参数化)并输出输入的立方。天真的方法如下:

module cuber #(
    BW = 32
) (
    input logic [BW-1:0] in0,
    output logic [BW*2-1:0] cubed_op
);

logic [BW*2-1:0] inter_l;

fast_mul #(.BW(BW))
fm_inst_1 (
  .input1(in0),
  .input2(in0),
  .product(inter_l)
);

fast_mul #(.BW(BW))
fm_inst_2 (
  .input1(inter_l),
  .input2(in0),
  .product(cubed_op)
);

endmodule

但我想知道是否可以重复使用

fm_inst_1
乘法器来执行这两个乘法。

我正在尝试使用 FIFO 来安排输入,但我无法理解乘法器如何执行这些乘法。然后我尝试将第一个乘法的输出写回中间寄存器并希望它能重用它,但我确信有更好的方法来做到这一点。

verilog system-verilog hdl register-transfer-level
1个回答
0
投票

不需要结构乘法的多个实例。
行为建模适用于模拟和综合工作流程。

综合工作流程将推断大约级联的 3 个 FPGA DSP 模块,以执行乘法。

fifo 与乘法无关。

您发布的内容至少有一个错误。
N 位的立方产生 3N 位,而不是 2N

这是一个行为模型。

module cuber #(
    BW = 32
) (
  input  logic [BW       -  1:0] in0,
  output logic [(BW * 3) -  1:0] cubed_op
);
  
  always@(*)
    cubed_op = in0 * in0 * in0;

endmodule

一个小的 sim 就产生了

time = 0, in0 =        2, cubed_op =               8, log2 cubed =   3
time = 1, in0 =        4, cubed_op =              64, log2 cubed =   6
time = 2, in0 =        8, cubed_op =             512, log2 cubed =   9
time = 3, in0 =       16, cubed_op =            4096, log2 cubed =  12
time = 4, in0 =      256, cubed_op =        16777216, log2 cubed =  24
time = 5, in0 =     2048, cubed_op =      8589934592, log2 cubed =  33
time = 6, in0 = 4294967295, cubed_op = 79228162458924105385300197375, log2 cubed =  96

我打印了日志来显示多维数据集使用的位数。

时间 6 处的最后一个向量是输入的最大值 (2**32 - 1),因此您可以看到它适用于大数并需要 3*N 位。

© www.soinside.com 2019 - 2024. All rights reserved.