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

Доброго времени суток всем!

На днях столкнулся с весьма неприятным случаем ошибочной работы синтезатора 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???)

post-1492-1309771825_thumb.png

Скриншот FPGA editor (опять же, где младшие биты адреса??? Верхний LUT (WR) честно использует все биты адреса, нижний (RD) только два бита внешнего адреса чтения в младшей части адреса LUT)

post-1492-1309772128_thumb.png

 

Предвосхищая вопрос, а что будет, если константу переместить в верхнюю часть адреса, отвечу, что все будет хорошо, проверено.

 

Ну, и собственно, вопрос, кто косячит? Я плохо знаю синтаксис Verilog и неправильно описываю distributed RAM, или, таки, XST не прав?

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

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


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

Если шины данных одинаковы, зачем тогда делать запись в адреса, не заканчивающиеся на 2?

 

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


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

Если шины данных одинаковы, зачем тогда делать запись в адреса, не заканчивающиеся на 2?

 

похоже на прореживание данных выборки

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


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

похоже на прореживание данных выборки

Ну так не записывать их и все! И памяти в 4 раза меньше надо.

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


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

Если шины данных одинаковы, зачем тогда делать запись в адреса, не заканчивающиеся на 2?

Согласен, конструкция спорная, но никак не объясняет описанной ошибки.

Впрочем могу ответить зачем. Для ускорения работы алгоритма, реализованы несколько однотипных вычислителей, коэффициенты для вычислителей хранятся в памяти, вычислители работают по конвееру, результат работы предыдущего вычислителя формирует адрес чтения памяти текущего вычислителя, поэтому память в каждом канале физически индивидуальная, хоть и имеет одинаковое содержимое. Кроме того, первый вычислитель считывает данные всего по двум адресам, второй по четырем, и т.д. Чтобы не заморачиваться с описанием памяти разного размера для каждого вычислителя и писать только используемый объем, была написана универсальная конструкция, с подстановкой фиксированной маски на адрес чтения. С точки зрения ресурсов утяжеления никакого нет, т.к. в любом случае используется примитив распределенной памяти целиком. В итоге получилась описанная в теме ситуация, выйти из которой удалось именно тем способом от которого изначально хотелось уйти.

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

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


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

Проблема. Пишите баг-репорты.

Можно еще попробовать сделать wrapper и снаружи биты адреса устанавливать.

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


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

Рапер - это один из вариантов, но очень не хотелось ставить примитив и делать код платформозависимым. Собственно этот пост писался не столько как просьба о помощи, а скорее предостережение юзерам xilinx.

Попробую еще проверить с последней версией ISE, может уже пофиксили. Потом баг репот. Всем спасибо.

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


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

Рапер - это один из вариантов, но очень не хотелось ставить примитив и делать код платформозависимым. Собственно этот пост писался не столько как просьба о помощи, а скорее предостережение юзерам xilinx.

Попробую еще проверить с последней версией ISE, может уже пофиксили. Потом баг репот. Всем спасибо.

 

отпишитесь как победите

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


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

предостережение юзерам xilinx

Опытные юзеры Xilinx и так пуганые :D

 

Кстати, по опыту: очень похоже, что вы что-то крутили в оптимизации. У нас тоже подобные глюки встречались, когда лезли ручонками туда, куда лезть не надо. :-)

 

с последней версией ISE

Старые глюки, может, и пофиксили (и то вряд ли), зато, наверняка, добавили новых. Как это у них обычно и бывает - к третьему сервис-паку все приходит в норму.

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


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

Опытные юзеры Xilinx и так пуганые :D

 

Кстати, по опыту: очень похоже, что вы что-то крутили в оптимизации. У нас тоже подобные глюки встречались, когда лезли ручонками туда, куда лезть не надо. :-)

 

я из опыта тоже скажу - много куда ручонками лезть не надо, но у создателей враперов и мегафункций из Xilinx ручонки у самих кривые и приходиться самому лезть

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


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

у создателей враперов и мегафункций из Xilinx ручонки у самих кривые

Согласен.

приходиться самому лезть

Я не претендую, но у меня за годы общения с данной платформой выработался подход примерно такой: если то, что реализовали китайские студенты из фирмы Xilinx не работает по дефолту, значит нужно писать самому.

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


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

китайские студенты из фирмы Xilinx

 

у них индийские в основном работают :) общался

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


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

Кстати, по опыту: очень похоже, что вы что-то крутили в оптимизации. У нас тоже подобные глюки встречались, когда лезли ручонками туда, куда лезть не надо. :-)

Рад бы с этим согласиться, но найдите ошибку в приведенном мной исходнике, скажите, что именно написано неправильно, и какие такие настройки оптимизации синтезатора могут ПРИНЦИПИАЛЬНО ИСПОРТИТЬ ЛОГИКУ работы кода??? И, да, для очистки совести данный код был помещен в отдельный исходник под который был создан абсолютно новый проект с абсолютно дефолтными настройками. Результат тот же.

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


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

Рапер - это один из вариантов, но очень не хотелось ставить примитив и делать код платформозависимым.

мракусы спасут отца русской демократии :biggrin:

 

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


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

мракусы спасут отца русской демократии :biggrin:

Сленг хорош, когда собеседники в теме, не затруднит раскрыть указанный выше "термин"?

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


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

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

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

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

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

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

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

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

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

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