Verilog:值与数组范围不匹配,模拟不匹配

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

就我所知,下面的代码合成和模拟正确,但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
警告: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]
    ,它确实改变了
    +:
    的行为<代码>+:
    表示左边的位,而不是升序位。