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

Синтезатор минимизирует лишнего

Салют.

 

Синтезируем простенький автомат:

module Test(output reg [1:0]State,
            output reg [3:0]Out,
                input C);

    always @(posedge C)
    begin
        case(State)
        0:
        begin
            State <= 2'd1;
            Out <= 4'b0001;
        end
        1:
        begin
            State <= 2'd2;
            Out <= 4'b0010;
        end
        2:
        begin
            State <= 2'd3;
            Out <= 4'b0100;
        end
        3:
        begin
            State <= 2'd2;
            Out <= 4'b1000;
        end
        default:
        begin
            State <= 0;
            Out <= 4'b0000;
        end
        endcase
    end
endmodule

Как видим 0-е и 1-е состояние выполняется один раз, потом цикл 2-3-2-3-2-3-2-3....

 

Синтезатор Квартуса 9.1 нас осчастливил следующим:

Warning: Output pins are stuck at VCC or GND
    Warning (13410): Pin "State[1]" is stuck at VCC
    Warning (13410): Pin "Out[0]" is stuck at GND
    Warning (13410): Pin "Out[1]" is stuck at GND

По этим ворнингам можно понять, что были выкинуты 0-е и 1-е состояния.

 

При этом, если засинтезировать такой автомат, где используются не все состояния регистра State, то всё норм.

module Test(output reg [1:0]State,
            output reg [2:0]Out,
                input C);

    always @(posedge C)
    begin
        case(State)
        0:
        begin
            State <= 2'd1;
            Out <= 3'b001;
        end
        1:
        begin
            State <= 2'd2;
            Out <= 3'b010;
        end
        2:
        begin
            State <= 2'd2;
            Out <= 3'b100;
        end
        default:
        begin
            State <= 0;
            Out <= 3'b000;
        end
        endcase
    end

Методом научного тыка нашёл решение проблемы, в настройках синтезатора нужно снять опцию "Power-Up don't care".

Кто-нибудь может сказать что происходит?

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

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


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

а как вы в первом листинге в нулевое состояние попадаете?

а никак.

 

вот синтезатор считает, что вы в него никогда не попадаете. и оптимизирует.

 

hint: попадать туда нужно по сигналу сброса.

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


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

hint: попадать туда нужно по сигналу сброса.

Это да, согласен. Но вроде, если ничего не путаю, Альтера гарантирует, что в начале работы все триггеры будут в нуле.

Да и второй код почему отрабатывает нормально?

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


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

HDL - это язык описания оборудования.

 

синтезатор волен исполнять то что написано любым удобным ему способом.

если вы чего-то не описали, значит будет так, как задано в алгоритме синтезатора по умолчанию.

 

при снятии галки "Power-Up don't care" вам повезло, что ваше нулевое состояние совпадает с тем, что синтезатор устанавливает по-дефолту регистры в 0.

причем, никто не сможет запретить разработчикам quartus поменять это дефолтное поведение через две версии.

в результате чего ваш ранее работавший проект может перестать работать.

 

 

конкретно в quartus при отключении галки "Power-Up don't care" после загрузки sof непосредственно перед переходом в user-mode регистры устанавливаются в то состояние, которое описано в initial. у вас блока initial нет - поэтому берется дефолт синтезатора.

 

однако использование initial является дурным тоном для RTL.

поэтому рекомендуется использовать сброс.

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


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

однако использование initial является дурным тоном для RTL.

Ага и давайте опишите мне со сбросом ROM блок....

 

Синтезатор Квартуса 9.1 нас осчастливил следующим:

А сейчас последний не 15 случаем? Если пойти еще дальше, то там вообще автоматы придется описывать в 2 этапа, с комбинаторной логикой отдельно. Думаю тут конкретно старый квартус просто не распознал автомат.

 

 

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


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

Ага и давайте опишите мне со сбросом ROM блок....

я-таки стесняюсь спросить, а зачем он вам такой нужен?

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


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

синтезатор волен исполнять то что написано любым удобным ему способом.

если вы чего-то не описали, значит будет так, как задано в алгоритме синтезатора по умолчанию.

Как же я не описал? Я описал состояния с 0-го по 3-е. Я же не просто так их написал, они мне нужны! Какое право он имел выкинуть первые два?

С одной стороны его можно понять, он не знает с какого состояния должен начать работу автомат, но с другой стороны Альтера гарантирует, что все триггеры будут установлены в ноль, значит компилятор тоже об этом знает, а раз так, то и выкидывать он ничего не должен, потому что он обязан сообразить, что автомат будет исполнятся из 0-го состояния.

