MaratZuev 0 27 июля, 2020 Опубликовано 27 июля, 2020 · Жалоба Всем добра! В прошлый раз мне очень хорошо помогли, на что надеюсь и сейчас, ибо код на неродном мне языке и, м.б., я из-за этого плаваю. Итого кусочек кода: process (clk, sbr) begin if sbr='0' then faza <= PRM0; elsif rising_edge(clk) then case state_wr is when 0 => faza <= PRM0; when 1 => faza <= PRM1; when 2 => faza <= PRM2; when 3 => faza <= PRM3; when 4 => faza <= PUST; when others=>null; end case; end if; end process; где я не знаю, как "попасть" в строку when others=>null; Не знает об этом и ModelSim, о чём говорит на рисунке: Даже "запрещённый" приём в виде force не помогает. Снова прошу помощи клуба и прилагаю всё и вся (включая библиотеку, возможно, ненужную, но упомянутую в проекте), относящееся к этому микро-проекту. KRUG.ZIP Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 8 hours ago, MaratZuev said: где я не знаю, как "попасть" в строку when others=>null; По коду из архива вы туда и не попадете. Можно попробовать написать так: signal state_wr : integer range 0 to 4 :=0; --FSM счетчик тактов синхронной state-машины process (clk, sbr) begin if sbr='0' then state_wr <= 0; elsif falling_edge(clk) then case faza is when PRM0 => if ReWr0 ='0' then state_wr <= state_wr +1; end if; when PRM1 => if ReWr1 ='0' then state_wr <= state_wr +1; end if; when PRM2 => if ReWr2 ='0' then state_wr <= state_wr +1; end if; when PRM3 => if ReWr3 ='0' then state_wr <= state_wr +1; end if; --when PUST => state_wr <= 0; when others=>state_wr <= 0; end case; end if; end process; -------------------------------------------------------------- process (clk, sbr) begin if sbr='0' then faza <= PRM0; elsif rising_edge(clk) then case state_wr is when 0 => faza <= PRM0; when 1 => faza <= PRM1; when 2 => faza <= PRM2; when 3 => faza <= PRM3; --when 4 => faza <= PUST; when others=>faza <= PUST; end case; end if; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба Во-первых null оператор как бы намекает синтезатору "делай тут что хочешь/оставь старое з начение" посему в нём уже нет смысла. Во-вторых при полном объявлении кейс стейтментов и зацикливании, состояние others как-бы недостижимо. VHDL не разрешает делать стейтменты без others (хотя может в новых ревизиях и можно), посиму тут нужно выкручиваться как получается. Для Верилога есть возможность опустить дефолтное состояние, чтобы задействовать full-case прагму. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 2 часа назад, Nick_K сказал: VHDL не разрешает делать стейтменты без others (хотя может в новых ревизиях и можно), Не пугайте, вполне разрешает (работаю в версии 1993). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 2 hours ago, novartis said: Можно попробовать написать так Попробовать можно, но код менять нельзя. Он уже поставлен на учёт. В любом случае, спасибо. Я вот, что попробовал: "расширил зону действия" force, в тестбенче: было initial begin #`FORSE_STATE_WR force KRUG_0.state_wr = 5; release KRUG_0.state_wr; end; стало initial begin #`FORSE_STATE_WR force KRUG_0.state_wr = 5; #`STATICPLL_GLB_HALF_PERIOD release KRUG_0.state_wr; end; чтобы её было хоть видно на времянке: Было так: Почему же ModelSim при отображении времянки показывает, что машина попадает в дефолтное состояние, а при отображении покрытия - нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 4 minutes ago, MrGalaxy said: Не пугайте, вполне разрешает (работаю в версии 1993) Ок, может это ещё зависит от синтезатора/IDE. Я точно помню, что в какой-то из последних версий ISE/PlanAhead нельзя было без others. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 2 минуты назад, Nick_K сказал: может это ещё зависит от синтезатора/IDE Работаю в Квартусе 9.0. Сейчас поменял установки на версию 1987, компилятор с синтезатором так же проглотили и не поморщились. ЗЫ. Попробовал довеском всунуть в CASE, охватывающий все возможные варианты, WHEN OTHERS=> (думал, Квартус ругнётся). Проект собрался без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaratZuev 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 13 minutes ago, AnatolySh said: В любом случае, спасибо. Прошу простить за нарушение правил форума (п. 3.5) .... Надеюсь, ничего криминального, помимо этого, не допустил, и наше обсуждение продолжится. Да ещё и в организации нашей форум забанили: вот с утра разбирался с айтишниками... 12 minutes ago, Nick_K said: синтезатора/IDE ModelSim 10.6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба ЗЫЗЫ. Вопрос к опытным: есть ли разница между when others => и when others => null; ? Я просто никогда null не писал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 14 minutes ago, MrGalaxy said: when others => Ну это ведь не висячее обьявление? Нельзя пустым оставлять - это точно. Или дефолтный стейт вносить или вообще убрать. А вообще лучше проверять результат синтеза Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 28 июля, 2020 Опубликовано 28 июля, 2020 (изменено) · Жалоба 14 минут назад, Nick_K сказал: Ну это ведь не висячее обьявление? Нельзя пустым оставлять - это точно. Смысл такой вкладывается: не делать ничего, оставить все сигналы в предыдущем состоянии. 14 минут назад, Nick_K сказал: или вообще убрать CASE должен охватывать все возможные значения, нельзя убирать. Не обязательно же OTHERS голый, например может быть вот так: when 0 => A<=A+1; when 1 => A<=A-1; when 2 => when others => A<=0; 14 минут назад, Nick_K сказал: А вообще лучше проверять результат синтеза Проверял, работает, а если значение попадает в OTHERS, то ситуация нештатная, и изделие принципе не должно работать, я так, в качестве ликбеза про NULL спросил. Изменено 28 июля, 2020 пользователем MrGalaxy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 2 minutes ago, MrGalaxy said: в качестве ликбеза про NULL спросил По-идее, тогда висячий стейт как null и интерпретируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба Сode coverage очень слабая метрика, мало что говорящая о функциональной корректности, строка (или условие) кода может быть покрыта много раз, но само по себе это не говорит, что при этом не возникало ошибок. Вам же для DO, тогда есть два варианта. Напишите тест который загонит модуль в неправильное состояние в котором отработает непокрытый переход. Кстати, тестовые сценарии корректного выхода из состояния ошибки тоже важны, казырнете перед аудитором. Для итогового репорта сольете два отчета кодового покрытия в один. Но а если готовы с этим дальше жить всю оставшуюся жизнь, то просто добавите exclude на этот переход и тогда он не будет портить общей картины репорта о покрытии, а кто уж там будет разбираться покрыли вы when other или нет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaratZuev 0 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба 5 hours ago, Mad_kvmg said: Напишите тест который загонит модуль в неправильное состояние в котором отработает непокрытый переход. В моём первом посте есть непокрытое состояние: я дорого бы дал за то, чтобы увидеть код, который загонит модуль в него. 5 hours ago, Mad_kvmg said: казырнете перед аудитором Козырять тем, что должно быть must have в любом коде, а не только у нас по DO-254 уровня А по крайней мере странно. Либо я мысль не уловил. 5 hours ago, Mad_kvmg said: два отчета кодового покрытия У нас и так функциональное покрытие и кодовое, слитое в один документ. Либо снова прошу пояснить. 5 hours ago, Mad_kvmg said: Но а если готовы с этим дальше жить всю оставшуюся жизнь Мы хотим жить по-правилам, но дело в том, что те, кто принёс эти правила, пришли, как это у нас часто бывает, уже после того, как всё сделано, оттестировано и (кошмар!) летает! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 8 28 июля, 2020 Опубликовано 28 июля, 2020 · Жалоба Вопрос в том, состояние others - оно принципиально возможно в вашей ситуации, или нет? Если да - думайте, как создать тестовую ситуацию. Если нет - почему бы не сделать так (сорри если кто-то уже предлагал): case state_wr is when 0 => faza <= PRM0; when 1 => faza <= PRM1; when 2 => faza <= PRM2; when 3 => faza <= PRM3; when others => faza <= PUST; end case; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться