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

как быстро вникнуть в чужой код

на IXBT оказались дизайнеры лучше. Они видать работали и им некогда было глупостями маятся:)...

Я вот тоже так подумал, кто будет решать дурацкие задачки? Правильно, только дураки:).

вопрос о том где описано поведение while остается открытым...

 

как-то уж очень чуднО выходит.

 

как только d1 становится 1, мы проваливаемся в while и сидим там пока оно не станет 0, это ок.

как только к d1 добавляется d2, мы проваливаемся во второй while и сидим там, даже если первый while перестал выполняться, то есть даже когда d1 стало обратно 0.

И также с 3 while, и как только мы провалились в него q начинает молотить... и теперь даже если убрать d1 и d2 ничего не остановится...

Поведение вериложного while в этом смысле нисколько не отличается от поведения сишного, всё очень просто.

 

Ещё один способ обеспечить симулируемость без полного перелопачивания алгоритма - это добавить ожидания по сигналам:

module tst1(
    output reg q=0,
    input d1, d2, d3, clk
);
    always
        @(d1) while(d1)
            @(d2 or ~d1) while(d2)
                 @(d3 or ~d2) while(d3)
                    @(posedge clk)
                        q <= ~q;
endmodule

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


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

"Бой" устроил в ответ на это: http://forum.ixbt.com/topic.cgi?id=48:9544-67#2035

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

 

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


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

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

 

Поведение вериложного while в этом смысле нисколько не отличается от поведения сишного, всё очень просто.

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

 

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


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

@(d2 or ~d1) while(d2)

 

А в чем, если не секрет, суть инверсии d1 внутри @(), если нету ни posedge, ни negedge ?

 

PS

Интересная задачка была на развитие мозгов в правильном направлении понимания языка. Жаль, только с отпуска прилетел... Уже все всё решили, осталось только посмотреть на готовенькое.

 

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


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

А в чем, если не секрет, суть инверсии d1 внутри @(), если нету ни posedge, ни negedge ?

Это я путаюсь между VHDL и Verilog. В VHDL в подобной конструкции будет завершение ожидания по уровню, а в Verilog - только по обоим фронтам. Тогда этот код неправильный, а правильно как-то так:

module tst1(
    output reg q=0,
    input d1, d2, d3, clk
);
    always begin
       if(!d1) @(d1);
       while(d1)begin
            if(!d2) @(d2 or d1);
            while(d2)begin
                 if(!d3) @(d3 or d2);
                 while(d3)
                    @(posedge clk)
                        q <= ~q;
            end
       end
    end
endmodule

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


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

Правильный, просто "~" внутри "@(...)" лишние.

Неправильный, так как он не предотвращает зацикливание while, который, в отличие от always, не будет ждать следующего дельта-цикла перед повтором. Правильней так:

module tst1(
    output reg q=0,
    input d1, d2, d3, clk
);
    always begin
       if(!d1) @(d1);
       while(d1)begin
            if(!d2) @(d2 or negedge d1);
            while(d2)begin
                 if(!d3) @(d3 or negedge d2);
                 while(d3)
                    @(posedge clk)
                        q <= ~q;
            end
       end
    end
endmodule

Нужны if-ы или нет, не совсем очевидно, лучше не рисковать:).

 

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


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

Тут, помимо q, извращённым способом определены ещё 3 триггера, назову их d1t,d2t,d3t(у каждого выход .q), условия установки/сброса следующие:

d3t.reset = ~d3 && posedge clk

d3t.set = d2t.q && d3

d2t.reset = ~d2 && ~d3.q

d2t.set = d1.q && d2

d1t.reset = ~d1 && ~ d2.q

d1t.set = d1

Сплошная асинхронщина, в некоторых ПЛИС нет RS триггеров, придётся на LE слепить:).

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

У меня неправильно в tst2(): условия установки/сброса "повторно" должны проверяються не раньше, чем будет "пройден" весь always.

А тут правильно.

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

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


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

egorman44