поэтому рекомендуется использовать сброс.
Тогда этот сброс надо делать либо от кнопки, что не всегда возможно, либо специально ставить микросхему сброса в духе RC-цепочки, что, как я думаю, тоже неправильно, ПЛИС должна быть самодостаточна (в разумных пределах). Конечно можно использовать виртуальные пины, но это уже костыли.

Однако, почему второй код рабочий - непонятно.

 

А сейчас последний не 15 случаем? Если пойти еще дальше, то там вообще автоматы придется описывать в 2 этапа, с комбинаторной логикой отдельно. Думаю тут конкретно старый квартус просто не распознал автомат.
Кстати да, обычно кружочки в RTL-вивере рисует, а тут просто схему.

Начиная с 10 версии Квартусы какие-то нехорошие пошли, глючные и тормознутые, хотя 13-15 не пробовал.

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


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

Как же я не описал? Я описал состояния с 0-го по 3-е. Я же не просто так их написал, они мне нужны! Какое право он имел выкинуть первые два?

Он ничего не "должен". Это ваша задача описать схему правильно. Есть определенные правила, которые нужно соблюдать.

С одной стороны его можно понять, он не знает с какого состояния должен начать работу автомат, но с другой стороны Альтера гарантирует, что все триггеры будут установлены в ноль, значит компилятор тоже об этом знает, а раз так, то и выкидывать он ничего не должен, потому что он обязан сообразить, что автомат будет исполнятся из 0-го состояния.

Он не должен думать за вас.

Тогда этот сброс надо делать либо от кнопки, что не всегда возможно, либо специально ставить микросхему сброса в духе RC-цепочки, что, как я думаю, тоже неправильно, ПЛИС должна быть самодостаточна (в разумных пределах). Конечно можно использовать виртуальные пины, но это уже костыли.

Сделайте синхронный сброс. Или просто опишите правильно схему.

Однако, почему второй код рабочий - непонятно.

Как раз тут всё понятно. Его логика в первом примере такая: из состояний 2 и 3 в 0 или 1 никак не попадешь. Поэтому так как нет сброса, то можно предположить, что начинаем во 2 или 3 и поэтому оптимизируем состояния 0 и 1.

Во втором случае состояние 0 оптимизировать нельзя, так как в него можно попасть. А в 1 можно попасть из 0.

 

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


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

я-таки стесняюсь спросить, а зачем он вам такой нужен?

таблица синусов очень распространенное назначение.

мне нужен чтобы развернуть времянку управления ICAP там 78 команд по 18 бит, что их в регистрах хранить.

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

 

 

Начиная с 10 версии Квартусы какие-то нехорошие пошли, глючные и тормознутые, хотя 13-15 не пробовал.

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

 

 

Как раз тут всё понятно. Его логика в первом примере такая: из состояний 2 и 3 в 0 или 1 никак не попадешь. Поэтому так как нет сброса, то можно предположить, что начинаем во 2 или 3 и поэтому оптимизируем состояния 0 и 1.

Во втором случае состояние 0 оптимизировать нельзя, так как в него можно попасть. А в 1 можно попасть из 0.

Да как раз ничего не понятно

1 автомат: 0 - 1 - 2 - 3 - 2 - 3...

2 автомат: 0 - 1 - 2 - 2 - 2 - 2...

 

и в обоих есть дефалт, конечно в 1 сучае дефалт недостижим потому что все состояния заняты, и переход в 0 явно отрезается. Но и во втором случае дефолт недостижим, так как нет перехода в него. Так что единственное здравое объяснение поведения - это некорректное решение по оптимизации синтезатора. И получается он рассматривает схему с начальным состоянием 11 почему-то, только так можно объяснить почему он выкинул 0, 1 состояние, и почему он считает что State[1] зажать на питание.

 

 

Тогда этот сброс надо делать либо от кнопки, что не всегда возможно, либо специально ставить микросхему сброса в духе RC-цепочки, что, как я думаю, тоже неправильно, ПЛИС должна быть самодостаточна (в разумных пределах). Конечно можно использовать виртуальные пины, но это уже костыли.

Вот тут вы не правы, у вас наверняка в ПЛИС есть PLL и внешний клок. Всей этой байде надо настроиться и начать считать и выдавать правильный, ровный клок. Даже если нет PLL все равно генератору надо раскачаться, у многих плис после загрузки конфигурации есть возможность выбрать задержку до появления сигнала готовности.

