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

ver*_*fer 6 verilog hdl xilinx

据我所知,以下代码正确地进行了合成和模拟,但XST仍然发出以下警告: value(s) does not match array range, simulation mismatch.是否有我遗漏的东西?

使用的工具:Xilinx ISE项目导航器(合成器:XST)FPGA:SPARTAN 3E

module error_example(
    input [47:0] data,
    input [2:0] sel,
    output [5:0] data_out
);

   assign data_out = data[sel*6 +: 6];

endmodule
Run Code Online (Sandbox Code Playgroud)

WARNING:Xst:790 - "error_example.v" line 8: Index value(s) does not match array range, simulation mismatch.

就像我说的,这是有效的,我已经完成了数学运算:

sel 可以有0到7之间的值,

if sel为0,那么data_out = data[5:0] ......

如果sel是7,那么data_out = data[47:42]

我应该在这里做些不同的事吗?这是XST中的错误吗?

Mor*_*gan 5

在EDAplayground上创建了一个示例,它在没有警告的情况下运行.

我通常不会使用带有parameters的宽度,如果你这样做,你可能希望与reg定义保持一致.

尝试:

  1. parameter data = 48'h123456789ABC;
  2. parameter [47:0] data = 48'h123456789ABC;

我认为我之前没有使用过这样的参数,但声明一个常量reg意味着相同的逻辑,这可能会避免警告.

  1. reg [47:0] data = 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
Run Code Online (Sandbox Code Playgroud)

  • 我会向你的工具供应商提出这个问题,`+:6`应该保证宽度是一样的.然而,这是一个相对较新的功能(2005),支持需要一些时间才能传播到所有工具. (3认同)
  • 实际上,`+:`相对较旧.它是在IEEE Std 1364-2001第4.2.1节中引入的_Vector位选择和部分选择寻址_ (3认同)
  • @Greg你是对的,我应该在陈述之前仔细检查我的事实.[Sunburst Verilog 2001的第15部分](http://www.sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf)也很好地介绍了它. (2认同)