des00 26 May 13, 2014 Posted May 13, 2014 · Report post Первый раз попробовал все сделать task-ами и generate-ами. В целом удобно и даже необходимо иногда. Но иногда не работает и хрен поймешь почему, тонкости, которые не заметишь сразу. если содержимое второй задачи запихать в первую, то работает некорректно, словно компилятор оптимизировал valid. Почему так, мне непонятно. 1. Приведите весь нерабочий код. 2. Вы учитываете то обстоятельство, что синтезируемый вами таск, полностью построен на блокирующих присваиваниях и их влияние на логику нужно учитывать ? Quote Share this post Link to post Share on other sites More sharing options...
torik 0 May 15, 2014 Posted May 15, 2014 · Report post Я думал, что блокирующее или неблокирующее присваивание имеет значение только для моделирования. Правильно я понимаю: always @(posedge clk) begin a <= b; a <= c; end always @(posedge clk) begin a = b; a = c; end В первом случае a= c, а во втором a = b? Раньше я никогда не использовал блокирущее присваивание, т.к. не понимал (и не понимаю) его сути. Что касается "приведите весь нерабочий код", что тут приводить: always @(posedge clk) begin s_obj_read(...) end always @(posedge clk) begin s_obj_read_reg(...) end Это работает always @(posedge clk) begin s_obj_read(...) s_obj_read_reg(...) end Это не работает. Quote Share this post Link to post Share on other sites More sharing options...
des00 26 May 15, 2014 Posted May 15, 2014 · Report post Я думал, что блокирующее или неблокирующее присваивание имеет значение только для моделирования. Вы ошибались :) Правильно я понимаю: always @(posedge clk) begin a <= b; a <= c; end always @(posedge clk) begin a = b; a = c; end В первом случае a= c, а во втором a = b? Раньше я никогда не использовал блокирущее присваивание, т.к. не понимал (и не понимаю) его сути. В обоих случаях a == c в результате. Этот пример не показателен. Показателен другой пример int a = 5, b = 10; always @(posedge clk) begin a <= b; b <= a; end always @(posedge clk) begin a = b; b = a; end в первом случае поведение по тактам будет такое a == 10, b == 5 a == 5, b == 10 a == 10, b == 5 во втором случае поведение по тактам будет такое a == 10, b == 10 a == 10, b == 10 a == 10, b == 10 над вторым вопросом надо подумать чуток ;) над вторым вопросом надо подумать чуток ;) у меня вызывает подозрение строки вот такого типа s.valid[5:0] = {s.valid[4:0], 1'b0}; посмотрите, скорее всего этого флага после синтеза нет и поэтому (s.valid[1] && s.on) не выполняется. Quote Share this post Link to post Share on other sites More sharing options...
torik 0 May 16, 2014 Posted May 16, 2014 · Report post у меня вызывает подозрение строки вот такого типа s.valid[5:0] = {s.valid[4:0], 1'b0}; посмотрите, скорее всего этого флага после синтеза нет и поэтому (s.valid[1] && s.on) не выполняется. это правда так. А почему? Насчет блокирующего присваивания нихрена не понял - кто кого блокирует? Quote Share this post Link to post Share on other sites More sharing options...
des00 26 May 16, 2014 Posted May 16, 2014 · Report post это правда так. А почему? сдается мне что это глюк синтезатора, а именно чую что при присвоении он рассматривает не весь вектор сразу,а побитно начиная с младшего. И в этом случае. там действительно будет вечный 0 Насчет блокирующего присваивания нихрена не понял - кто кого блокирует? Как-то мне даже стыдно отправлять вас учить матчасть ;) но вообще, если на пальцах, то считайте что блокирующее присвоение блокирует поток исполнения, до того момента, когда результат будет готов, тогда как неблокирующее идет дальше :) Quote Share this post Link to post Share on other sites More sharing options...
torik 0 May 16, 2014 Posted May 16, 2014 · Report post эвона как. Т.е. пример с блокирующим присваиванием как бы выполнится за два такта? и поэтому к моменту присвоения б=а, а уже равно 10 Quote Share this post Link to post Share on other sites More sharing options...
des00 26 May 16, 2014 Posted May 16, 2014 · Report post Т.е. пример с блокирующим присваиванием как бы выполнится за два такта? так говорить не корректно. должно быть что-то вроде этого по фронту тактовой все будет выполнено сверху вниз, с учетом типа присваивания :) Кстати что бы "добить вас танцем", если в моем примере, поменяете строки a = b и b = a местами, то будет тоже что и в первом коде :) В общем вам лучше с этим разобраться, иначе рано еще уходить на таски и функции, с сигналами. Quote Share this post Link to post Share on other sites More sharing options...