【问题标题】:Taking the top 64 bits from a multiplication in verilog从verilog中的乘法中取出前64位
【发布时间】:2018-02-04 01:40:31
【问题描述】:

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

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

这是行不通的。所以现在我将乘法的结果分配给一个 128 位寄存器,然后只使用该寄存器的前 64 位。但是计算和存储低 64 位似乎是一种浪费。或者,合成器是否足够聪明,如果这些位从未使用过,就不会真正合成它们?

【问题讨论】:

  • 这个乘法的结果 128位,所以你需要提供一个寄存器来保存它们。我相信合成器,如果它能够合成乘法,将需要所有这些。否则,您将需要实现自己的自定义乘数,它根本不会产生下半部分。
  • 合成器能够合成 64x64->128 乘法(我已经试过了)。是的,我还使用自己的乘法例程(内部仅使用 32x32->64 位乘法)实现了它。我想知道是否有一种(更好的)方法可以在 verilog 中以标准/有效的方式编写它。

标签: verilog quartus


【解决方案1】:
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 位寄存器。

【讨论】:

    【解决方案2】:

    如果你可以迁移到 SystemVerilog,你可以写

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

    SystemVerilog 允许您部分选择串联。但正如其他人所提到的,它不会为您节省那么多硬件。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      typedef logic [127:0] QWORD;
      
      c = (QWORD'(a*b)) >> 64;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多