spooki 0 10 июля, 2012 Опубликовано 10 июля, 2012 (изменено) · Жалоба Здравствуйте, Уважаемые форумчане. Делаю проект для ПЛИС Actel Axcelerator. Плиска однократная. Инициализации памяти по старту нет! Синтез делаю в Synplify. Симуляцию в Modelsim. Симуляция кода работает нормально. При симуляции синтезированного проекта все валится из-за неизвестного начального значения ячеек RAM. В некоторых местах проблем это не создает, т.к. алгоритмы работают только с теми ячейками памяти в которые пишутся данные в процессе работы. Но есть блоки проекта, которые лопатят все ячейки RAM непрерывно и они не могут работать с сигналами типа "xxxx" - валится все кругом. Наворачивать к каждому RAM - блоку автомат записи нуля по старту не хочется, к тому же времянку изменит! Может кто-нибудь решал уже такую задачу? Изменено 10 июля, 2012 пользователем spooki Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
litv 0 10 июля, 2012 Опубликовано 10 июля, 2012 · Жалоба типа http://www.google.ru/url?sa=t&rct=j&am...erPIFJFc-H25Oyw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spooki 0 10 июля, 2012 Опубликовано 10 июля, 2012 (изменено) · Жалоба litv Я это видел. Но это не подходит. Там описываеются 2 варианта. - значения по старту неизвестны - или инициализируются по файлу. Оба эти варианта стандартны для любого проекта ПЛИС - ничего нового они там не написали. Но инициализация по файлу работает только при симуляции verilog, она не работает при симуляции RLT тут уж только честное железо( А как симулировать уже синтезированный проект - молчат падлы. Изменено 10 июля, 2012 пользователем spooki Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 10 июля, 2012 Опубликовано 10 июля, 2012 · Жалоба Симулировать синтезированный проект бессмысленно. Я ещё понимаю симуляцию после place'n'route, чтобы посмотреть реальные задержки. А после синтеза зачем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spooki 0 10 июля, 2012 Опубликовано 10 июля, 2012 · Жалоба Симулировать синтезированный проект бессмысленно. Я ещё понимаю симуляцию после place'n'route, чтобы посмотреть реальные задержки. А после синтеза зачем? Ну во-первых проблема от этого никуда не денется. И там и там сигнал будет не определен. Во - вторых, иногда симулирую синтезированный лишь из экономии времени! P&R симуляция все же потормознее будет в симуляции, по понятным причинам. В - третьих, если что-то постоянно правишь в проекте каждый раз его переразводить опять-таки долго (если он большой, конечно - мой случай) ограничиться синтезом быстрее. В - четвертых, симулирую синтезированный проект как раз для отлавливания таких глюков и чудес преобразования в RTL. Эти глюки не меняются и не добавляются при расстановке, разводке и прочих этапах. В - пятых. P&R как раз симулирую редко. Так разок посмотреть что все живо. Времянка должна обеспечиваться разводчиком по констрейнам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 10 июля, 2012 Опубликовано 10 июля, 2012 · Жалоба Здравствуйте. Раз вы говорите, что в симуляции Х-ы не исчезают сами собой со временем, значит это не будет происходить и в работе схемы. И если при загрузке ПЛИСы значение в BRAM само собой устанавливается в '0' и вы его используете(этот ноль) в дальнейшем, то как быть с reset-ом? То что было в памяти записано до ресета - то и подхватили? Я всегда делаю сбрасываемый регистр(он обычно небольшой выходит) в котором учитываю состояние памяти. И при подхватывании данных от BRAM смотрю состояние нужного элемента. И в зависимости от него через мультиплексор в регистр пишу либо нуль, либо данное из памяти. Да, получается задержка в один такт, зато никаких вопросов ни при симуляции, ни при работе не возникает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spooki 0 11 июля, 2012 Опубликовано 11 июля, 2012 (изменено) · Жалоба Раз вы говорите, что в симуляции Х-ы не исчезают сами собой со временем, значит это не будет происходить и в работе схемы. "Х" - неопределенное значение памяти или регистра ДЛЯ СИМУЛЯТОРА. Все только критикуют, не зная задачи, и никто не пишет по делу! Придется слегка описать проект: Есть ПЛИС которая собирает измерительные данные, кладет их в буфер(RAM) и отправляет этот буфер по интерфейсу другому устройству. Размер буфера = 1КБ. И всегда по интерфейсу передается весь буфер = 1 КБ! Но, количество данных постоянно записываемых в этот буфер настраивается и может быть от 0 до 1КБ. Т.е., например, я всегда пишу в него 700 байт остальные 300 байт не пишу никогда (возможно в процессе работы устройства настройки заменят и буду писать 1КБ). Приемник принимает 1КБ и читает из него первые 700 байт, дальше игнорирует. И приемнику и мне действительно до фонаря какие там значения по старту были в этих 300 байтах, которые я не пишу. Что мне теперь инициализировать их каким-то автоматом только чтобы симулятор их понял, мне что заняться нечем? В реальном устройстве я их буду анализировать только если буду писать, но передаю я их всегда! П.С. Есть пример по-проще: стартует любая ПЛИС с несбрасываемой и не инициализированной RAM памятью. Зачача - посчитать CRC буфера RAM по старту и выдать! Как просимулировать такой синтезированны(или P&R) проект? Изменено 11 июля, 2012 пользователем spooki Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 11 июля, 2012 Опубликовано 11 июля, 2012 · Жалоба Приемник принимает 1КБ и читает из него первые 700 байт, дальше игнорирует. И приемнику и мне действительно до фонаря какие там значения по старту были в этих 300 байтах, которые я не пишу. 1. Вариант решения без инициализации, но с дополнительной логикой. Перед модулем crc есть регистр? Ведь наверняка есть. Так вот - ставите счётчик, который отсчитывает реальную длинну посылки(700), и потом в регистр и для передачи, и для расчёта crc записываете нули(или что-либо по вкусу). Как несложный вариант. 2. Вариант с инициализацией. Стандартное описание памяти на vhdl. entity bram is generic( ORDER : natural := 10; -- Порядок степени двойки адреса. width_mem : natural := 256 -- Размерность слова. ); Port ( clka : in STD_LOGIC; ena : in STD_LOGIC; addra : in STD_LOGIC_VECTOR ((ORDER - 1) downto 0); dia : in STD_LOGIC_VECTOR ((width_mem - 1) downto 0); clkb : in STD_LOGIC; enb : in STD_LOGIC; addrb : in STD_LOGIC_VECTOR ((ORDER - 1) downto 0); dob : out STD_LOGIC_VECTOR ((width_mem - 1) downto 0)); end bram; architecture Behavioral of bram is attribute syn_hier : string; attribute syn_hier of Behavioral: architecture is "hard"; type ram_type is array (0 to (2**ORDER - 1)) of std_logic_vector((width_mem - 1) downto 0); signal ram : ram_type := (others => (others => '0')); attribute syn_ramstyle : string; attribute syn_ramstyle of ram : signal is "block_rom"; begin process(clka) begin if (clka'event and clka = '1') then if ena = '1' then ram(conv_integer(addra)) <= dia; end if; end if; end process; process (clkb) begin if (clkb'event and clkb = '1') then if enb = '1' then dob <= ram(conv_integer(addrb)); end if; end if; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 11 июля, 2012 Опубликовано 11 июля, 2012 · Жалоба Как вариант - в начале теста заполнить весь блок 0, а потом перейти к основному тесту. 'X' для OTP плисок можно рассматривать как любую случайную величину, либо как неопределенное состояние(для ram необходимо отдельно узнавать, для триггеров - однозначное значение только после инициализации). В этом случае лучше заложить в ваш проект автоматическую инициализацию блока памяти по сбросу в значение 0. PS: поведение правильного исходного кода не должно отличаться от поведения синтезированной/разведенной схемы. отличие д.б. только в задержках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spooki 0 11 июля, 2012 Опубликовано 11 июля, 2012 · Жалоба TRILLER Все это понятно, и требует дополнительной логики в проект. Хотелось бы решение, не требующие изменения железа. А то как-то глупо получается вмешиваться в проект, чтобы угодить какому то там симулятору. Нашел я тут начальную инициализацию памяти в Modelsim, только долго это все получиться ибо инициализировать надо банок 20. Вот бы сразу в verilog писать директивы для начальной инициализации при симуляции и чтобы синтезатор тащил эту инфу через синтезируемые файлы или хотябы создавал дополнительные, а то как то криво все это! Приходится сидеть искать как он назвал эти банки на сколько штук их разложил как они называются и где лежат и в ручную иничиализировать. Попробую все жэто конечно в скрипт загнать, но как мы все знаем при малейшем изменении проекта все пути и названия линий меняются так что хз. Ну собственно что это я - это все и есть проблемы синтеза ПЛИС :angry2:. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 11 июля, 2012 Опубликовано 11 июля, 2012 · Жалоба TRILLER ...но как мы все знаем при малейшем изменении проекта все пути и названия линий меняются так что хз. Для симплифая. attribute syn_hier : string; attribute syn_hier of Behavioral: architecture is "hard"; Этот атрибут как раз и отвечает за то, чтобы название линий и регистров НЕ МЕНЯЛОСЬ. Оно может менятся, только лишь если синтезатор что-либо просто выкинет за ненадобностью(совсем уж лишнее). type ram_type is array (0 to (2**ORDER - 1)) of std_logic_vector((width_mem - 1) downto 0); signal ram : ram_type := (others => (others => '0')); Это начальная инициализация нулём. Она не требует дополнительной логики)). Я, если честно, так не делаю - предпочитаю всё жёстко контролировать. Но для модели самое оно. На верилог, я думаю, есть аналог. Не понимаю, если честно, в чём затруднение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spooki 0 11 июля, 2012 Опубликовано 11 июля, 2012 (изменено) · Жалоба Не понимаю, если честно, в чём затруднение? Начальная инициализация в verilog и VHDL само собой есть. Но только при симуляции етого самого verilog или VHDL. Как только вы синтезируете код в RTL для какой-либо конкретной ПЛИС то все инициализации действуют если архитектура ПЛИС это приемлит. Если не приемлит то все инициализируется в "X" для симулятора, в реальной ПЛИС начальные значения памяти и регистров устанавливается случайным образом. Изменено 11 июля, 2012 пользователем spooki Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 11 июля, 2012 Опубликовано 11 июля, 2012 · Жалоба Простите, сразу не понял сути проблеммы. Не знаю тогда) :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Actel_SKV 0 17 июля, 2012 Опубликовано 17 июля, 2012 · Жалоба Здравствуйте, Уважаемые форумчане. Делаю проект для ПЛИС Actel Axcelerator. Плиска однократная. Инициализации памяти по старту нет! Синтез делаю в Synplify. Симуляцию в Modelsim. Симуляция кода работает нормально. При симуляции синтезированного проекта все валится из-за неизвестного начального значения ячеек RAM. В некоторых местах проблем это не создает, т.к. алгоритмы работают только с теми ячейками памяти в которые пишутся данные в процессе работы. Но есть блоки проекта, которые лопатят все ячейки RAM непрерывно и они не могут работать с сигналами типа "xxxx" - валится все кругом. Наворачивать к каждому RAM - блоку автомат записи нуля по старту не хочется, к тому же времянку изменит! Может кто-нибудь решал уже такую задачу? Кроме как использовать доплнительный блок инициализации, другого способа нет. Тем более надо учитывать, что в железе состояние памяти будет, так же, неопределенным. С большой долей вероятности в памяти будут нули, но не факт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться