我正在尝试合成一个使用Intel Quartus软件的设计。在合成流程中,我得到了一个警告:"Verilog声明警告:向量有超过2**16位“。由于工程规格,导线长度超过2^16位。我真的需要担心这个警告吗?在Verilog/System Verilog中是否有任何关于导线最大位宽的限制?
发布于 2019-07-29 05:26:58
是的,你应该担心留言。这意味着你可能是在错误编码一些东西,因为我不认为你真的需要一个2^16位的整数向量(填充数组)。这意味着要表示一个大到2^16^2 = 1.1579209e+77的数字。您可能需要一个由位或字节组成的未打包数组。
发布于 2019-07-28 22:13:34
是的,根据SystemVerilog LRM,它可以是有限的,而且由于您的合成工具正在抛出警告,如果在您的项目的未来出现任何问题,您应该记住这一点。
对于打包数组(7.4.1节),您可能是根据警告引用的,预格式化的LRM读取:
封装阵列的最大大小可以限制,但必须至少为65 536 (2^16)位。
对于未打包的数组(第7.4.2节),它说:
实现可以限制数组的最大大小,但它们应该允许至少16 777 216 (2^24)元素。
但是,你真的需要一个2^16位宽的矢量吗?如果您有一个16位变量(例如,logic [15:0]),则可以处理2^16-1 = 65535以下的无符号值。如果你有一个2^16位宽的向量(例如logic [65535:0]),你可以将值显示到2^(2^16)-1 ≈ 2.00 × 10^19728。
你能不能把你的电线分成几根小一点的电线?
发布于 2019-07-28 22:21:17
Verilog/SystemVerilog语言本身并不定义最大向量宽度。我隐约记得在IEEE1364 / IEEE1800 LRMs中提到的最起码的模拟值。
由于各种原因,合成器可能有其自身的局限性:例如软件复杂性、物理映射/路由、业务策略(“购买另一种工具”)等等。您收到警告的事实可能意味着物理映射/路由,因为大多数合成器都试图将所有比特保持在一个向量中;从而使整个路由和时钟树缓冲变得更容易。
2^16是很多位数,而您的设计超过了这一点。理论上,您可以将整个向量分割成更易于管理的块(如左、右),它可能会为您提供更好的路由和定时。如果您的设计满足所有要求,则可以忽略警告。当它突然不能被忽视的时候,就做好改变的准备吧。
https://stackoverflow.com/questions/57244232
复制相似问题