SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба IcarusVerilog выдает a=0 b=1 Согласно стандарту это вроде корректный результат. По факту евента "*" произошло следующее: вычисление RHS a<=b; тут результат 0, затем присваивание b=0, затем присваивание b=1, затем апдейт a вычисленным вначале RHS, нулем, затем печать результата a=0 и b=1 а потом уже следующий евент, который даст a=1 и b=1. Но это будет следующий... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба *не туда отправил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба У меня в тексте стандарта написан такой пример: // The assigned value of the reg is determinate У меня, вообще то, такой же, как и у Вас. Это видимо какие-то шутники стандарт поковыряли и выложили :) 2 Leka. В первом примере Вы там по ходу "гонки" (race condition) сделали, между олвейсом и инициализатором. IUS шутрее проинитил нулем, чем занес единичку из олвейса, тем самым облегчив себе жизнь, и выдав два нуля :) а во втором примере IUS тоже выдает два нуля.... Хм... убрал оба инициализатора, выдал a=x и b=x... Значит предположение верное - не было ни одно апдейт-евента, вот и always ни разу не исполнялся ни в одном из случаев. Хотя мне это не совсем понятно, по идее инициализатор должден был сделать апдейт-евент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба У меня, вообще то, такой же, как и у Вас. Это видимо какие-то шутники стандарт поковыряли и выложили :) Или, возможно, у Viko редакция 1995 года. :) Да, точно. Нашел стандарт 1995 года, скачал, проверил - там по-другому. :) Несколько страниц назад был переход с V в SV, а теперь, наоборот, откатились назад. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 26 марта, 2010 Опубликовано 26 марта, 2010 (изменено) · Жалоба А синтез выдает a=1 b=1, и в ISE, и в Квартусе. "initial #1 $finish;" --> Все случаи @* д/б выведены, те тогда надо ожидать: a=0 b=1 a=1 b=1 а этого нет... Изменено 26 марта, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба "initial #1 $finish;" --> Все входы @* д/б выведены, те тогда надо ожидать: a=0 b=1 a=1 b=1 а этого нет... А я никак не могу найти правила работы инициализатора при объявлении переменной. Сейчас... Ван момент. переделал инициализацию на initial - IUS все равно, хоть треснись, выдает a=0 b=0 и все. always не исполняет. Не понимаю. А круче него симулятора быть просто не может, самый сигноффнный из всех сигноффных... разобрался кажется. Точно разобрался. b=1, сделанное внутри always, делает активным этот же евент (вычисление блока begin..end), который и так сейчас активен. Поэтому он еще раз и не перезапускается. Поэтому вывод получается a=0 b=1. IUS по ходу немного глючный. Чтобы заставить его считать always пришлось удлинить время симуляции до 2 и инициализаторы поставить с #1. Если инициализаторы оставить с нулевым временем, то блок always не запускается вообще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Стандарт у меня 1995 года. Оттуда, откуда у всех :) Quartus скомпилировал, повесил на a и b по 1. Вот и гадайте теперь вместе с этим ...ным стандартом :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Да, точно. Нашел стандарт 1995 года, скачал, проверил - там по-другому. :) И это там причем явная банальная опечатка, исправленная в 2001. Потому как 5.4.1 пункт есть и в 1995-ом, и утверждает то же, что и в 2001, что есть гарантия последовательности. Можете в этом убедиться сами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Стандарт у меня 1995 года. Оттуда, откуда у всех :) Вам пора обновиться. И это там причем явная банальная опечатка, исправленная в 2001. Потому как 5.4.1 пункт есть и в 1995-ом, и утверждает то же, что и в 2001, что есть гарантия последовательности. Можете в этом убедиться сами. Верю на слово. :) Тем более ориентироваться на стандарт 1995 года, все равно, не стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Вам пора обновиться. Обновился :) Только как объяснить результат компиляции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Обновился :) Только как объяснить результат компиляции? А что Вы конкретно компилили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Обновился :) Только как объяснить результат компиляции? synthesis/simulation mismatch - обычное дело. Потому как одно дело моделирование описанного устройства под управлением программы-моделировщика, а другое - синтез. В 1364.1 - 2002 не один такой случай описан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Если Вы компили это: module tst( a, b ); output reg a=0; output reg b=0; always@* begin a <= b; b <= 0; b <= 1; end endmodule и получили обе единицы, то что Вас удивляет? Что Вы хотители получить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 26 марта, 2010 Опубликовано 26 марта, 2010 (изменено) · Жалоба always@* begin a <= b; b <= 0; b <= 1; $display("a=%b b=%b", a, b); end Виден вечный цикл симулятора. Изменено 26 марта, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Виден вечный цикл симулятора. Что вполне логично - отложенная на время после окончания evaluation event-а для блока begin..end (из-за неблокирующего присваивания) запись в b вызывает активацию вычисления всего блока заново, так как он чувствителен к записи в b, так как b использован как один из аргументов в RHS и евент описан "@*". А в блоке делается новая запись в b. ну и так до потери пульса. А Вы чего хотели? Поставив внутри блока запись в то, к чему чувствителен весь блок? Причем мгновенную запись, без "#1" хотя бы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться