2012-07-30 117 views
9

我在教自己的verilog。我遵循的这本书在介绍章节中说过,为了执行分割,我们使用'/'运算符或'%'运算符。在后面的章节中,它说Verilog的分割过于复杂,不能合成,因此为了执行分割,它引入了一个长的算法。verilog中的分区

所以我很困惑,不能verilog处理简单的划分? /操作符是无用的吗?

+1

对于有效的RTL,如果分母是固定的,那么只需使用1 /分母,而不是/ 3使用* 0.33。对于/ 2使用>> 1。固定点字长将决定系数和答案的准确性。 – Morgan 2012-07-31 14:49:40

+1

目前综合工具相当不错,单一系数的倍数通常与手工操作一样小。除此之外,我会选择更易于阅读的版本,以获得更好的代码质量。 – Morgan 2012-08-06 11:49:55

回答

23

这一切都取决于你正在写什么类型的代码。

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

(由2简单的权力划分很明显,但通常你会使用移位运算符)

如果你写,你不希望被合成的代码,这是一个测试的一部分例如长凳,那么你可以使用所有你想要的部门。

所以要回答你的问题,/运算符并非无用,但你已经意识到你在哪里以及为什么使用它。 *也是如此,但程度较低。乘法器相当昂贵,但大多数综合器能够推断出它们。

+0

我不知道有移位和分裂之间的关系..我看着它,谢谢 – StuckInPhD 2012-07-31 17:08:30

+1

+1记住你正在制造硬件,不写程序 – Balthamos 2012-12-19 02:05:21

+1

@FarazKhan关系很明显,通过右移,我们除以2,右移右移,我们乘以2.例如用二进制来思考。拿一个数字说4'd12,二进制4'b1100。现在,如果我们右移一次,我们得到4'b0110,它是十进制的6,换句话说,我们已经把值除以2,它只用了一个时钟。 – Osaid 2013-02-25 06:23:04

5

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

+0

我不知道有移位和分裂之间的关系..我看着它,谢谢 – StuckInPhD 2012-07-31 17:08:05

5

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

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

3

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

当您将代码合成到特定芯片时,存在限制。这种局限性往往取决于工具供应商认为“明智”而不是可行的。

在过去,除了二次幂以外的任何事物都被认为对硅来说是不明智的,因为它占用了很多空间并且运行速度非常缓慢。目前,有些合成器会为您创建“不断变化的”电路。在未来,我看不出合成器为什么不能为你创建一个分频器(或者利用一个未来架构的DSP模块中的分频器)。不论它是否还有待观察,但见证乘法器的进展(在短短几年内从“只有两个幂”到“一个输入常量”到“全部实现”)

+0

谢谢。我确实想过使用由核心生成器生成的模块进行划分,而不是如果它进入算法。 – StuckInPhD 2012-07-31 17:07:04

-7

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

使用<=操作时,请记住,在立即计算出答案,而是进入了“结果”在下一时钟上升沿寄存器内的答案。

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

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

它就像当A-10疣猪攻击机攻击它拍摄大量的子弹箱。这是分频器电路在分频时的作用方式,它随机排列。几纳秒后,它将完成分割并返回稳定的良好结果。

这就是为什么我们要等到“结果”寄存器的下一个时钟周期。我们尽量保护它免受垃圾数量的影响。

分区是最复杂的操作,所以它会有延迟计算。对于16位分频,结果将在大约6纳秒内计算。

+3

运行在什么时钟的模块上有6纳秒的时间,它使用什么类型的除法算法? – Osaid 2012-12-20 13:11:36

+0

我认为这个帖子会导致比解决问题更多的问题。 – travisbartley 2014-06-09 09:14:36

1
  1. 电路,包括只除以2:刚刚移位:)
  2. 除2 ....看你要时刻想着在电路级Verilog不是C或C++
  3. /和%是不是合成的,或者如果它变成(新版本),我相信你应该保持自己的分频电路,这是因为他们提供的IP地址将被通用(最可能的是他们会为浮动不固定)
  4. 我敢打赌,你所经历过morris mano computer architechure book,在最后几章中,整个流程都与算法一起给出,通过它跟随它并制作你自己的
  5. 现在看看如果你的作品只用于逻辑验证,并且不需要真正的电路,那么肯定会去/和%。没有问题,它会为模拟
5

工作,你必须要考虑的硬件。

当您编写< = b/c时,您正在对综合工具“我想要一个可以在每个时钟周期提供一个结果并且没有中间管线寄存器的分频器”说。

如果您计算出所需的逻辑电路来创建它非常复杂,尤其是对于更高的位数。通常FPGA不会有专门的硬件模块进行划分,所以它必须用通用的逻辑资源来实现。它很可能是很大的(大量的luts)和慢的(fmax)。

一些合成器可无论如何实现它(从快速搜索似乎会的Quartus),其他人不会理会,因为他们不认为这是在实践中是非常有用的。

如果你是一个不断分裂并可以用近似的结果,那么你可以做的技巧与乘数生活。把你想要除的数的倒数乘以2的幂,并舍入到最接近的整数。

然后在verilog中,您可以通过乘法(在现代FPGAS上不会太昂贵)实现您的近似除法,然后进行移位(按固定位数移位本质上是免费的)。确保允许中间结果有足够的位。

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

通常,工具供应商会提供预制块(altera称它们为宏功能)以用于这类工作。这些优点是,工具供应商可能会仔细优化它们的设备。缺点是他们可以把供应商锁定,如果你想搬到另一个不同的设备供应商,你很可能不得不换掉这个块,你交换的块可能有不同的特性。

0

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

我不知道任何除法算法,但对于乘法,我已经使用了Booth算法。