我正在尝试构建一个模块,该模块采用 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 来安排输入,但我无法理解乘法器如何执行这些乘法。然后我尝试将第一个乘法的输出写回中间寄存器并希望它能重用它,但我确信有更好的方法来做到这一点。
不需要结构乘法的多个实例。
行为建模适用于模拟和综合工作流程。
综合工作流程将推断大约级联的 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 位。