Перейти к содержанию
    

некоторая непонятка (XST + VHDL)

case x mod 4 is
    when 0  =>
    when 1  =>
    when 2  =>
    when 3  =>
end case;

 

Вивадо даёт следующий отлуп:: [synth 8-426] missing choice(s) 4 to 15 in case statement

 

Откуда там 4 по 15-то? Поставить when others и забить или разбираться дальше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

case x mod 4 is
    when 0  =>
    when 1  =>
    when 2  =>
    when 3  =>
end case;

 

Вивадо даёт следующий отлуп:: [synth 8-426] missing choice(s) 4 to 15 in case statement

 

Откуда там 4 по 15-то? Поставить when others и забить или разбираться дальше?

А что есть X? Если сигнал Х четырехбитный все вроде как логично

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда там 4 по 15-то?

Ну, видимо, "x" был у Вас 4-битный. Соответственно, результат тоже 4-битный. А что "mod 4" ограничивает свой выход числом 3, об этом синтезатор не догадывается. Он просто ставит блок делителя, и заводит выход остатка (который тоже 4-битный) на компараторы условий case. Поэтому, просто сделайте case по двум младшим битам "x" - этим и варнинг уберете, и громадный и монстроидальный комбинаторный делитель из схемы, и лишние два провода из логики case. То есть, Ваш вариант для моделирования годится, а вот для синтеза - просто мегамонстр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что есть X? Если сигнал Х четырехбитный все вроде как логично

Ну, видимо, "x" был у Вас 4-битный.

В том-то и дело, что разрядность его не 4, а очень велика. Поэтому и непонятно, откуда берётся 4.

Ещё интересно, что если сделать (x mod 2), то требует уже 8-и кейсов, а (x mod 1) - четырёх :-)))

 

Он просто ставит блок делителя, и заводит выход остатка (который тоже 4-битный) на компараторы условий case. Поэтому, просто сделайте case по двум младшим битам "x" - этим и варнинг уберете, и громадный и монстроидальный комбинаторный делитель из схемы, и лишние два провода из логики case. То есть, Ваш вариант для моделирования годится, а вот для синтеза - просто мегамонстр.

В монстроидальный делитель я категорически не верю, а mod 4 это и есть указание оставить 2 бита, ведь сигнал-то объявлен как integer. Ну может быть правильнее (x rem 4) сделать.

Кстати это даже не варнинг, а самый что ни на есть фатальный еррор.

 

 

UPD:

Ещё забавно:: если х двухбитный, то всё ок, 4-х кейсов достаточно. Если же написать (x mod 4), то требуется уже 16 кейсов :-))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В монстроидальный делитель я категорически не верю, а mod 4 это и есть указание оставить 2 бита, ведь сигнал-то объявлен как integer.

 

Я немного неправильно сказал... mod 4 - это указание оставить 3 бита, так как число 4 - трехбитное, а выход остатка по разрядности соответствует входу делителя, если он уже, чем делимое, + опциональный бит знака. В Вашем случае, три бита остатка + бит знака (integer-то вроде тип со знаком, да и число 4 по умолчанию, наверное, имеет signed тип).

 

А вот почему это еррор - это непонятно. Обычно это варнинг, что латч получился из-за неполного case.

 

PS

А не верить в делители - Ваше право. Однако, Synopsys на каждый mod втыкает DW_div - а уже внутри мегафункции все оптимизации. Квартус примерно так же делает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я немного неправильно сказал... mod 4 - это указание оставить 3 бита, так как число 4 - трехбитное, а выход остатка по разрядности соответствует входу делителя, если он уже, чем делимое, + опциональный бит знака. В Вашем случае, три бита остатка + бит знака (integer-то вроде тип со знаком, да и число 4 по умолчанию, наверное, имеет signed тип).

 

А вот почему это еррор - это непонятно. Обычно это варнинг, что латч получился из-за неполного case.

Ну что ж, возможно. Значит просто поставить when others => NULL и забить.

Да и латча у меня не будет, поскоку кейс в синхронном процессе..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну что ж, возможно. Значит просто поставить when others => NULL и забить.

И еще потом не удивляться, если вдруг в проекте тайминги не сойдутся, или сотня-другая лутов из ниоткуда возьмется....

 

А что это вообще за фигня, чтобы в синхронном процессе так настырно требовали описать полный case?

 

PS

напишите лучше x and 3, если извлекать младшие биты религия не позволяет, так и понятнее, и гарантировано без делителей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще потом не удивляться, если вдруг в проекте тайминги не сойдутся, или сотня-другая лутов из ниоткуда возьмется....

Ну это вряд ли..

 

А что это вообще за фигня, чтобы в синхронном процессе так настырно требовали описать полный case?

В ISE не требовали. А в виваде где-то настраивается серьёзность для разных ошибок, возможно и для этой тоже.

 

напишите лучше x and 3, если извлекать младшие биты религия не позволяет, так и понятнее, и гарантировано без делителей.

Низзя так с интегером.. :-о

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а x mod 4 для x == -3 чем равен?

Если со знаком то кейз реально не полный)

 

По идее, -3 (A mod B => A - int(A/B)*B => -3 - int(-3/4)*4 = -3 - 0 = -3). Но я точно не знаю, надо бы стандарт VHDL открыть. В этом и отличие между mod и rem - кто-то, вроде, ставит знак делимого, а кто-то - делителя.

 

Низзя так с интегером.. :-о

Так преобразовать в нормальный тип.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так преобразовать в нормальный тип.

"Нормальный тип" это битовый (std_logic_vector, signed или unsigned), но там и вопросов нет, а я вот сторонник того чтобы где только можно использовать "небитовые" типы, то есть integer.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Нормальный тип" это битовый

Так в этом и дело, что в данной ситуации, где по сути надо выделить два младших бита числа, именно использование битового типа оправдано по всем фронтам (и по читаемости, и по сути, и по оптимальности реализации в железе), чем замороченной математической операции, с которой без пол-литры не поймешь, что там со знаками будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так в этом и дело, что в данной ситуации, где по сути надо выделить два младших бита числа, именно использование битового типа оправдано по всем фронтам (и по читаемости, и по сути, и по оптимальности реализации в железе), чем замороченной математической операции, с которой без пол-литры не поймешь, что там со знаками будет.

Есесно, всегда есть достоинства и недостатки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а я вот сторонник того чтобы где только можно использовать "небитовые" типы, то есть integer.

не подкола ради, а для познания, с чем связана такая сторона? Я думал как раз правильнее сваливаться в итоге к типам железа, нежели к каким-то их представлениям...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да што ж за день-то сегодня такой.. :-о :-о

 

Обнаружил, что в синплифай можно написать z <= (('0' & x) + ('0' & y))(8 downto 1);

а в XST нет! :-о :-о :-о

Ругается именно на укорочение результата..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...