реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> fsm timing loop, вопрос новичка в sv
Lutovid
сообщение Jun 13 2018, 18:05
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 98
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Всем привет!

Всегда писал автоматы преимущественно одним блоком процесса, сейчас решил попробовать разделение на синхронный и асинхронный блоки так как в текущей задаче это было бы удобно(небольшая экономия строк кода и повышение читаемости). Да и язык для меня новый.

Вот написал конечный автомат:
Код
    (*keep = "true"*)enum logic[5:0] {IDLE, READ_HEADER, READ_CALIB_DATA, STOP} sm_state, sm_state_next;

    always_ff @(posedge clk) begin
        sm_state <= sm_state_next;
    end

    always @(*)begin// специально поставил именно * так как входных сигналов управления fsm предполагается много
          if(rst==1'b1)begin
            sm_state_next <= IDLE;
        end
        else begin
            case (sm_state)
                IDLE : begin
                    sm_state_next <= READ_HEADER;
                end
                READ_HEADER : begin
                        sm_state_next <= READ_CALIB_DATA;
                end
                READ_CALIB_DATA : begin
                            sm_state_next <= STOP;
                end
                STOP : begin
                    
                end
                default: begin
                    sm_state_next <= IDLE;
                end
            endcase
        end
    end

Как я понял - так же предлагают многие учебники(может я не внимателен?).
Проблема в том, что вивадо(17.1) ругается, что там появляется timing loop. Это нормальное поведение? не усложняет ли этот факт ошибки оценку тайминга(при желании можно проигнорировать эту ошибку и насильно развести)
В симуляции работает все корректно.

Заранее спасибо!
Go to the top of the page
 
+Quote Post
yes
сообщение Jun 13 2018, 18:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 157
Регистрация: 23-12-04
Пользователь №: 1 640



ругается из-за кейса STOP:
в нем ничего с переменной не делается, то есть должно сохранятся прошлое значение
либо нужно там написать что-то типа sm_state_next <= хххх, либо сверху написать always_comb (надеюсь вивадо такое примет)
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jun 13 2018, 18:54
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 98
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(yes @ Jun 13 2018, 21:39) *
ругается из-за кейса STOP:
в нем ничего с переменной не делается, то есть должно сохранятся прошлое значение
либо нужно там написать что-то типа sm_state_next <= хххх, либо сверху написать always_comb (надеюсь вивадо такое примет)

добавил
Код
                STOP : begin
                    sm_state_next <= STOP;
                end

не помогло
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Jun 13 2018, 18:56
Сообщение #4


В поисках себя...
****

Группа: Свой
Сообщений: 670
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



У вас автомат попадает в состояние STOP. А дальше куда ?
Поскольку САПР не знает, что дальше делать, он делает так, что автомат будет "крутиться" в этом состоянии. А поскольку логика перехода не определена, получается фиг пойми что. Ну вот вам САПР и выкатил предупреждение wink.gif
Цитата
Код
                STOP : begin
                    sm_state_next <= STOP;
                end

не помогло

А вот это уже странно. В VHDL обычно такое описание прокатывает. И у Quartus не вызывает ругани.
Вот только я синхронный сброс описываю в состоянии в блоке
Код
    always_ff @(posedge clk) begin
        sm_state <= sm_state_next;
    end

Примерно так:
Код
    always_ff @(posedge clk) begin
        sm_state <= sm_state_next;
       if(rst==1'b1)begin
            sm_state_next <= IDLE;
        end
    end

Хотя тут я даже не знаю. Может есть какой нюанс в Verilog.
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jun 13 2018, 19:00
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 98
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(Flip-fl0p @ Jun 13 2018, 21:56) *
У вас автомат попадает в состояние STOP. А дальше куда ?
Поскольку САПР не знает, что дальше делать, он делает так, что автомат будет "крутиться" в этом состоянии. А поскольку логика перехода не определена, получается фиг пойми что. Ну вот вам САПР и выкатил предупреждение wink.gif


Код
                STOP : begin
                    sm_state_next <= IDLE;
                end


все то же самое =/
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Jun 13 2018, 19:07
Сообщение #6


В поисках себя...
****

Группа: Свой
Сообщений: 670
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Lutovid @ Jun 13 2018, 22:00) *
Код
                STOP : begin
                    sm_state_next <= IDLE;
                end


все то же самое =/

Гляньте вот этот документ:
http://www.sunburst-design.com/papers/Cumm...undamentals.pdf
Да и вообще советую почаще заглядывать на этот сайт. Много интересного там: www.sunburst-design.com
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jun 13 2018, 19:14
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 98
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(Flip-fl0p @ Jun 13 2018, 22:07) *
Гляньте вот этот документ:
http://www.sunburst-design.com/papers/Cumm...undamentals.pdf
Да и вообще советую почаще заглядывать на этот сайт. Много интересного там: www.sunburst-design.com


Спасибо, гляну, но мне все таки кажется, что дело тут не в алгоритмике, все же это простейший автомат без всякой логики< по идее он должен был завестись...
попробовал ресет как у вас, не помогло =/ может есть галка какая в настройках синтезатора, которая поможет ему это съесть...

Собственно 4 страница вашего документа - я не вижу сильных различий за исключением списка чувствительности и типа присвоения
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jun 13 2018, 20:16
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 98
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Выяснил вот что - если создать проект с одним этим файлом, то вивадо не ругается, если же включить его как дочерний модуль< то возникает критикал варнинг
Прикрепленное изображение

на картинке тот самый луп(один из) - он есть во всех случаях синтеза< просто когда-то на него ругается вивадо, а когда-то нет... вводит в ступор...
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Jun 13 2018, 21:41
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 127
Регистрация: 23-12-04
Пользователь №: 1 643



Приветсвую!
Цитата(Lutovid @ Jun 13 2018, 21:05) *
always_ff @(posedge clk) begin
sm_state <= sm_state_next;
end

always @(*)begin// специально поставил именно * так как входных сигналов управления fsm предполагается много
sm_state_next <= sm_state;
...
end[/code]

Многие учебники предлагают при таком описании автомата всегда присваивать sm_state_next текущее состояние sm_state в начале комбинаторного блока. Тогда если в case не было смены состояния то автомат остается в текущем состоянии.
Что касается лупа - то надо смотреть как Вы назначаете выходные сигналы в автомате и как они влияют на входные сигналы в этом же автомате через внешнюю логику. Скорее всего у Вас выходной сигнал назначается в комбинаторной части в одном из состояний и он же через внешние цепи требует смены этого состояния. Вот Вам и loop.

Удачи! Rob.
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jun 13 2018, 22:27
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 98
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(RobFPGA @ Jun 14 2018, 00:41) *
Приветсвую!

Многие учебники предлагают при таком описании автомата всегда присваивать sm_state_next текущее состояние sm_state в начале комбинаторного блока. Тогда если в case не было смены состояния то автомат остается в текущем состоянии.
Что касается лупа - то надо смотреть как Вы назначаете выходные сигналы в автомате и как они влияют на входные сигналы в этом же автомате через внешнюю логику. Скорее всего у Вас выходной сигнал назначается в комбинаторной части в одном из состояний и он же через внешние цепи требует смены этого состояния. Вот Вам и loop.

Удачи! Rob.


Спасибо! Учел все вышеперечисленные советы и loopы убрались!
Возьму за правило такой стиль описания
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 1 vikS

 


RSS Текстовая версия Сейчас: 16th July 2018 - 18:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01083 секунд с 7
ELECTRONIX ©2004-2016