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

Непрерывное присвоение на Verilog

SMПоддерживаю dxp в том, что неудобно лезть в объявление переменных и менять wire на reg. Да, Вы говорите что поменять объявление всего несколько секунд. Но тут всплывают те же тезисы, что и в холиваре между тоннами писанины на VHDL и краткостью Verilog: не сама писанина страшна, это действительно всего несколько лишних нажатий на клавиатуре. Пугает чисто психологический момент (возвращаемся обратно к wire и reg): вот, надо из текущего положения исходника куда-то лезть в его начало, выискивать там этот злополучный сигнал и менять его объявление. А затем возвращаться обратно и искать то положение в тексте, над которым я работал, которое было на экране. В результате даже мысль можно потерять из-за таких переключений внимания. И тогда можно наделать ещё больше неочевидных системных ошибок (которые тоже не обнаруживаются синтезатором как ошибки), чем ошибка в наличии/отсутствии задержки сигнала на такт.

 

...

 

У некоторых есть ещё привычка ставить перед сигналом префикс его объявления типа w_my_signal или r_my_signal. Я вот тоже против таких префиксов, т.к. потом при необходимости изменения объявления придётся все сигналы заменять. Пусть и автозаменой. Но я ей не доверяю на 100%, боюсь, что что-то лишнее в общем случае может попасть под паттерн, поэтому стараюсь автозамены не делать либо делать их с подтверждением вручную по каждой замене, анализируя, что же предлагается заменить. А это уже небыстро...

 

По первому тезису: в любом прогерском редакторе есть закладки. Поставил - и бац, всегда можно в один клик вернуться назад. Либо в два клика, если закладок несколько.

По второму тезису: за почти 15 лет использования редакторами автозамена не подвела ни разу. ЧЯДНТ?

 

Примкну к армии SM в плане способа описания FSM, т.к. читать две простыни дюже неубоднее, чем одну (да еще и перескакивать между ними, уточняя что конкретно делается в том или ином состоянии). И тут снова на помощь приходит любой прогерский редактор: поставил курсор на переменную state - и он подсветил тебе все строчки с ее участием. Или на конкретное состояние - и сразу видно откуда и кто в него приходит. Примеры с выделением ниже.

 

post-1437-1423811859_thumb.png

post-1437-1423811865_thumb.png

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


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

По первому тезису: в любом прогерском редакторе есть закладки. Поставил - и бац, всегда можно в один клик вернуться назад. Либо в два клика, если закладок несколько.
Всё равно лишние телодвижения. К тому же перешли Вы только к началу блока описания сигналов, а там ещё всматриваться надо, где нужный вам сигнал. Я прогерский редактор не использую, сижу в notepad++. В любом случае бесполезное отвлечение (которого могло не быть вообще) может стоит вам ошибки из-за переключения внимания (хоть и наненадолго).

 

 

По второму тезису: за почти 15 лет использования редакторами автозамена не подвела ни разу. ЧЯДНТ?
Условно: я за 36 лет ни разу не болел водянкой. ЧЯДНТ? Это у Вас не аргументы, что вот ни разу, и всё тут. Я же пишу, что может попасться паттерн, что захватит лишние замены. И опять же лишние телодвижения, которых могло не быть вообще. Опять же отвлечение.

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


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

Всё равно лишние телодвижения. К тому же перешли Вы только к началу блока описания сигналов, а там ещё всматриваться надо, где нужный вам сигнал. Я прогерский редактор не использую, сижу в notepad++. В любом случае бесполезное отвлечение (которого могло не быть вообще) может стоит вам ошибки из-за переключения внимания (хоть и наненадолго).

 

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

 

