VHDL:用于合成的整数?


17

如果在VHDL中将整数用于综合信号和端口等,我有点困惑。

我在顶级端口上使用了std_logic,但是在内部,我一直在各处使用范围整数。但是,我偶然发现了一些提到人们说您应该只将有符号/无符号用于合成目标代码的参考。

我已经去了,重新整理了我当前的项目以使用unsigned ...,而且,这显然很丑陋。

使用整数是否不好?有什么问题?该工具将整数映射到什么宽度上是否存在不确定性?


好问题。我一直在想自己。我从头开始使用整型,正数和其他类型,但是事实证明,要正确地进行合成非常麻烦。我希望有人能解释为什么每个人最终都会以一种高度类型化的语言使用std_logic。
TrygveLaugstøl2011年

1
是的 那不是疯了吗?在当前的实践中,如果键入过多,则会导致大量DATA_I <= TO_UNSIGNED(32010,DATA_I'LENGTH); 键入东西...这不会打扰任何人?:)看来似乎有很多不必要的负担。(特别是在其中添加STD_LOGIC_VECTOR()时)我已经声明了我的类型和大小,这应该是DATA_I <= 32010; 那应该是隐含的。在有符号/无符号之间等等之间可以而且应该是明确的...但是直接的明确赋值或对整数的操作应该是隐式的。
darron 2011年

Answers:


15

整数可以很好地综合使用,我一直都在使用它们。

我在顶级端口上使用了std_logic,但是在内部,我一直在各处使用范围整数

没关系!

意识到:

  • 您首先要模拟的不是吗:)-整数类型不会在模拟中自动“翻转”-超出为它们指定的范围是错误的。如果您想要翻转行为,则必须对其进行显式编码。
  • 它们只能从+ 2 311(即不是32位整数的全部范围,您不能使用2 31并保持可移植性),这是一个有时会有点痛苦。如果您需要使用“大”数字,则必须使用和。 -231-1个+231-1个-231unsignedsigned
  • 如果不限制它们,则有时可能得到32位计数器,而计数器的工作量会减少(如果合成器和后续工具无法“看到”它们可以优化位)。

从好的方面来看:

  • 它们比无符号/有符号矢量要快得多
  • 它们不会在仿真中自动翻转(是的,在两个列表中都存在:)。这很方便-例如,您会收到预警,告知您的计数器太小。

当您使用向量类型时,您正在使用ieee.numeric_std不是ieee.std_logic_arith吗?

integer在可能的地方使用s,但是如果我明确希望使用“ n位翻转计数器”,则倾向于使用unsigned


是的,我使用numeric_std。我想我最担心Xilinx工具...它们仍然为所有内容生成std_logic_vector,而“ UNSIGNED”甚至不在语法高亮显示中。
darron 2011年

1
@darron不必担心语法高亮。编辑器及其语法突出显示工具是与综合工具完全不同的软件。同样,unsigned是“仅”一种数据类型。它是标准库的一部分,而不是语言本身。
菲利普

下界不是-2 ^ 32 +1吗?如果它是-2 ^ 31-1,则只需要再多一位即可代表一个数字-很奇怪。
Bregalad

@Bregalad-收获不错-一段时间以来错了!
马丁·汤普森

@MartinThompson或者,如果您想保留减号,也可以将其写为-(2 ^ 32-1)。
Bregalad


6

将整数本身用作RTL并没有错,但是有一些理由避免使用它。这确实是一个关于主观“最佳实践”的问题,您最终将不得不找出自己喜欢的东西。为此,我将分享我的经验和想法。

原则上,在编写综合代码时,我也支持使用(受约束的)整数。我有时会这样做,但实际上,我通常会坚持signedunsigned。我将详细说明原因。

无论如何,您将不得不在设计的一部分中使用向量化数据类型:

  • 几乎任何供应商IP或第三方IP都不会使用integer端口类型

  • 例如,当通过BlockRam发送数据时,即使您推断出数据并因此不需要与任何IP /宏/原始接口,您仍然很可能需要转换为向量化类型

  • 即使以上两种都不适用,您仍将需要在某些时候与其他接口(顶级端口,如果没有其他接口)

由于您无法使用integer完整的设计,因此您可能希望一起跳过全部设计,因为:

  • 在某些方面,你需要无论如何做转换,而这发生在点之外的部分使用integer摆在首位

  • 此外,对于仿真,这些转换将典型地具有的载体称为'U''X',或者复位之前,或在其它时间,每颗这种函数调用将产生从封装功能的警告消息,弄乱模拟警告/提示

使用的缺点integer

  • 与向量化类型相反,整数不具有'U'and 'X'; 我发现这些对模拟非常有帮助。您会看到未初始化的信号如何在设计中传播,如果在重置后看到许多未初始化的信号,您可能会做出反应。如果使用整数,则不会是这种情况。

  • 使用整数时,加或减会导致下溢/上溢,因此模拟/合成失配的风险更大。(正如其他人已经指出的那样。)

我发现integer确实是一个不错的选择的典型情况:

  • 对于您通过chipScope / signalTap等监视的调试信号/计数器。

  • 计数器的完全内部表示,永远不会进出您自己的代码。是的,有这样的情况,例如,如果你正在写一个FIFO和你是航位推测写/读来形成的信号fullemptyalmostFull等(但是在指针算术比航位推测在这种情况下,更好的方法。 ..)

我自己的结论:有时但很少使用整数,并且在上述情况下更是如此。在使用unsignedsigned而不是整数方面,我看不到太多开销,因此通常坚持使用它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.