sazh 8 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба Модуль большой. То что я написал, делается за такт, на Арии второй, при тактовой 125. В общем всем спасибо. Работает, вернусь когда время будет. Спасибо, что замутили. Фрагменты идентичны, дело не в них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба Не томите, выскажите свою пару подозрений. судя по тому что tx_fifo_rdusedw меньше 13 ти бит (т.к. автор не показал код, использую телепатию) и есть выражение ((tx_fifo_rdusedw + dma_tx_addr_now[11:0]) > 13'hFFF)) то следуя главе стандарта 4.4.1 Rules for expression bit lengths -> Table 29—Bit lengths resulting from self-determined expressions -> Expression Bit length i op j, where op is: + - * / % & | ^ ^~ ~^ max(L(i),L(j) i op j, where op is: === !== == != && || > >= < <= 1 bit Operands are sized to max(L(i),L(j)) вычисляться сие должно так, сначала на 12 ти битах считается tx_fifo_rdusedw + dma_tx_addr_now[11:0], потом уже результат ресайзится до 13 ти бит. Т.к. результат при суммировании беззнаковый, то результат будет расширен нулем, а следовательно это сравнение никогда не выполнится. Мне очень интересно почему во втором случае код заработал, но автор не хочет предоставить код для изучения. Как будто на 600 строк можно что то супер секретное в ДМА строении сделать %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба вычисляться сие должно так, сначала на 12 ти битах считается tx_fifo_rdusedw + dma_tx_addr_now[11:0], потом уже результат ресайзится до 13 ти бит. Т.к. результат при суммировании беззнаковый, то результат будет расширен нулем, а следовательно это сравнение никогда не выполнится. Мне очень интересно почему во втором случае код заработал, но автор не хочет предоставить код для изучения. Как будто на 600 строк можно что то супер секретное в ДМА строении сделать %) В RTL сумматор 13 разрядный. А сравнение с 13'h0fff. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба В RTL сумматор 13 разрядный. А сравнение с 13'h0fff. когда уже успели код выложить, вроде не было его в теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба когда уже успели код выложить, вроде не было его в теме. Так ведь дурное дело - не хитрое. module bb ( input [10:0] tx_fifo_rdusedw, input [10:0] cfg_maxpload_dw_l, input [11:0] dma_tx_addr_now, input dma_tx_stop_l, output oo ); assign oo = ( ((tx_fifo_rdusedw > cfg_maxpload_dw_l[10:0]) | ((tx_fifo_rdusedw + dma_tx_addr_now[11:0]) > 13'hFFF)) & (dma_tx_stop_l==1'b0) ); endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба вычисляться сие должно так, сначала на 12 ти битах считается tx_fifo_rdusedw + dma_tx_addr_now[11:0], потом уже результат ресайзится до 13 ти бит. Т.к. результат при суммировании беззнаковый, то результат будет расширен нулем, а следовательно это сравнение никогда не выполнится. Мне очень интересно почему во втором случае код заработал, но автор не хочет предоставить код для изучения. Как будто на 600 строк можно что то супер секретное в ДМА строении сделать %) (* keep = 1 *) wire [15:0] tx_fifo_rdusedw; Мне не ясно не что в коде, а почему поведение меняется если я меняю только этот кусок. За инфу, спасибо. вычисляться сие должно так, сначала на 12 ти битах считается tx_fifo_rdusedw + dma_tx_addr_now[11:0], потом уже результат ресайзится до 13 Не понятно. wire a[11:0]; wire b[11:0]; То a+b должно быть 13 бит, а a*b должно быть 24. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба Не понятно. wire a[11:0]; wire b[11:0]; То a+b должно быть 13 бит, а a*b должно быть 24. Нет, результат будет иметь количество битов, соответствующее максимальному из количества битов операндов (в данном случае 12). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба Нет, результат будет иметь количество битов, соответствующее максимальному из количества битов операндов (в данном случае 12). А если wire a[11:0]; wire b[11:0]; wire c[20:0]; assign c=a*b; Вообще, странно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба Тогда результат будет расширен до 21 бита (вернее, урезан :)). Подстраивается под размерность переменной в левой части. Но до этого переменной слева не было... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба Тогда результат будет расширен до 21 бита (вернее, урезан :)). Подстраивается под размерность переменной в левой части. Но до этого переменной слева не было... wire a[11:0]; wire b[11:0]; wire d[100:0]; wire c[101:0]; assign c=a*b + d; В этом случае, умножитель a*b будет иметь какую разрядность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба В RTL сумматор 13 разрядный. А сравнение с 13'h0fff. да, как то подзабыл правила определения разрядности последовательности выражений, здесь все будет нормально. wire a[11:0]; wire b[11:0]; wire d[100:0]; wire c[101:0]; assign c=a*b + d; В этом случае, умножитель a*b будет иметь какую разрядность? результат перемножения 24 бита, затем если a и b и d знаковые, будет знаковое умножение и расширение до разрядности с, если любой из a,b,d беззнаковый то будет беззнаковое расширение. Для повторения косяка под что собиралось и чем ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба wire a[11:0]; wire b[11:0]; wire d[100:0]; wire c[101:0]; assign c=a*b + d; В этом случае, умножитель a*b будет иметь какую разрядность? Попробуйте почитать это. и это. Надеюсь поможет. ЗЫ Сам недавно столкнулся с подобной проблемой, пришлось вспомнить мат. часть :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба результат перемножения 24 бита, затем если a и b и d знаковые, будет знаковое умножение и расширение до разрядности с, если любой из a,b,d беззнаковый то будет беззнаковое расширение. Спасибо. Для повторения косяка под что собиралось и чем ? Квартус 9.1 Билд350, Второй сервис пак, линукс 64 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 15 июня, 2010 Опубликовано 15 июня, 2010 · Жалоба Похоже, мы никогда не узнаем правду! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться