RobFPGA 27 4 сентября, 2019 Опубликовано 4 сентября, 2019 · Жалоба Приветствую! 5 hours ago, nice_vladi said: Больше двух выражений в условных операторах if-else - нечитабельно; Вполне читабельно, а если еще и форматировать в несколько строк if ( (var1==aaa) && (var2>=bbb) .... ) begin .... end 2 hours ago, yaghtn said: Лично мне не нравится, что эти две if-конструкции выполняются параллельно, когда желательно чтобы они были взаимоисключающими. Они лишь так выглядят, на самом деле приоритет у нижнего if выше. Очень удобно бывает чтобы не писать развесистые if ... else if ... else конструкции. Но на самом деле разговор ни о чем - очень даже может быть что приведенный код писан не человеком, а сгенерирован автоматом из какого нибудь граф представления схемы. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 4 сентября, 2019 Опубликовано 4 сентября, 2019 (изменено) · Жалоба 45 minutes ago, yaghtn said: Я бы переписал логику первого блока, если не трогать именование, например так: Ну так попробуйте синтезировать эти два варианта и сравните. Как по мне, так не стоит тащить методики из гвидопыха, который настолько медленный, что в нём не имеет смысла бороться за производительность, в RTL, где коммутатор вставленный вместо пары AND-OR'ов прекрасно улучшит читаемость за счёт времени пропагации. Изменено 4 сентября, 2019 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yaghtn 0 4 сентября, 2019 Опубликовано 4 сентября, 2019 · Жалоба 2 hours ago, one_eight_seven said: коммутатор вставленный вместо пары AND-OR'ов прекрасно улучшит читаемость за счёт времени пропагации Хм. Видимо, мне нужно подготовить что-то более весомое, чем анекдот "преждевременная оптимизация - корень всех зол". Вы настолько явно кладёте на разные чаши весов читаемость и быстродействие, что спасибо за науку Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 5 сентября, 2019 Опубликовано 5 сентября, 2019 · Жалоба 17 hours ago, yaghtn said: Лично мне не нравится, что эти две if-конструкции выполняются параллельно, когда желательно чтобы они были взаимоисключающими. Как уже отметил RobFPGA тут все однозначно и по другому быть не может. В стандарте все это разобрано по полочкам. 17 hours ago, yaghtn said: И ещё, блок кода 12-22 делает предположения о списке возможных состояний переменной state. Если сглючит, и state влетит в состояние отличное от sA sB, то блок перестанет работать вплоть до пересброса. Короче, я уверен что после всех case-условий нужно добавлять default.. Ну раз вы уверены, то делайте так как вам удобнее. И повторюсь. Код абсолютно читаем, вся логика на поверхности, синтезируемость однозначная. Вы говнокода не видели. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 5 сентября, 2019 Опубликовано 5 сентября, 2019 (изменено) · Жалоба 13 hours ago, yaghtn said: Хм. Видимо, мне нужно подготовить что-то более весомое, чем анекдот "преждевременная оптимизация - корень всех зол". Вложенные if'ы - это тоже сущность плодящая ошибки и ухудшающая читаемость. Выше уже не один раз написали, что в примере код читаемый. Изменено 5 сентября, 2019 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба On 9/3/2019 at 9:24 AM, Mad_kvmg said: Вот Юрий Панчул рекомендует. https://habr.com/ru/post/465969/ Купил я это "счастье". В самой первой главе уже ошибки в коде! И некоторые неточности в пояснении работы. С пояснениями понятно - возможно перевод хромает (например сущность в SV wire - это провод! хоть бы сигналом назвали каким...). Но копипаст примеров кода! В котором ошибки! Это конечно полный атас! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба 29 minutes ago, Nick_K said: Купил я это "счастье". В самой первой главе уже ошибки в коде! И некоторые неточности в пояснении работы. С пояснениями понятно - возможно перевод хромает (например сущность в SV wire - это провод! хоть бы сигналом назвали каким...). Но копипаст примеров кода! В котором ошибки! Это конечно полный атас! эммм, мои телепатические способности слабы, можно скриншот про wire? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба 1 hour ago, des00 said: эммм, мои телепатические способности слабы, можно скриншот про wire? Вечером буду в пределах досягаемости книги - скину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба Скриншот про wire: И дополнительно скриншот с ошибкой в коде примера: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 11 hours ago, Nick_K said: Скриншот про wire: Прочитал, мне не понятно что вас удивляет. Речь идет про моделирование на вентильном уровне, и да, там действительно для соединения использовались провода с разными характеристиками: wire/wand/wor/tri/triand/trior/tri0/tri1 и длительное присваивание assign. Изначальное заложенное в верилог вентильное моделирование никуда не делось из стандарта. Просто смысла особого сейчас нет этим заниматься, когда есть поведенческое моделирование, но тем не менее, тут мне не понятно что вас так удивило. 11 hours ago, Nick_K said: И дополнительно скриншот с ошибкой в коде примера: Как бы ошибки в SV тут нет, есть не соответствие комментариев коду. Подозреваю что при верстке, пример был урезан. исчезло выше assign a = count[2] и b = count[1]. И была экономия на рецензорах, но тем не менее, опечатки они есть много где. Раньше, на корешке даже вклейки были, с указанием номера страницы и опечатки на ней) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 16 minutes ago, des00 said: Как бы ошибки в SV тут нет, есть не соответствие комментариев коду. Подозреваю что при верстке, пример был урезан. исчезло выше assign a = count[2] и b = count[1]. И была экономия на рецензорах, но тем не менее, опечатки они есть много где. Раньше, на корешке даже вклейки были, с указанием номера страницы и опечатки на ней) Если с проводами я и сказал, что непонятка - возможно там и вправду особый скрытый смысл. То вот с SV кодом - там точно ошибка. И если сделать пример, то постоянно будет выдаваться ошибка по условию muxOut != a (или muxOut != count[2]). Можете ради спортивного интереса написать пример. Самое главное, что в тексте оформлено всё правильно и первый if всегда будет проверять только наличие единицы на входе sel мультиплексора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 22 minutes ago, Nick_K said: Если с проводами я и сказал, что непонятка - возможно там и вправду особый скрытый смысл. То вот с SV кодом - там точно ошибка. И если сделать пример, то постоянно будет выдаваться ошибка по условию muxOut != a (или muxOut != count[2]). Можете ради спортивного интереса написать пример. Самое главное, что в тексте оформлено всё правильно и первый if всегда будет проверять только наличие единицы на входе sel мультиплексора. для этого мне нужен пример 1.5:) В том же Морелос Сарагоса "Искусство помехоустойчивого кодирования" куча ошибок в численных примерах кодирования/декодирования но это не мешает этой книге быть одной из базовых для быстрого вхождения в тему) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 39 minutes ago, des00 said: для этого мне нужен пример 1.5:) Да там просто перебор всех значений в цикле тестбенча. Тут сам смысл кода неправильный ибо нужно в begin...end заключить) Погляжу, если и дальше книга будет изобиловать ошибками - не уверен, что она станет моей настольной литературой (в отличии от тех же Харрис и Харрис). Но посыл мне понятен) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 1 hour ago, Nick_K said: Да там просто перебор всех значений в цикле тестбенча. Тут сам смысл кода неправильный ибо нужно в begin...end заключить) Да вроде корректно все. module test ; bit [2 : 0] count; bit muxOut; bit [3 : 0] cnt; initial begin forever begin #20s; cnt <= cnt + 1'b1; end end assign muxOut = cnt[2]; initial begin for (count = 0; count != 3'b111; count++) begin #10ns; if (count[0]) if (muxOut != count[1]) $display("pipa %b -> %b :: %b", cnt, muxOut, count); else if (muxOut != count[2]) $display("popa %b -> %b :: %b", cnt, muxOut, count); end $display("done"); end endmodule Quote # Refreshing D:/work_des00/prj_verilog/prj_coding/prj/work.test # Loading sv_std.std # Loading work.test # pipa 0001 -> 0 :: 011 # popa 0010 -> 0 :: 101 # done Все корректно. по сути проверка наличия значений 011 и x01 в переменной count. Ну либо контекст книги не соответствует примеру, но мы его не видим) UPD. Более корректно даже так, проверка значений {1'bx. !muxOut, 1'b1} и {!muxOut, muxOut, 1'b1} в последовательности чисел. Просто записано не обычно и begin end тут не нужен. т.к. после if должен быть одиночный операнд, а if else if else как раз таким и является. Но с точки зрения читаемости, вы правы, begin end тут не помешает. Даже три Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 58 minutes ago, des00 said: Да вроде корректно все. Я извиняюсь. Не указанный исходный весь код приводит к вот таким непоняткам. Там входной модуль + мой тестбенч имеет вот такой вид: Spoiler `timescale 1ns / 1ps // Code from book module mux_test( input a, input b, input sel, output muxOut); logic c; always_comb if (sel) c = b; else c = a; assign muxOut = c; endmodule // End code from book // synthesis translate_off module tb_mux; logic [2 : 0] count = '0; logic muxOut; mux_test dut( .a (count[2]), .b (count[1]), .sel (count[0]), .muxOut (muxOut)); initial forever #20ns count <= count + 1; initial begin for (count = 0; count != 3'b111; count++) begin #10ns; if (count[0]) if (muxOut != count[1]) $display("b isn't equal out: %b /= %b; \t select = %b", count[1], muxOut, count[0]); else if (muxOut != count[2]) $display("a isn't equal out: %b /= %b; \t select = %b", count[2], muxOut, count[0]); end $display("done"); $finish; end endmodule // synthesis translate_on Выход консоли следующий: a isn't equal out: 0 /= 1; select = 1 a isn't equal out: 1 /= 0; select = 1 Но если исправить условия в тестбенче чикла, то всё становится на свои места: ... for (count = 0; count != 3'b111; count++) begin #10ns; if (count[0]) begin if (muxOut != count[1]) $display("b isn't equal out: %b /= %b; \t select = %b", count[1], muxOut, count[0]); end else if (muxOut != count[2]) $display("a isn't equal out: %b /= %b; \t select = %b", count[2], muxOut, count[0]); end ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться