Verilog:值与数组范围不匹配,模拟不匹配
就我所知,下面的代码合成和模拟正确,但XST仍给出以下警告:Verilog:值与数组范围不匹配,模拟不匹配,verilog,xilinx,hdl,Verilog,Xilinx,Hdl,就我所知,下面的代码合成和模拟正确,但XST仍给出以下警告:值与数组范围不匹配,模拟不匹配。我缺少什么吗 使用的工具:Xilinx ISE项目导航器(合成器:XST) FPGA:spartan3e module error_example( input [47:0] data, input [2:0] sel, output [5:0] data_out ); assign data_out = data[sel*6 +: 6]; endmodule 警告:X
值与数组范围不匹配,模拟不匹配。
我缺少什么吗
使用的工具:Xilinx ISE项目导航器(合成器:XST)
FPGA:spartan3e
module error_example(
input [47:0] data,
input [2:0] sel,
output [5:0] data_out
);
assign data_out = data[sel*6 +: 6];
endmodule
警告:Xst:790-“error_example.v”第8行:索引值与数组范围不匹配,模拟不匹配。
正如我所说,这是可行的,我已经计算过了:
sel
可以有0到7的值
如果sel
为0,则data\u out=data[5:0]
如果sel
为7,则data\u out=data[47:42]
我应该在这里做些不同的事情吗?这是XST中的一个bug吗?我创建了,它在没有警告的情况下运行
我通常不会将宽度与参数
s一起使用,如果这样做,您可能希望与reg定义保持一致
尝试:
参数数据=48'h123456789ABC代码>
参数[47:0]数据=48'h123456789ABC代码>
reg
意味着相同的逻辑,这可能会避免警告
reg[47:0]数据=48'h123456789ABC代码>
parameter
,localparam
),最好使用大写
或者转换为case语句:
always @* begin
case (sel)
3'd0: data_out = 6'dx;
3'd1: data_out = 6'dx;
// ...
default : data_out = 6'd0;
endcase
end
无论参数如何,警告仍然存在。。编辑了我的问题。我会向您的工具供应商提出这个问题,
+:6
应该保证宽度相同。然而,这是一个相对较新的特性(2005年),并且支持需要一些时间才能传播到所有工具。IEEE标准1364-2001第4.2.1节“矢量位选择和部分选择”中介绍了这一点addressing@Greg你说得对,我在陈述之前应该仔细核对我的事实。摩根:我喜欢你的回答,但它并没有完全回答我的问题。我的数据实际上是768位宽(示例中是缩减的),我不想写128个不同的大小写。@nguthrie我很确定在编辑之前它是正确的。如果我想要data\u out=data[5:0]
当sel=0
时,那么我会写assign data\u out=data[6*sel+5-:6]
。当我将其作为更大模块的一部分时,使用little-endian格式更方便。请参阅规范的第11.5.1节。第一个示例显示定义为[31:0]的向量,然后使用[0+:8]进行部分选择,结果是位[7:0]。我没有经常使用此功能,因为它非常容易混淆。您最初的示例使用了数据向量定义[lsb:msb],但您在第一次编辑时将其更改为[msb:lsb]。这就是区别。谷歌的第一次点击表明,这条消息有时是无效的:@nguthrie,这条消息很好地抓住了[lsb:msb]
,它确实改变了+:
的行为<代码>+:表示左边的位,而不是升序位。