misyachniy 0 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба Перебираю чужой проект. Подчищаю и "переписываю под себя". Для проверки сравниваю sof файлы "старый" и "новый." Есть вот такая конструкция always @ (posedge clk) begin begin if(Adress_Config == (9'd70 + 9'd256)) begin if(ack_config == 1'b1 && Debug == 1'b1) begin UV_Z <= Data_Config[13:1]; end end end end Я убрал лишне if ((Adress_Config == (9'd70 + 9'd256)) && (ack_config == 1'b1 && Debug == 1'b1)) UV_Z <= Data_Config[13:1]; Сравнение файлов показывает различия. По школьным знаниям могу предположить, что в первом варианте реализуется "приоритетный шифратор", во втором - "дешифратор". На мой взгляд функционировать должно одинаково, но почему генерится другой файл? //----- Ну и чтобы два раза не вставать, встретил два таких оператора вместе if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться. Как работает такая конструкция? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 10 минут назад, misyachniy сказал: Перебираю чужой проект. Подчищаю и "переписываю под себя". Для проверки сравниваю sof файлы "старый" и "новый." Есть вот такая конструкция always @ (posedge clk) begin begin if(Adress_Config == (9'd70 + 9'd256)) begin if(ack_config == 1'b1 && Debug == 1'b1) begin UV_Z <= Data_Config[13:1]; end end end end Я убрал лишне if ((Adress_Config == (9'd70 + 9'd256)) && (ack_config == 1'b1 && Debug == 1'b1)) UV_Z <= Data_Config[13:1]; Сравнение файлов показывает различия. По школьным знаниям могу предположить, что в первом варианте реализуется "приоритетный шифратор", во втором - "дешифратор". На мой взгляд функционировать должно одинаково, но почему генерится другой файл? //----- Ну и чтобы два раза не вставать, встретил два таких оператора вместе if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться. Как работает такая конструкция? Вы простую и понятную конструкцию заменили на непонятную и не читаемую. Зачем ? Чтобы ответить на Ваш вопрос - достаточно открыть сгенерированный нетлист. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 22 minutes ago, misyachniy said: Для проверки сравниваю sof файлы "старый" и "новый." это не сравнение. вам лучше тогда вообще ничего не трогать. Quote По школьным знаниям могу предположить, что в первом варианте реализуется "приоритетный шифратор", во втором - "дешифратор". На мой взгляд функционировать должно одинаково, но почему генерится другой файл? логический результат одинаков, а для плис может оптимизатор или resource sharing так работает или вместо sload софт использует LUT (для альтеры). Quote if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться. не одновременно, присваивания в дельта цикле идут сверх вниз, по окончанию дельта цикла присваивается последнее Quote Как работает такая конструкция? if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; else if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; вот так ЗЫ. Для вашей задачи, вас спасет только тестбенч с полным покрытием и параллельный прогон двух блоков. ЗЗЫ. И если уж чистить, тогда убирайте эту вхдлщину(и у вас скобка одна при копипаст потерялась): if (((Adress_Config == (9'd70 + 9'd256)) & ack_config & Debug) UV_Z <= Data_Config[13:1]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 2 hours ago, Flip-fl0p said: Вы простую и понятную конструкцию заменили на непонятную и не читаемую. Зачем ? Чтобы ответить на Ваш вопрос - достаточно открыть сгенерированный нетлист. У каждого свой метод чтения. Я такие конструкции сведу в один абзац и все будет читаемо. 9'd70 - адрес переменной переменной, UV_Z - наименование переменной, все что в средине базовый адрес и сигналы разрешения и так понятны. Могу скопировать массив строк в программу процессора и сравнить с текстом программы if (((Adress_Config == (9'd70 + 9'd256)) & ack_config & Debug) UV_Z <= Data_Config[13:1]; По поводу "достаточно открыть сгенерированный нетлист. " - ничего не могу сказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 5 минут назад, misyachniy сказал: У каждого свой метод чтения. Я такие конструкции сведу в один абзац и все будет читаемо. 9'd70 - адрес переменной переменной, UV_Z - наименование переменной, все что в средине базовый адрес и сигналы разрешения и так понятны. Могу скопировать массив строк в программу процессора и сравнить с текстом программы if (((Adress_Config == (9'd70 + 9'd256)) & ack_config & Debug) UV_Z <= Data_Config[13:1]; По поводу "достаточно открыть сгенерированный нетлист. " - ничего не могу сказать. Удобство чтения - очень субьективно. Но Magic number - плохая практика. Откуда взялись эти 9'd70 + 9'd256. Что они значат. Зачем они. Я такой подход не одобряю. А в чем сложности посмотреть сгенерированный нетлист ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба Интересный метод сравнения результата ) всегда думал, что результаты от компиляции к компиляции разные. На больших проектах Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 8 часов назад, misyachniy сказал: if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться. Как работает такая конструкция? Обычный RS-триггер с приоритетом так-то. Ну да, выглядит непривычно, привычно так: if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; else if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; Но и так тоже можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 59 minutes ago, Jackov said: Но и так тоже можно. Или так: if (RM_Rise) Dis_Foto <= 1'b1; else if (Res_Dis_Foto) Dis_Foto <= 1'b0; И никакой ВХДЛьщины, как @des00 говорит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 37 minutes ago, nice_vladi said: Или так: if (RM_Rise) Dis_Foto <= 1'b1; else if (Res_Dis_Foto) Dis_Foto <= 1'b0; И никакой ВХДЛьщины, как @des00 говорит Значит будет отдельный процесс/always с компараторами где будет сравнение с этими магическими числами... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 апреля, 2022 Опубликовано 2 апреля, 2022 · Жалоба 2 hours ago, Jackov said: Обычный RS-триггер с приоритетом так-то. Ну да, выглядит непривычно, привычно так: if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; else if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; Но и так тоже можно. как раз вот так нельзя. вы инвертировали приоритеты относительно базового примера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 3 апреля, 2022 Опубликовано 3 апреля, 2022 · Жалоба 16 часов назад, des00 сказал: как раз вот так нельзя. вы инвертировали приоритеты относительно базового примера. Ах да, верно. Виновен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться