【问题标题】:Division in verilogverilog 中的除法
【发布时间】:2012-07-30 16:30:21
【问题描述】:

我正在自学verilog。我正在阅读的书在介绍章节中指出,要执行除法,我们使用“/”运算符或“%”运算符。在后面的章节中说除法对于verilog来说太复杂并且无法合成,所以为了执行除法它引入了一个很长的算法。

所以我很困惑,verilog不能处理简单的除法吗? /操作符没用吗?

【问题讨论】:

  • 为了有效的 RTL,如果分母是固定的,那么只需使用 1/分母,而不是 a/3 使用 a*0.33。对于 a/2 使用 a>>1。定点字长将决定系数和答案的准确性。
  • 合成工具现在非常好,通常单个系数的倍数会像手工操作一样小。在其他条件相同的情况下,我会选择更易于阅读的版本,以获得更好的代码质量。

标签: verilog


【解决方案1】:

这完全取决于您编写的代码类型。

如果您正在编写要合成的代码,您打算进入 FPGA 或 ASIC,那么您可能不想使用除法或模运算符。当您将任何算术运算符放在 RTL 中时,合成器会实例化一个电路来完成这项工作; + & - 的加法器; * 的乘数。当您写/ 时,您要求的是分压器电路,但分压器电路是一个非常复杂的东西。它通常需要多个时钟周期,并且可能使用查找表。当你写 a / b 时,它需要很多综合工具来推断你想要什么。

(显然除以 2 的幂很简单,但通常你会使用移位运算符)

如果您正在编写不想被综合的代码,例如测试台的一部分,那么您可以随意使用除法。

所以要回答您的问题,/ 运算符并非毫无用处,但您必须清楚使用它的位置和原因。 * 也是如此,但程度较轻。乘法器非常昂贵,但大多数合成器都能够推断它们。

【讨论】:

  • 我不知道移位和除法之间有关系。我会研究一下,谢谢
  • @FarazKhan 关系很明显,右移我们除以 2,右移我们乘以 2。例如考虑二进制。取一个数字 4'd12,二进制是 4'b1100。现在,如果我们在得到 4'b0110 后将其右移,即十进制的 6,换句话说,我们将该值除以 2,它只使用了一个时钟。
  • @Osaid 如果你向左移动会发生什么? :P
  • @Moberg 这是乘以 2 的幂。假设我们有三个,即 6'b000011。如果我们将它左移两位,我们得到 6'b011000。这是二十四(即三乘以二的三次方)
  • 我认为 Moberg 是在开玩笑说 Osaid 只是在谈论向右移动“通过向右移动我们正在划分,......通过向右移动我们正在相乘......”:P
【解决方案2】:

你必须考虑硬件。

当您编写

如果您计算出创建所需的逻辑电路,它会非常复杂,尤其是对于更高的位数。通常 FPGA 没有用于划分的专用硬件块,因此必须使用通用逻辑资源来实现。它可能既大(很多 lut)又慢(低 fmax)。

一些合成器可能会实现它(从快速搜索看来 quartus 会),其他人不会打扰,因为他们认为它在实践中不是很有用。

如果您除以一个常数并且可以接受近似结果,那么您可以使用乘数进行技巧。取你想要除以的倒数,乘以 2 的幂,然后四舍五入到最接近的整数。

然后在您的 Verilog 中,您可以通过乘法实现近似除法(这在现代 FPGA 上并不太昂贵),然后是移位(在硬件中移位固定位数基本上是免费的)。确保为中间结果留出足够的位。

如果您需要一个准确的答案,或者如果您需要除以不是预定义常数的东西,您将必须决定您想要什么样的除法器。如果您的吞吐量很低,那么您可以使用基于状态机的方法,该方法每 n 个时钟周期进行一次除法。如果您的吞吐量很高并且您可以负担得起设备面积,那么每个时钟周期进行除法的流水线方法(但结果需要多个周期才能通过)可能更合适。

工具供应商通常会为这类东西提供预制块(Altera 称它们为宏功能)。这些的优点是工具供应商可能会为设备仔细优化它们。缺点是它们会导致供应商锁定,如果您想转移到不同的设备供应商,您很可能必须换出块,而您与之交换的块可能具有不同的特征。