По поводу автозамены: в нотпаде++ есть multiedit - редактируете переменную в одном месте, а вслед за Вами автоматически редактируются все эти же переменные по всему исходнику. И не надо никакой автозамены. (http://notepad-plus-plus.org/features/multi-editing.html)

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


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

Всё равно лишние телодвижения. К тому же перешли Вы только к началу блока описания сигналов, а там ещё всматриваться надо, где нужный вам сигнал. Я прогерский редактор не использую, сижу в notepad++. В любом случае бесполезное отвлечение (которого могло не быть вообще) может стоит вам ошибки из-за переключения внимания (хоть и наненадолго).

Сижу в Notepad++, пользуюсь закладками, выделяю нужные слова. В-общем, много чего есть в нем.

Я же пишу, что может попасться паттерн, что захватит лишние замены.

Тоже боюсь изменять автоматически, но делаю. Иногда изменяю по мере обнаружения. Лишних переименований не помню. P.S. Тем более, пользуюсь системой контроля версий, всегда могу вернуть назад.

О, про мультиэдит не знал.

Еще работаю в двух окнах. Очень удобно в одном смотреть, в другом редактировать. Потом наоборот.

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


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

мультиедит - это лазить по всему исходнику и кликать мышкой с контролом в нужных местах - гимор, если исходник приличный. Автозамена всё же проще.

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


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

Примкну к армии SM в плане способа описания FSM, т.к. читать две простыни дюже неубоднее, чем одну

Судя по скриншотам, это "примыкание" к теме-то не относится... Разговор шел о разделение FSM на комбинаторную часть отдельно, а регистровую - отдельно. А у вас тут просто перемешивание тела автомата с тем, чем он управляет. Это - другая тема. Плюс - да, удобство понимания, все сразу наглядно видно. Да и писать проще и меньше. Минус - что нельзя корректно описать асинхронный сброс, если он нужен только части регистрам, а так бывает чаще всего, так как асинхронной инициализации подлежат обычно лишь малая часть из всей кучи, остальные инициализируются уже самим автоматом. То есть, к примеру, регистр с данными не надо сбрасывать (без разницы, что в нем было до старта работы), а вот сигнал управления запросом на чтение - надо. Да и синхронный, тоже... Его описание приводит к тому, что разводится сигнал запрещения работы регистрам, сброса не требующим, на время сброса.

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


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

в нотпаде++ не хватает, тыкнуть правой кнопкой и вызвать меню найти определение... ну очень не хватает. А вдруг есть и я просто не знаю?

 

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

 

мультиедит - не совсем то, больше он подходит для вертикальной правки...

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


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

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

 

Грязный хак, не входящий в фициальные language templates, но работающий, и у Xilinx и у Altera, насколько я помню:

process(clk, arst)
if rising_edge(clk) then
   q0 <= a;
   q1 <= b;
end if;
if arst = '1' then
   q0 <= '0';
end if;
end process;

 

Впрочем сам так делать боюсь :)

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


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

Грязный хак

Вот это редкий плюс VHDL-я. На верилоге так не получается... так как там:

 

   always @(posedge clk or posedge rst)
   if (rst) begin
     fsm <= FSM_IDLE;
     nCE <= 1'b1;
   end else case (fsm)
        STATE_XXX: begin
                               fsm <= STATE_YYY;
                               nCE <= 1'b0;
                               data_reg <= in_data;
                           end
   endcase

 

В результате таких вот вещей резет разводится корректно, а вот регистр "data_reg" получает в свой сигнал enable добавку в виде !reset.... А, чтобы без этой добавки, не получается...

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


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

В результате таких вот вещей резет разводится корректно, а вот регистр "data_reg" получает в свой сигнал enable добавку в виде !reset.... А, чтобы без этой добавки, не получается...

Это зависит от синтезатора. Я когда-то сравнивал xst, synplify и quartus вот как раз на эту тему. Кто-то из них заводил сброс на enable, а кто-то нет. Кто именно, не помню, давно дело было. С тех пор могло что-то поменяться. Ну и VHDL, да.

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

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


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

Это зависит от синтезатора. Я когда-то сравнивал xst, synplify и quartus

 

У меня это synplify делает. Самый современный, идущий с последним Diamond.

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


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

а ресет без else нельзя так как он асинхронный?

 

а если data_reg <= in_data; поставить и там и там?

 

 

always @(posedge clk or posedge rst)
   if (rst) begin
     fsm <= FSM_IDLE;
     nCE <= 1'b1;
     data_reg <= in_data;
   end else case (fsm)
        STATE_XXX: begin
                               fsm <= STATE_YYY;
                               nCE <= 1'b0;
                               data_reg <= in_data;
                           end
   endcase

 

по идее теперь оно от reset не зависит и его с енайбла должны убрать?

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


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

по идее теперь оно от reset не зависит и его с енайбла должны убрать?

 

Да щас. Вы описали асинхронную загрузку in_data в регистр data_reg по сигналу reset. От этого схему вокруг этого регистра может разнести аж втрое, если нет такого железного триггера с такой загрузкой. А без else нельзя, так как, по аналогии с VHDL, нельзя написать потом if rising_edge(clk)

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


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

Если взять за основу freescale или cisco стандарты...

 

Если не сложно, можете дать ссылки на эти стандарты?

Спасибо!

 

UPD Понял, это про coding style. Тогда не нужно, это легко находится :)

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


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

Да щас. Вы описали асинхронную загрузку in_data в регистр data_reg по сигналу reset. От этого схему вокруг этого регистра может разнести аж втрое, если нет такого железного триггера с такой загрузкой. А без else нельзя, так как, по аналогии с VHDL, нельзя написать потом if rising_edge(clk)

 

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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