Знакомая ситуация :(. Долго, муторно и, зачастую, бессмысленно. Но вариантов нет.

Вам привели хороший пример про ручку и карандаш, и про то, то нужно время.

IMHO, необходимо (последовательно):

- выделить ВСЕ сигналы и процессы в таблицу;

- в таблицу внести столбики куда сигналы входят, откуда и куда идут с кратким описанием Вашего понимания их назначения;

- нарисовать блок-схему устройства и перенести (физически скопировать в квадратики) на неё код (как САПР);

- нарисовать машины состояний;

- нарисовать диаграммы изменения сигналов;

- нарисовать временные диаграммы сигналов;

- написать тест-бенч и проверить правильность работы RTL;

- создать контрольные примеры;

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

После постараться дать "пинка под зад" руководителю, поскольку если проект не документирован и без контрольных векторов, то это не руководитель. Совсем.

Этот ответ мне понравился больше всего, только хочу дополнить, чтобы автоматизировать процесс...

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

Любой проект имеет набор тестбенчей, которые позволяют увидеть во времени взаимодействие полученных квадратиков(модулей). Тогда в Модел-Симе можно уточнить для себя нюансы поведения любого составляющего. Если этого нет,- придется написать бенч самому, основываясь на том ТЗ, что был изначально.

Только пройдя этот путь можно быть уверенным в понимании логики, а значит и возможности смены кода на свой. К тому же тест-бенч уже под рукой! =)

 

Кстати, (для ленивых) в Моделсиме можно на ходу менять руками некоторые состояния(тоже не помню точно, а глянуть тут не могу). Бывает очень выручает...

...Если есть железо под рукой, есть отличная возможность под JTAGом смотреть реальные процессы исследуемого кода. В крайнем случае,- выводить сигналы на контрольные пины (их закладывают с запасом для контрорля осцилографом=) и частенько для подпаек добавленных компонент к макету)

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


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

Следствием этих мучений может быть собственный опыт при создании нового проекта. Я лично по ходу написания проекта в произвольной форме пишу текст, где отражаю ключевые моменты. Как можно подробнее. В итоге, через какое-то время, этот текст становится огромной ценностью. Даже для себя =). Уже чистовик в конце пишется легче и приятнее. "Делть нужно все вовремя!"

Если бы такие черновики оставались от каждого,- экономия сил была бы колоссальной!

 

Не ленитесь! Следите, чтобы свой код не стал "чужим"!

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


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

понять ТЗ;

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

в процессе "вкуривания" комментировать код;

 

Помогают еще разные фичи тулов: просмотр иерархии, схематик вью...

Имея хорошее покрытие тестами, вносить изменения не так боязно.

 

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


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

Хм...

Я в подобных случаях для не знакомых мне VHDL-проектов (желательно рабочих) пользуюсь инструментом в ActiveHDL,- CODE2GRAPHICS conversion Wizard.

В итоге можно будет глянуть функциональную блок-схему со связями с понятной иерархией.

Так легче потом разбираться...

 

.....А вообще HDL можно ли назвать программированием?

Я всегда для программистов контроллеров объясняю, что мы пишем свои пожелания и не факт, что именно так оно и будет реализовано. Да и этап оптимизации проекта у классических программеров отсутствует.

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


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

Ни разу не vhdl-программист, но вот сейчас закупаем Sigasi studio, которая очень уж удобная - вот там между кодом и графами скакать оперативно да разбираться в коде самое оно для целей топикстартера! Можно бесплатную демо-версию у них запросить, дают без проблем.

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


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

Ни разу не vhdl-программист, но вот сейчас закупаем Sigasi studio, которая очень уж удобная - вот там между кодом и графами скакать оперативно да разбираться в коде самое оно для целей топикстартера! Можно бесплатную демо-версию у них запросить, дают без проблем.

Я делал попытку год назад обзавестись. У меня они постоянно в рассылке. И что, теперь можно сделать еще попытку? попробую... Спасибо!

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


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

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

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

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

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

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

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

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

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

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