Yuris 0 4 июля, 2011 Опубликовано 4 июля, 2011 (изменено) · Жалоба Доброго времени суток всем! На днях столкнулся с весьма неприятным случаем ошибочной работы синтезатора XST. Итак, имеем небольшую распределенную память с классическим описанием на Verilog, в которой младшая часть шины адреса чтения задана константой, адрес записи - полный. В результате синтезатор XST (ISE 12.3) осуществил не совсем адекватную оптимизацию именно этой постоянной части сигналов адреса чтения, со смещением переменной части в сторону младших разрядов. Собственно, сначала, не заработало железо в этой части, потом в ход пошла тяжелая артиллерия в виде чипскопа, только после чего я удосужился посмотреть RTL schematic и FPGA editor. Теперь веселые картинки. 1. Исходный код (упростил до безобразия и вынес в отдельный файл, чтобы исключить влияние остального кода, хитрый инит, для того, чтобы посмотреть как он будет выглядеть в FPGA editor, забегая вперед, выглядит как надо, т.е. никаких внутренних адресных смещений в LUT нет, да и быть не может) module top( input clk1, input mem_we, input [3:0] mem_waddr, input [7:0] mem_wdat, input clk2, input [1:0] mem_raddr_ext, output [7:0] mem_rdat_o ); (* ram_style = "distributed" *) reg [7:0] mem [15:0]; initial begin mem[0]=8'h0; mem[1]=8'hff; mem[2]=8'hff; mem[3]=8'hff; mem[4]=8'hff; mem[5]=8'hff; mem[6]=8'hff; mem[7]=8'hff; mem[8]=8'h0; mem[9]=8'hff; mem[10]=8'hff; mem[11]=8'hff; mem[8]=8'hff; mem[13]=8'hff; mem[14]=8'hff; mem[15]=8'hff; end always @(posedge clk1) if(mem_we) begin mem[mem_waddr[3:0]] <= mem_wdat[7:0]; end wire [3:0] mem_raddr={mem_raddr_ext[1:0], 2'h2}; reg [7:0] mem_rdat=8'h0; always @(posedge clk2) mem_rdat<=mem[mem_raddr]; assign mem_rdat_o=mem_rdat; endmodule Скриншот RTL (куда подевались младшие биты на шине addrB???) Скриншот FPGA editor (опять же, где младшие биты адреса??? Верхний LUT (WR) честно использует все биты адреса, нижний (RD) только два бита внешнего адреса чтения в младшей части адреса LUT) Предвосхищая вопрос, а что будет, если константу переместить в верхнюю часть адреса, отвечу, что все будет хорошо, проверено. Ну, и собственно, вопрос, кто косячит? Я плохо знаю синтаксис Verilog и неправильно описываю distributed RAM, или, таки, XST не прав? Изменено 4 июля, 2011 пользователем Yuris Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба Если шины данных одинаковы, зачем тогда делать запись в адреса, не заканчивающиеся на 2? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vugluskr 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба Если шины данных одинаковы, зачем тогда делать запись в адреса, не заканчивающиеся на 2? похоже на прореживание данных выборки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба похоже на прореживание данных выборки Ну так не записывать их и все! И памяти в 4 раза меньше надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuris 0 4 июля, 2011 Опубликовано 4 июля, 2011 (изменено) · Жалоба Если шины данных одинаковы, зачем тогда делать запись в адреса, не заканчивающиеся на 2? Согласен, конструкция спорная, но никак не объясняет описанной ошибки. Впрочем могу ответить зачем. Для ускорения работы алгоритма, реализованы несколько однотипных вычислителей, коэффициенты для вычислителей хранятся в памяти, вычислители работают по конвееру, результат работы предыдущего вычислителя формирует адрес чтения памяти текущего вычислителя, поэтому память в каждом канале физически индивидуальная, хоть и имеет одинаковое содержимое. Кроме того, первый вычислитель считывает данные всего по двум адресам, второй по четырем, и т.д. Чтобы не заморачиваться с описанием памяти разного размера для каждого вычислителя и писать только используемый объем, была написана универсальная конструкция, с подстановкой фиксированной маски на адрес чтения. С точки зрения ресурсов утяжеления никакого нет, т.к. в любом случае используется примитив распределенной памяти целиком. В итоге получилась описанная в теме ситуация, выйти из которой удалось именно тем способом от которого изначально хотелось уйти. Изменено 4 июля, 2011 пользователем Yuris Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Проблема. Пишите баг-репорты. Можно еще попробовать сделать wrapper и снаружи биты адреса устанавливать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuris 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Рапер - это один из вариантов, но очень не хотелось ставить примитив и делать код платформозависимым. Собственно этот пост писался не столько как просьба о помощи, а скорее предостережение юзерам xilinx. Попробую еще проверить с последней версией ISE, может уже пофиксили. Потом баг репот. Всем спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vugluskr 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Рапер - это один из вариантов, но очень не хотелось ставить примитив и делать код платформозависимым. Собственно этот пост писался не столько как просьба о помощи, а скорее предостережение юзерам xilinx. Попробую еще проверить с последней версией ISE, может уже пофиксили. Потом баг репот. Всем спасибо. отпишитесь как победите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
homounsapiens 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба предостережение юзерам xilinx Опытные юзеры Xilinx и так пуганые :D Кстати, по опыту: очень похоже, что вы что-то крутили в оптимизации. У нас тоже подобные глюки встречались, когда лезли ручонками туда, куда лезть не надо. :-) с последней версией ISE Старые глюки, может, и пофиксили (и то вряд ли), зато, наверняка, добавили новых. Как это у них обычно и бывает - к третьему сервис-паку все приходит в норму. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vugluskr 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Опытные юзеры Xilinx и так пуганые :D Кстати, по опыту: очень похоже, что вы что-то крутили в оптимизации. У нас тоже подобные глюки встречались, когда лезли ручонками туда, куда лезть не надо. :-) я из опыта тоже скажу - много куда ручонками лезть не надо, но у создателей враперов и мегафункций из Xilinx ручонки у самих кривые и приходиться самому лезть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
homounsapiens 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба у создателей враперов и мегафункций из Xilinx ручонки у самих кривые Согласен. приходиться самому лезть Я не претендую, но у меня за годы общения с данной платформой выработался подход примерно такой: если то, что реализовали китайские студенты из фирмы Xilinx не работает по дефолту, значит нужно писать самому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vugluskr 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба китайские студенты из фирмы Xilinx у них индийские в основном работают :) общался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuris 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Кстати, по опыту: очень похоже, что вы что-то крутили в оптимизации. У нас тоже подобные глюки встречались, когда лезли ручонками туда, куда лезть не надо. :-) Рад бы с этим согласиться, но найдите ошибку в приведенном мной исходнике, скажите, что именно написано неправильно, и какие такие настройки оптимизации синтезатора могут ПРИНЦИПИАЛЬНО ИСПОРТИТЬ ЛОГИКУ работы кода??? И, да, для очистки совести данный код был помещен в отдельный исходник под который был создан абсолютно новый проект с абсолютно дефолтными настройками. Результат тот же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Рапер - это один из вариантов, но очень не хотелось ставить примитив и делать код платформозависимым. мракусы спасут отца русской демократии Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuris 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба мракусы спасут отца русской демократии Сленг хорош, когда собеседники в теме, не затруднит раскрыть указанный выше "термин"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться