new123 0 11 февраля, 2019 Опубликовано 11 февраля, 2019 (изменено) · Жалоба Добрый день, форумчане. Отхватываю вот такой варнинг, суть которого не совсем понимаю. 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] совсем не клок? На форуме альтеры был подобный вопрос, но ответа нет. Изменено 11 февраля, 2019 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 11 февраля, 2019 Опубликовано 11 февраля, 2019 · Жалоба Приветствую! У вас из data_wr получается latch потому как вы его самому себе назначаете Вы что хотите сделать с 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 11 февраля, 2019 Опубликовано 11 февраля, 2019 · Жалоба 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 Спасибо, сейчас буду изучать, что это =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 11 февраля, 2019 Опубликовано 11 февраля, 2019 · Жалоба Приветствую! 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 11 февраля, 2019 Опубликовано 11 февраля, 2019 · Жалоба Замучался собирать комбинационную логику, но в итоге варнинги ушли, спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться