在verilog中划分

时间:2012-07-30 16:30:22

标签: verilog

我在教自己verilog。我正在遵循的书中介绍了要执行除法的章节,我们使用'/'运算符或'%'运算符。在后面的章节中,它表示划分对于verilog来说太复杂而且无法合成,因此为了执行除法,它引入了一个很长的算法。

所以我很困惑,不能verilog处理简单划分? /操作员没用吗?

10 个答案:

答案 0 :(得分:27)

这完全取决于您正在撰写的代码类型。

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

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

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

所以要回答你的问题,/运算符并非毫无用处,但你对于使用它的地点和原因非常有用。 *也是如此,但程度较轻。乘数非常昂贵,但大多数合成器能够推断它们。

答案 1 :(得分:7)

你必须用硬件思考。

当你写一个< = b / c时,你要对综合工具说#34;我想要一个能够在每个时钟周期提供结果并且没有中间pipline寄存器的分频器"。

如果你计算出创建它所需的逻辑电路非常复杂,特别是对于更高的位数。通常,FPGA不具备用于除法的专用硬件模块,因此必须使用通用逻辑资源来实现FPGA。它可能既大(很多)也很慢(低fmax)。

有些合成器无论如何都可以实现它(从快速搜索似乎将会发展),其他人不会因为他们认为它在实践中非常有用而烦恼。

如果要除以常数并且可以得到近似结果,那么你可以用乘数来做技巧。取你想要除以的数的倒数,乘以2的幂并舍入到最接近的整数。

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

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

工具供应商通常会为这类东西提供预制块(altera称之为宏功能)。这些优点是工具供应商可能已经为设备仔细优化了它们。缺点是它们可以带来供应商锁定,如果你想转移到另一个设备供应商,你很可能必须换掉这个块,你交换它的块可能有不同的特性。

答案 2 :(得分:5)

  

所以我很困惑。不能verilog处理简单划分?是/运营商   无用?

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

合成

答案 3 :(得分:4)

分区和模数永远不会“简单”。如果可以,请避免使用它们,例如:通过位掩码或移位操作。特别是变量除数在硬件中实现起来非常复杂。

答案 4 :(得分:3)

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

当您将代码合成到特定芯片时,存在局限性。限制倾向于基于工具供应商认为“合理”而不是可行的东西。

在过去,除了2的幂以外的任何东西被认为对硅来说是不合理的,因为它占用了大量空间并且运行得非常慢。目前,一些合成器会为您创建“除以恒定”电路。

将来,我认为没有理由为什么合成器不应该为你创建一个分频器(或者使用未来潜在架构的DSP模块中的分频器)。它是否会有待观察,但见证了乘数的增长(从“仅两个幂”到“一个输入常数”到“完全实现”在短短几年内)

答案 5 :(得分:1)

  1. 仅包括除以2的电路:只需移位:)
  2. 除了2 ....看你应该总是认为电路级别的verilog不是C或C ++
  3. /和%是不可合成的,或者如果它变成(在新版本中)我相信你应该保留你自己的分区电路这是因为它们提供的ip将是通用的(很可能它们会使浮动不固定)
  4. 我打赌你已经通过了morris mano计算机架构书,在最后几章中,整个流程都与算法一起发布,通过它跟随它并制作你自己的
  5. 现在看看你的作品是否仅用于逻辑验证而且不需要真正的电路,请确保使用/和%。没问题,它可以用于模拟

答案 6 :(得分:0)

使用' /'在verilog中是可能的。但它不是一个可综合的运营商。使用' *'进行乘法的情况也是如此。有一些算法可以用verliog来执行这些操作,如果代码需要是可合成的,则使用它们。即。如果你需要一个等效的硬件。

我不知道任何划分算法,但对于乘法,我使用了Booth的算法。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:-9)

使用result <= a/b并且效果很好。

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

如果您不想等到下一个时钟正边沿使用result = a/b.

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

就像A-10疣猪攻击飞机攻击坦克一样,它射出了很多子弹。这就是分频器电路在分频时的作用,它会随机发出随机位。经过几纳秒后,它将完成分割并返回稳定的良好结果。

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

分区是最复杂的操作,因此计算会有延迟。对于16位除法,结果将在大约6纳秒内计算。