Это все не спроста. Чтобы вся схема в ПЛИС начала корректно работать, ей нужен общей правильный старт.

 

В блоке ПЛЛ - есть сигнал LOCK, в добавок к этому сигналу надо сделать маленький счетчик, который получив сигнал LOCK досчитает по клоку до какого-то значения, и снимет сброс со всей схемы. Это стандартное и правильное решение. В итоге у вас вся схема стартанет разом, по нормальному клоку, из понятного состояния. Можно в целом и по LOCK сразу без счетчика сбрасываться, но в начальный момент на некоторых ПЛИС он может беситься...

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


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

Да как раз ничего не понятно

1 автомат: 0 - 1 - 2 - 3 - 2 - 3...

2 автомат: 0 - 1 - 2 - 2 - 2 - 2...

 

и в обоих есть дефалт, конечно в 1 сучае дефалт недостижим потому что все состояния заняты, и переход в 0 явно отрезается. Но и во втором случае дефолт недостижим, так как нет перехода в него. Так что единственное здравое объяснение поведения - это некорректное решение по оптимизации синтезатора. И получается он рассматривает схему с начальным состоянием 11 почему-то, только так можно объяснить почему он выкинул 0, 1 состояние, и почему он считает что State[1] зажать на питание.

Я могу только предполагать, но, возможно, он решил, что ему легче начать с состояния 2 или 3 так как описания сброса не было. А default он отбросил по понятным причинам.

 

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


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

интересно, а если в исходном коде написать

 

output reg [1:0]State = 0,

 

то есть явно задать начальное значение, что будет...

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


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

интересно, а если в исходном коде написать

 

output reg [1:0]State = 0,

 

то есть явно задать начальное значение, что будет...

Я не уверен, что это корректный синтаксис (никогда не видел такого). Может, в initial? А лучше сделать нормальный сброс.

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


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

.... Но вроде, если ничего не путаю, Альтера гарантирует, что в начале работы все триггеры будут в нуле.

Могли бы указать, где это у Альтеры прописано.

 

На всякий случай, может пригодится. Для сброса, например софт-процессора, подходит сигнал locked от мега-функции ALTPLL. Проверено много раз.

 

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


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

Я не уверен, что это корректный синтаксис (никогда не видел такого). Может, в initial? А лучше сделать нормальный сброс.

 

я не могу точно отослать к главам стандарта, но вроде бы

 

reg [15:0] MyReg = 0;

и

reg [15:0] MyReg;
initital begin
  MyReg = 0;
end

Эквивалентны.

 

во всяком случае ISE и Квартус одних из последних версий на это не ругаются, и задают значения регистров. как просили, естественно можно и не 0. Можно ли это сразу задать в скобках модуля я не верен, потому что в скобках я всегда объявляю только имена, а уже входы, выходы, регистры, я расписываю ниже.

 

Я даже где то видел упоминание что

wire [15:0] MyWire = signal;

эквивалентно заданию через assign, но на это у меня синтезатор ругнулся, и я не стал копать, возможно это уже систем верилог.

 

Для сброса, например софт-процессора, подходит сигнал locked от мега-функции ALTPLL. Проверено много раз.

да собственно использования этого сигнала для сброса рекомендуется и в описании, и если я не ошибаюсь для альтеры там еще дано уточнение что надо сделать некую задержку, потому что первое время этот сигнал несколько раз появляется и пропадает, так как PLL настраивается. В ксалинксе для сброса проца модулю еще дополнительно выжидает паузу, думаю у альтеры тоже.

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


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

Но вроде, если ничего не путаю, Альтера гарантирует, что в начале работы все триггеры будут в нуле.
Не гарантирует. Смотрим вашу опцию 'Power-Up don't care':

A logic option that causes registers that do not have a Power-Up Level logic option setting to power up with a don't care logic level (X). When Power-Up Don't Care is turned on, the Compiler determines when it is beneficial to change the power-up level of a register to minimize the area of the design.
Т.е. у вас State изначально в X, а не в 0.

If this option is turned on, the register powers up with the logic level most appropriate for the design

И синтезатор имел полное право стартануть автомат из любого состояния (что он и сделал)

 

http://quartushelp.altera.com/14.0/mergedP...p_dont_care.htm

 

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


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

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

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

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

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

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

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

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

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

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