Golikov 0 Posted September 30, 2016 · Report post Всем привет! Есть описания вида always @(posedge clk) begin if(....) reg <= input; else reg <= reg; end или эквивалент always @(posedge clk) begin reg <= reg; if(....) reg <= input1; if(....) reg <= input2; ..... end Кто знает зачем используется явное указание что без выполнения условий reg <= reg, то есть как бы сохраняет свое значение? У меня есть теория что это перенесенное из описания типа always @(en, input) begin if(en) reg <= input; else reg <= reg; end что в них используется как способ защиты от лачей, и утянуто в синхронную схему просто потому что уже забыли зачем оно было нужно... Но может есть еще аргументы? Кто что знает про это? Quote Ответить с цитированием Share this post Link to post Share on other sites
Jackov 0 Posted September 30, 2016 · Report post "reg <= reg" можно и не писать, компилятор сам догадывается что регистр должен хранить своё значение. В Квартусе так по крайней мере. Quote Ответить с цитированием Share this post Link to post Share on other sites
Golikov 0 Posted September 30, 2016 · Report post Спасибо кэп:) Вопрос не в том что получиться из схемы. Вопрос откуда это взялось, кто это придумал, и зачем.... Quote Ответить с цитированием Share this post Link to post Share on other sites
Jackov 0 Posted September 30, 2016 · Report post Вопрос не в том что получиться из схемы. Вопрос откуда это взялось, кто это придумал, и зачем.... Ну я, по наивности своей, думаю это для удобства чтения: хош - пиши для ясности, хош - не пиши для краткости. Quote Ответить с цитированием Share this post Link to post Share on other sites
Inanity 0 Posted September 30, 2016 · Report post Такой код может встретиться у людей, которые таким образом пытаются бороться с latch-ами, не понимая причину их образования. Корректно описанная схема не требует такой избыточности и latch-ей в ней не будет. Quote Ответить с цитированием Share this post Link to post Share on other sites
Golikov 0 Posted September 30, 2016 · Report post ну строго говоря в описании под клоком латча не будет даже если описывать схему некорректно... Ну то есть Вы тоже считаете что это просто перенесенный прием без понимания смысла происходящего. У кого еще есть какие мнения? Quote Ответить с цитированием Share this post Link to post Share on other sites
Kopart 0 Posted October 1, 2016 · Report post Ну то есть Вы тоже считаете что это просто перенесенный прием без понимания смысла происходящего. У кого еще есть какие мнения? Такой прием породит уже явный latch для сохранения состояния сигнала при описании в always_comb. Так что это предположение выглядит странным. Другое дело, если это огрызок от описания, в котором разделяется комбинационное присвоение в always_comb и присвоение в отдельном always_ff Но тогда там в always_comb должно быть именно сохранения сигнала с триггера: ... else reg_comb = reg_ff; Quote Ответить с цитированием Share this post Link to post Share on other sites
Inanity 0 Posted October 1, 2016 (edited) · Report post Такой прием породит уже явный latch для сохранения состояния сигнала при описании в always_comb. Так что это предположение выглядит странным. Именно. Просто немного не так выразился. Чтобы latch-а не было требуется доопределить все состояния регистра в случае использования case или if. Вот народ и начинает писать reg <= reg. Во-первых, это не имеет вообще никакого смысла для синхронных блоков, а для комбинационных генерирует всё тот же latch. Что так: module top ( input wire ena, input wire din, output wire dout, input wire clk ); reg data; assign dout = data; always @* begin if (ena) begin data <= din; end end endmodule Что этак: module top ( input wire ena, input wire din, output wire dout, input wire clk ); reg data; assign dout = data; always @* begin if (ena) begin data <= din; end else begin data <= data; end end endmodule В обоих случаях будет latch, т.к. в первом варианте регистр сохраняет значение неявно, во втором явно. Чтобы latch-a не было, можно сделать хотя бы так: module top ( input wire ena, input wire din, output wire dout, input wire clk ); reg data; assign dout = data; always @* begin if (ena) begin data <= din; end else begin data <= 1'b1; // 1'b0 end end endmodule Edited October 1, 2016 by Inanity Quote Ответить с цитированием Share this post Link to post Share on other sites
Kopart 0 Posted October 1, 2016 · Report post always @* begin if (ena) begin data <= din; Плохо написано. Используйте в комбинационных блоках только блокирующее присваивание. Это избавит от многих потенциальных проблем в симуляции. Quote Ответить с цитированием Share this post Link to post Share on other sites
Shivers 0 Posted October 1, 2016 · Report post Всем привет! Есть описания вида always @(posedge clk) begin if(....) reg <= input; else reg <= reg; end Нормальный код, хотя обычно нижние две строки опускают как само собой разумеющееся или эквивалент always @(posedge clk) begin reg <= reg; if(....) reg <= input1; if(....) reg <= input2; ..... end Это кривой код, поскольку производится два параллельный присваивания. Компилятор на этот код должен вывалиться с ошибкой. Кто знает зачем используется явное указание что без выполнения условий reg <= reg, то есть как бы сохраняет свое значение? Именно потому, что в железе триггер сохраняет свое значение. Об этом уже писали выше. Тул понимает определенные конструкции языка как триггер, а определенные как латч. Этого достаточно, чтобы хорошо писать RTL. При этом язык позволяет писать и какие то промежуточные конструкции, трактовка которых разными тулами заранее неизвестна. Но зачем это делать? Если ваша цель - железо, то пишите как правильно. Или Вы пишете диссертацию на тему как получить проблему из ничего? Про "способ защиты от латчей" вообще очень странная фраза. Если использовали конструкцию триггера - будет триггер, если описали латч - будет латч. А если в коде нечто непонятное, то нужно не от латчей защищаться, а брать и читать учебник. Quote Ответить с цитированием Share this post Link to post Share on other sites
Serhiy_UA 0 Posted October 1, 2016 · Report post always @(posedge clk) begin if(....) reg <= input; else reg <= reg; end По мне все правильно, хотя напоминает всего лишь обратный перевод от always @(posedge clk) reg <= (....) ? input : reg То есть на входе регистра ставится коммутатор 2 в 1, что избавляет от возможных гонок при синхронизации одним общим clk. Подразумевается, что это только малая часть от какой-то схемы. Quote Ответить с цитированием Share this post Link to post Share on other sites
Golikov 0 Posted October 2, 2016 · Report post Плохо написано. Используйте в комбинационных блоках только блокирующее присваивание. Это избавит от многих потенциальных проблем в симуляции. это нюансы, разговор о другом В обоих случаях будет latch, т.к. в первом варианте регистр сохраняет значение неявно, во втором явно. запись на вход выхода - это не лачь, а имитация лача. В ксалинксе есть такой техблок лачь и потому разводиться в лачь. А в альтере, например, тех блока лачь нету, и он даже в случае описания "честного" лача делает блок с заводом выхода на вход для сохранения значения. так что описание с else reg = reg это более строгое описание того что вы хотите при отсутствии технологического элемента. Чтобы latch-а не было требуется доопределить все состояния регистра... чтобы не было латча надо описывать не латч, это единственное что спасет:) Нормальный код, хотя обычно нижние две строки опускают как само собой разумеющееся Вы смогли прочитать и понять вопрос? попробуйте еще разок Это кривой код, поскольку производится два параллельный присваивания. Компилятор на этот код должен вывалиться с ошибкой. Компилятор, а на самом деле синтезатор в отличии от кое кого знает стандарт и потому вместо вываливания с ошибкой реализует правильный результат по стандарту. Самое смешное что проверить что будет надо минут 5, но нет.... Про "способ защиты от латчей" вообще очень странная фраза. Если использовали конструкцию триггера - будет триггер, если описали латч - будет латч. А если в коде нечто непонятное, то нужно не от латчей защищаться, а брать и читать учебник. про учебник неплохо сказано, рекомендую Вам последовать своей рекомендации ;) Если интересно могу пояснить зачем это делают, но это выходит за рамки данного вопроса. Quote Ответить с цитированием Share this post Link to post Share on other sites
quarter 0 Posted October 2, 2016 · Report post это нюансы, разговор о другом нифига себе нюансы. по такому плохо написанному коду следует вывод о том, что человек, писавший такой код - "плавает", плохо понимает матчасть, и как следствие, от него можно ожидать любой "лепнины", в том числе в виде reg <= reg, в тех местах, где он сомневается, как правильно описать блок. Never attribute to malice that which can be adequately explained by stupidity. Quote Ответить с цитированием Share this post Link to post Share on other sites
Golikov 0 Posted October 2, 2016 · Report post То есть на входе регистра ставится коммутатор 2 в 1, что избавляет от возможных гонок при синхронизации одним общим clk. Подразумевается, что это только малая часть от какой-то схемы. то есть по вашему для записи вида always @(posedge clk) reg <= input; есть возможные гонки при синхронизации общим клоком? Поясните вашу мысль, я что-то не понял что вы имеете ввиду... по такому плохо написанному коду следует вывод о том, что человек, писавший такой код - "плавает" то что человек плавает видно не по этому, а по тому что он использует конструкцию вида reg <= reg; под клоком. Но вопрос в другом откуда это пошло. Я уже несколько раз видел рекомендации так делать, но те с кем я мог поговорить отвечали меня так научили, а зачем не знаю... Вот и хочется узнать кто учил он чем руководствовался, я более чем уверен что это какой-то ошибочный перенос, просто хочется узнать откуда ноги растут ведь всякое бывает, может среда какая-то иначе не понимала... нифига себе нюансы. и не будьте так категоричны насчет того что можно использовать только = для комбинаторики, ровно как что можно использовать только <= под клоком. Можно всякое, особенно если знаешь что делаешь:) Quote Ответить с цитированием Share this post Link to post Share on other sites
ViKo 0 Posted October 2, 2016 · Report post Проблема не стоит выеденного яйца. Запись лишняя, от неграмотности. Что еще неясного? Quote Ответить с цитированием Share this post Link to post Share on other sites