Перейти к содержанию
    

Модуль большой. То что я написал, делается за такт, на Арии второй, при тактовой 125. В общем всем спасибо. Работает, вернусь когда время будет.

 

Спасибо, что замутили.

Фрагменты идентичны, дело не в них.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не томите, выскажите свою пару подозрений.

судя по тому что 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 строк можно что то супер секретное в ДМА строении сделать %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вычисляться сие должно так, сначала на 12 ти битах считается tx_fifo_rdusedw + dma_tx_addr_now[11:0], потом уже результат ресайзится до 13 ти бит. Т.к. результат при суммировании беззнаковый, то результат будет расширен нулем, а следовательно это сравнение никогда не выполнится. Мне очень интересно почему во втором случае код заработал, но автор не хочет предоставить код для изучения. Как будто на 600 строк можно что то супер секретное в ДМА строении сделать %)

 

В RTL сумматор 13 разрядный. А сравнение с 13'h0fff.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В RTL сумматор 13 разрядный. А сравнение с 13'h0fff.

когда уже успели код выложить, вроде не было его в теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

когда уже успели код выложить, вроде не было его в теме.

 

Так ведь дурное дело - не хитрое.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вычисляться сие должно так, сначала на 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понятно.

wire a[11:0];

wire b[11:0];

 

То a+b должно быть 13 бит, а a*b должно быть 24.

Нет, результат будет иметь количество битов, соответствующее максимальному из количества битов операндов (в данном случае 12).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, результат будет иметь количество битов, соответствующее максимальному из количества битов операндов (в данном случае 12).

А если

wire a[11:0];

wire b[11:0];

wire c[20:0];

assign c=a*b;

Вообще, странно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда результат будет расширен до 21 бита (вернее, урезан :)).

Подстраивается под размерность переменной в левой части.

Но до этого переменной слева не было...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда результат будет расширен до 21 бита (вернее, урезан :)).

Подстраивается под размерность переменной в левой части.

Но до этого переменной слева не было...

wire a[11:0];

wire b[11:0];

wire d[100:0];

wire c[101:0];

 

 

assign c=a*b + d;

 

В этом случае, умножитель a*b будет иметь какую разрядность?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 беззнаковый то будет беззнаковое расширение.

 

Для повторения косяка под что собиралось и чем ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 беззнаковый то будет беззнаковое расширение.

Спасибо.

 

Для повторения косяка под что собиралось и чем ?

Квартус 9.1 Билд350, Второй сервис пак, линукс 64 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...