Verilog: значение (я) не соответствует диапазону массива, несоответствие моделирования

Насколько я могу судить, следующий код синтезирует и моделирует правильно, но XST по-прежнему выдает следующее предупреждение: value(s) does not match array range, simulation mismatch. Я что-то упускаю?

Используемый инструмент: Xilinx ISE Project Navigator (синтезатор: 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

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

Как я уже сказал, это работает, и я сделал математику:

sel может принимать значения от 0 до 7,

если sel равно 0, то data_out = data[5:0]...

если sel равно 7, то data_out = data[47:42]

Должен ли я сделать что-то по-другому здесь? Это ошибка в XST?


person verigolfer    schedule 06.03.2014    source источник
comment
@nguthrie Я почти уверен, что это было правильно до ваших правок. Если бы я хотел data_out = data[5:0], когда sel = 0, я бы написал assign data_out = data[6*sel+5 -: 6]. Было намного удобнее использовать формат с прямым порядком байтов, когда я включил его как часть гораздо большего модуля.   -  person verigolfer    schedule 06.03.2014
comment
См. раздел 11.5.1 спецификации. В первом примере показан вектор, определенный как [31:0], а затем выполняется выбор части с помощью [0 +: 8], и результатом являются биты [7:0]. Я не использовал эту функцию очень часто, так как она довольно запутана.   -  person nguthrie    schedule 06.03.2014
comment
Я имею в виду спецификацию 1800-2012: standards.ieee.org/ getieee/1800/download/1800-2012.pdf надеюсь, ничего не изменилось по сравнению со спецификацией Verilog.   -  person nguthrie    schedule 06.03.2014
comment
В исходном примере вектор данных определяет [lsb:msb], но вы изменили его на [msb:lsb] при первом редактировании. Отсюда и разница.   -  person nguthrie    schedule 06.03.2014
comment
Первый поиск в Google говорит, что это сообщение иногда недействительно: forums.xilinx.com/t5/Synthesis/   -  person nguthrie    schedule 06.03.2014
comment
@nguthrie, хороший улов с [lsb:msb], который меняет поведение +:. +: означает биты слева, а не восходящие биты.   -  person Greg    schedule 07.03.2014


Ответы (1)


Я создал пример на EDAplayground, который запускается без предупреждения.

Обычно я бы не использовал ширину с parameters, и если вы это сделаете, вы можете захотеть соответствовать определениям reg.

Пытаться:

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

Я не думаю, что раньше использовал параметры таким образом, но объявление константы reg подразумевает ту же логику, которая может избежать предупреждения.

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

NB: рекомендуется использовать верхний регистр для констант (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
person Morgan    schedule 06.03.2014
comment
Независимо от параметра предупреждение все еще существует.. Отредактировал мой вопрос. - person verigolfer; 06.03.2014
comment
Я бы поднял вопрос с поставщиком вашего инструмента, +:6 должен гарантировать, что ширина одинакова. Однако это относительно новая функция (2005 г.), и для распространения поддержки на все инструменты требуется некоторое время. - person Morgan; 06.03.2014
comment
На самом деле, +: относительно старый. Он был введен в IEEE Std 1364-2001, раздел 4.2.1 Адресация векторного выбора бита и выбора части - person Greg; 06.03.2014
comment
@ Грег Ты прав, я должен дважды проверить свои факты, прежде чем их излагать. Часть 15 Sunburst Verilog 2001 также достаточно хорошо освещает этот вопрос. - person Morgan; 06.03.2014
comment
@Morgan Морган Мне нравится твой ответ, но он не полностью отвечает на мой вопрос. Мои данные действительно имели ширину 768 бит (уменьшено для примера), и я не хотел писать 128 разных случаев. - person verigolfer; 06.03.2014
comment
@verigolfer, вы получаете такое же предупреждение, когда data имеет ширину 48 бит? Когда data имеет ширину 768, sel — 128 бит, а data_out — 6 бит? Если ответы «нет» и «да» соответственно, мультиплексор слишком велик для SXT. В этом случае разбейте большой мультиплексор на более управляемые мультиплексоры, такие как несколько мультиплексоров 32-к-1. - person Greg; 06.03.2014
comment
@ Грег Я провел несколько экспериментов, и сообщение появляется только тогда, когда ширина данных не является степенью двойки. Я вполне убежден, что это ошибка инструмента синтеза, но Xilinx не ответила на мое электронное письмо об этом. - person verigolfer; 07.03.2014