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

Правильный констрейн для регистра.

Добрый день, форумчане.

Отхватываю вот такой варнинг, суть которого не совсем понимаю.
 

Quote

Warning (332060): Node: pcie_dma:dma_send|current_rd_part_8byte_i[0] was determined to be a clock but was found without an associated clock assignment.
    Info (13166): Latch pcie_dma:dma_send|data_wr[2] is being clocked by pcie_dma:dma_send|current_rd_part_8byte_i[0]
 

Судя по всему, регистр current_rd_part_8byte_i[0] является защелкой или клоком для другого регистра и мне его надо описать.
Есть у меня сложный код, упростить который пока не могу, сильно не смейтесь
 

	assign data_wr [DMA_MESSAGE_PAYLOAD_1_START:DMA_MESSAGE_PAYLOAD_1_END] = ((current_rd_part_8byte_i[2:0] == 3'd2) && (current_rd_part_32byte_i[2:0] == 3'b1))? {current_message_id, message_type, input_data_size, current_descriptor_count, current_descriptor_num, 8'b00}:
(current_rd_part_8byte_i[2:0] == 3'd1)? wire_input_fifo_data_out: data_wr [DMA_MESSAGE_PAYLOAD_1_START:DMA_MESSAGE_PAYLOAD_1_END];
	assign data_wr [DMA_MESSAGE_PAYLOAD_2_START:DMA_MESSAGE_PAYLOAD_2_END] = (current_rd_part_8byte_i[2:0] == 3'd2)? wire_input_fifo_data_out: data_wr [DMA_MESSAGE_PAYLOAD_2_START:DMA_MESSAGE_PAYLOAD_2_END];
	assign data_wr [DMA_MESSAGE_PAYLOAD_3_START:DMA_MESSAGE_PAYLOAD_3_END] = (current_rd_part_8byte_i[2:0] == 3'd3)? wire_input_fifo_data_out: data_wr [DMA_MESSAGE_PAYLOAD_3_START:DMA_MESSAGE_PAYLOAD_3_END];
	assign data_wr [DMA_MESSAGE_PAYLOAD_4_START:DMA_MESSAGE_PAYLOAD_4_END] = (current_rd_part_8byte_i[2:0] == 3'd4)? wire_input_fifo_data_out: data_wr [DMA_MESSAGE_PAYLOAD_4_START:DMA_MESSAGE_PAYLOAD_4_END];

Ругается он на первую строчку.
Сам current_rd_part_8byte_i[2:0] изменяется в подобном блоке ( clk_wr = 250Mhz) путем простого инкрементирования на 1 по условию

Quote

always @ (posedge clk_wr) begin
end

Подскажите, возможно ли мне как то указать, что current_rd_part_8byte_i[0] совсем не клок?  На форуме альтеры был подобный вопрос, но ответа нет.

Изменено пользователем new123

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


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

Приветствую!

У вас из data_wr  получается latch потому как вы его самому себе назначаете :wacko2:

Вы что хотите  сделать с data_wr ? mux для чтения данных  - тогда не лепите длинных тернарных операторов - запутаться легко.  Лучше тоже самое делать в always_comb  через нормальный if/case.  И обязательно с заданием default состояния для переменной

always_comb begin
  data_wr = '0;

  if ( (current_rd_part_8byte_i[2:0] == 3'd2)&& (current_rd_part_32byte_i[2:0] == 3'b1) ) begin
    data_wr [DMA_MESSAGE_PAYLOAD_1_START:DMA_MESSAGE_PAYLOAD_1_END] = {current_message_id, message_type, input_data_size, current_descriptor_count, current_descriptor_num, 8'b00};
  end
  else if (current_rd_part_8byte_i[2:0] == 3'd1) begin
    data_wr [DMA_MESSAGE_PAYLOAD_1_START:DMA_MESSAGE_PAYLOAD_1_END] = wire_input_fifo_data_out
  end
  // else begin // ???? latch here
  //   data_wr [DMA_MESSAGE_PAYLOAD_1_START:DMA_MESSAGE_PAYLOAD_1_END] = data_wr [DMA_MESSAGE_PAYLOAD_1_START:DMA_MESSAGE_PAYLOAD_1_END];
  // end
  ...
end

Удачи! Rob.

 

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


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

4 minutes ago, RobFPGA said:

У вас из data_wr  получается latch потому как вы его самому себе назначаете

вон он чего мне кучу варнингов (256) про латч вывалил, я уже три дня про них читаю, причину не пойму. Спасибо.
data_wr я сам на себя замыкаю, это что то вроде того, чтобы данные поменялись только при соответствующем current_rd_part_8byte_i[2:0]. Это как составить If-then без else. Просто quartus не пропускает конструкию вида "(<условие>)?<true>:<false>" без части <false>
 

 

8 minutes ago, RobFPGA said:

Лучше тоже самое делать в always_comb 

Спасибо, сейчас буду изучать, что это =)

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


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

Приветствую!

1 minute ago, new123 said:

вон он чего мне кучу варнингов (256) про латч вывалил, я уже три дня про них читаю, причину не пойму. Спасибо.
data_wr я сам на себя замыкаю, это что то вроде того, чтобы данные поменялись только при соответствующем current_rd_part_8byte_i[2:0]. Это как составить If-then без else. Просто quartus не пропускает конструкию вида "(<условие>)?<true>:<false>" без части <false>

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

Надо пытаться избегать использования latch  в дизайне по возможности меняя логику работы на обычные защелки. 

Удачи! Rob.

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


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

Замучался собирать комбинационную логику, но в итоге варнинги ушли, спасибо

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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