从verilog中的乘法中取出前64位

时间:2018-02-04 01:40:32

标签: verilog quartus

我有两个64位寄存器,我想将它们相乘。我只对结果的前64位感兴趣。在verilog中写这个的最好方法是什么?我试过了

c = (a*b)[127:64]

哪个不起作用。所以现在我将乘法结果分配给128位寄存器,然后才使用该寄存器的前64位。但计算和存储较低的64位似乎是浪费。或者合成器是否足够智能,如果从未使用它们,从不实际合成这些位?

3 个答案:

答案 0 :(得分:3)

wire c_tmp[127:0];
reg c[64:0];

assign c_tmp = a*b;
assign c = c_tmp[127:64];

乘法结果将始终为128位。你不能节省这笔费用。您可以节省的只是注册费用。在将c_tmp作为电线时,您只是使用电线而不是实际的寄存器。并且,您可以选择将c设置为64位寄存器。

答案 1 :(得分:2)

如果你可以转到SystemVerilog,你可以写

c = {a*b}[127:64];

SystemVerilog允许您部分选择连接。但正如其他人所说,它不会为你节省那么多硬件。

答案 2 :(得分:0)

您可以这样做:

typedef logic [127:0] QWORD;

c = (QWORD'(a*b)) >> 64;