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

И снова про покрытие но уже состояния по умолчанию

Всем добра!
В прошлый раз мне очень хорошо помогли, на что надеюсь и сейчас, ибо код на неродном мне языке и, м.б., я из-за этого плаваю.
Итого кусочек кода:

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, о чём говорит на рисунке:

image.png.b622ded9d39a4b5e08c4bca116bede90.png

Даже "запрещённый" приём в виде force не помогает.
Снова прошу помощи клуба и прилагаю всё и вся (включая библиотеку, возможно, ненужную, но упомянутую в проекте), относящееся к этому микро-проекту.
 

KRUG.ZIP

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


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

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;

 

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


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

Во-первых null оператор как бы намекает синтезатору "делай тут что хочешь/оставь старое з начение" посему в нём уже нет смысла.

Во-вторых при полном объявлении кейс стейтментов и зацикливании, состояние others как-бы недостижимо. VHDL не разрешает делать стейтменты без others (хотя может в новых ревизиях и можно), посиму тут нужно выкручиваться как получается. Для Верилога есть возможность опустить дефолтное состояние, чтобы задействовать full-case прагму. 

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


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

2 часа назад, Nick_K сказал:

VHDL не разрешает делать стейтменты без others (хотя может в новых ревизиях и можно),

Не пугайте, вполне разрешает (работаю в версии 1993). :smile:

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


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

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; 

чтобы её было хоть видно на времянке:

image.thumb.png.e97fde0ca5c7e5d60ee221ecedcc01c2.png

Было так:

image.thumb.png.66fdfb790804f9e1ac25c155e1435cb9.png

Почему же ModelSim при отображении времянки показывает, что машина попадает в дефолтное состояние, а при отображении покрытия - нет?

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


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

4 minutes ago, MrGalaxy said:

Не пугайте, вполне разрешает (работаю в версии 1993)

Ок, может это ещё зависит от синтезатора/IDE. Я точно помню, что в какой-то из последних версий ISE/PlanAhead нельзя было без others.

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


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

2 минуты назад, Nick_K сказал:

может это ещё зависит от синтезатора/IDE

Работаю в Квартусе 9.0. Сейчас поменял установки на версию 1987, компилятор  с синтезатором так же проглотили и не поморщились.

ЗЫ. Попробовал довеском всунуть в CASE, охватывающий все возможные варианты, WHEN OTHERS=> (думал, Квартус ругнётся). Проект собрался без проблем.

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


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

13 minutes ago, AnatolySh said:

В любом случае, спасибо.

Прошу простить за нарушение правил форума (п. 3.5) ....
Надеюсь, ничего криминального, помимо этого, не допустил, и наше обсуждение продолжится.

Да ещё и в организации нашей форум забанили: вот с утра разбирался с айтишниками...

12 minutes ago, Nick_K said:

синтезатора/IDE

ModelSim 10.6

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


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

ЗЫЗЫ. Вопрос к опытным: есть ли разница между

when others =>

и

when others => null;

?

Я просто никогда null не писал.

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


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

14 minutes ago, MrGalaxy said:

when others =>

Ну это ведь не висячее обьявление? Нельзя пустым оставлять - это точно. Или дефолтный стейт вносить или вообще убрать. А вообще лучше проверять результат синтеза

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


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

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 спросил.

Изменено пользователем MrGalaxy

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


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

2 minutes ago, MrGalaxy said:

в качестве ликбеза про NULL спросил

По-идее, тогда висячий стейт как null и интерпретируется.

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


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

Сode coverage очень слабая метрика, мало что говорящая о функциональной корректности, строка (или условие) кода может быть покрыта много раз, но само по себе это не говорит, что при этом не возникало ошибок. 

Вам же для DO, тогда есть два варианта. Напишите тест который загонит модуль в неправильное состояние в котором отработает непокрытый переход. Кстати, тестовые сценарии корректного выхода из состояния ошибки тоже важны, казырнете перед аудитором. 

Для итогового репорта сольете два отчета кодового покрытия в один. Но а если готовы с этим дальше жить всю  оставшуюся жизнь, то просто добавите exclude на этот переход и тогда он не будет портить общей картины репорта о покрытии, а кто уж там будет разбираться покрыли вы when other или нет...    

 

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


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

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:

Но а если готовы с этим дальше жить всю  оставшуюся жизнь

Мы хотим жить по-правилам, но дело в том, что те, кто принёс эти правила, пришли, как это у нас часто бывает, уже после того, как всё сделано, оттестировано и (кошмар!) летает!

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


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

Вопрос в том, состояние 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;

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


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

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

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

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

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

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

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

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

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

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