【讨论】:

    【解决方案3】:

    所以我很困惑。 Verilog 不能处理简单的除法吗?是 / 运算符 没用?

    verilog 综合规范 (IEEE 1364.1) 实际上表明应该支持所有具有整数操作数的算术运算符,但没有人遵循该规范。一些综合工具可以进行整数除法,但其他工具会拒绝它(我认为 XST 仍然可以),因为组合除法通常是非常低效的区域。多周期实现是常态,但不能从 '/' 合成。

    【讨论】:

      【解决方案4】:

      除法和取模从来都不是“简单的”。如果可以,请避免使用它们,例如通过位掩码或移位操作。尤其是变量除数在硬件中实现起来真的很复杂。

      【讨论】:

      • 我不知道移位和除法之间存在关系。我会研究一下,谢谢
      【解决方案5】:

      “Verilog 语言”可以很好地处理除法和模数 - 当您使用计算机模拟代码时,您可以完全访问它的所有功能。

      当您将代码合成到特定芯片时,存在一些限制。这些限制往往是基于工具供应商认为什么是“明智的”而不是什么是可行的。

      在过去,除 2 的幂之外的任何除法都被认为对硅来说是不明智的,因为它占用了大量空间并且运行速度非常慢。目前,一些合成器会为您创建“除以常数”电路。

      在未来,我认为没有理由合成器不应该为您创建一个分频器(或使用一个位于潜在未来架构的 DSP 模块中的分频器)。是否会发生还有待观察,但见证乘数的进步(从“只有二的幂”到“一个输入常数”再到“完全实现”在短短几年内)

      【讨论】:

      • 谢谢。我确实想过只使用核心生成器生成的模块进行除法,而不是进入算法。
      【解决方案6】:
      1. 仅包括除以 2 的电路:只需移动位 :)
      2. 除了 2 .... 看到你应该始终认为在电路级 verilog 不是 C 或 C++
      3. / 和 % 是不可合成的,或者如果它变成(在新版本中)我相信你应该保留自己的除法电路,这是因为它们提供的 ip 将是通用的(很可能它们会使浮动不固定)李>
      4. 我敢打赌,你已经阅读了 morris mano 计算机架构书,在最后几章中,整个流程与算法一起给出,请按照它阅读并制作你自己的
      5. 现在看看你的作品是否只用于逻辑验证而不需要实际电路,请务必选择 / 和 % 。没问题,它可以用于模拟

      【讨论】:

        【解决方案7】:

        在verilog中可以使用'/'进行除法。但它不是一个可综合的算子。使用“*”进行乘法也是如此。在 verliog 中有某些算法可以执行这些操作,如果代码需要可合成,则使用它们。 IE。如果您需要等效的硬件。

        我不知道任何除法算法,但对于乘法,我使用了布斯算法。

        【讨论】:

          【解决方案8】:

          如果您想要可合成的代码,您可以使用 Divison_IP 或者您可以使用右移运算符进行某些除法,例如 64/8=8 相同 64>>3 = 8。

          【讨论】:

            【解决方案9】:

            划分在硬件上并不简单,因为人们花了很多时间在一个高效的 并以快速乘法器为例。但是,您可以通过在硬件中右移一位轻松地进行除以 2。

            【讨论】:

              【解决方案10】:

              使用result <= a/b 并完美运行。

              请记住,当使用 <= 运算符时,会立即计算答案,但会在下一个时钟上升沿将答案输入到“结果”寄存器中。

              如果您不想等到下一个时钟上升沿,请使用result = a/b.

              请记住,任何算术运算电路都需要一些时间来完成运算,在此期间电路会产生随机数(位)。

              就像当 A-10 疣猪攻击机攻击坦克时,它会发射大量子弹。这就是除法器电路在除法时的作用方式,它会吐出随机位。几纳秒后,它将完成除法并返回稳定的良好结果。

              这就是我们等待“结果”寄存器的下一个时钟周期的原因。我们试图保护它免受随机垃圾数字的影响。

              除法是最复杂的运算,所以计算会有延迟。对于 16 位除法,结果将在大约 6 纳秒内计算出来。

              【讨论】:

              • 6 纳秒的模块运行在什么时钟和它使用什么类型的除法算法?
              • 欢迎来到 slashdot,有点晚了。我敢打赌你会后悔回答这个问题:P 基本上,你的答案对于模拟是正确的,但对于综合来说效果较差。继续回答问题。练习会变得更容易:)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-12-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多