Jump to content

    

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

Recommended Posts

Dr.Alex

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 и забить или разбираться дальше?

Share this post


Link to post
Share on other sites

aat_81
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? Если сигнал Х четырехбитный все вроде как логично

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Dr.Alex
А что есть 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 кейсов :-))))

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

PS

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

 

PS

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

 

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

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

Share this post


Link to post
Share on other sites

SM
а 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 - кто-то, вроде, ставит знак делимого, а кто-то - делителя.

 

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Dr.Alex

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

 

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.