如果在VHDL中将整数用于综合信号和端口等,我有点困惑。
我在顶级端口上使用了std_logic,但是在内部,我一直在各处使用范围整数。但是,我偶然发现了一些提到人们说您应该只将有符号/无符号用于合成目标代码的参考。
我已经去了,重新整理了我当前的项目以使用unsigned ...,而且,这显然很丑陋。
使用整数是否不好?有什么问题?该工具将整数映射到什么宽度上是否存在不确定性?
如果在VHDL中将整数用于综合信号和端口等,我有点困惑。
我在顶级端口上使用了std_logic,但是在内部,我一直在各处使用范围整数。但是,我偶然发现了一些提到人们说您应该只将有符号/无符号用于合成目标代码的参考。
我已经去了,重新整理了我当前的项目以使用unsigned ...,而且,这显然很丑陋。
使用整数是否不好?有什么问题?该工具将整数映射到什么宽度上是否存在不确定性?
Answers:
整数可以很好地综合使用,我一直都在使用它们。
我在顶级端口上使用了std_logic,但是在内部,我一直在各处使用范围整数
没关系!
意识到:
unsigned
signed
从好的方面来看:
当您使用向量类型时,您正在使用ieee.numeric_std
,不是ieee.std_logic_arith
吗?
我integer
在可能的地方使用s,但是如果我明确希望使用“ n位翻转计数器”,则倾向于使用unsigned
。
Jan Decaluwe撰写了有关整数与位向量问题的完整白皮书。我希望他的答案是尽可能使用整数。 http://www.jandecaluwe.com/hdldesign/counting.html
将整数本身用作RTL并没有错,但是有一些理由避免使用它。这确实是一个关于主观“最佳实践”的问题,您最终将不得不找出自己喜欢的东西。为此,我将分享我的经验和想法。
原则上,在编写综合代码时,我也支持使用(受约束的)整数。我有时会这样做,但实际上,我通常会坚持signed
和unsigned
。我将详细说明原因。
无论如何,您将不得不在设计的一部分中使用向量化数据类型:
几乎任何供应商IP或第三方IP都不会使用integer
端口类型
例如,当通过BlockRam发送数据时,即使您推断出数据并因此不需要与任何IP /宏/原始接口,您仍然很可能需要转换为向量化类型
即使以上两种都不适用,您仍将需要在某些时候与其他接口(顶级端口,如果没有其他接口)
由于您无法使用integer
完整的设计,因此您可能希望一起跳过全部设计,因为:
在某些方面,你需要无论如何做转换,而这发生在点之外的部分使用integer
摆在首位
此外,对于仿真,这些转换将典型地具有的载体称为'U'
或'X'
,或者复位之前,或在其它时间,每颗这种函数调用将产生从封装功能的警告消息,弄乱模拟警告/提示
使用的缺点integer
:
与向量化类型相反,整数不具有'U'
and 'X'
; 我发现这些对模拟非常有帮助。您会看到未初始化的信号如何在设计中传播,如果在重置后看到许多未初始化的信号,您可能会做出反应。如果使用整数,则不会是这种情况。
使用整数时,加或减会导致下溢/上溢,因此模拟/合成失配的风险更大。(正如其他人已经指出的那样。)
我发现integer
确实是一个不错的选择的典型情况:
对于您通过chipScope / signalTap等监视的调试信号/计数器。
计数器的完全内部表示,永远不会进出您自己的代码。是的,有这样的情况,例如,如果你正在写一个FIFO和你是航位推测写/读来形成的信号full
,empty
,almostFull
等(但是在指针算术比航位推测在这种情况下,更好的方法。 ..)
我自己的结论:有时但很少使用整数,并且在上述情况下更是如此。在使用unsigned
和signed
而不是整数方面,我看不到太多开销,因此通常坚持使用它们。