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

Инициализация RAM для симуляции проекта.

Здравствуйте, Уважаемые форумчане.

 

Делаю проект для ПЛИС Actel Axcelerator.

Плиска однократная. Инициализации памяти по старту нет!

 

Синтез делаю в Synplify. Симуляцию в Modelsim.

 

Симуляция кода работает нормально. При симуляции синтезированного проекта все валится из-за неизвестного начального значения ячеек RAM.

 

В некоторых местах проблем это не создает, т.к. алгоритмы работают только с теми ячейками памяти в которые пишутся данные в процессе работы.

 

Но есть блоки проекта, которые лопатят все ячейки RAM непрерывно и они не могут работать с сигналами типа "xxxx" - валится все кругом.

 

Наворачивать к каждому RAM - блоку автомат записи нуля по старту не хочется, к тому же времянку изменит!

 

Может кто-нибудь решал уже такую задачу?

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

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


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

litv

 

Я это видел.

 

Но это не подходит.

Там описываеются 2 варианта.

- значения по старту неизвестны

- или инициализируются по файлу.

 

Оба эти варианта стандартны для любого проекта ПЛИС - ничего нового они там не написали.

 

Но инициализация по файлу работает только при симуляции verilog, она не работает при симуляции RLT тут уж только честное железо(

 

А как симулировать уже синтезированный проект - молчат падлы.

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

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


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

Симулировать синтезированный проект бессмысленно. Я ещё понимаю симуляцию после place'n'route, чтобы посмотреть реальные задержки. А после синтеза зачем?

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


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

Симулировать синтезированный проект бессмысленно. Я ещё понимаю симуляцию после place'n'route, чтобы посмотреть реальные задержки. А после синтеза зачем?

 

Ну во-первых проблема от этого никуда не денется. И там и там сигнал будет не определен.

 

Во - вторых, иногда симулирую синтезированный лишь из экономии времени! P&R симуляция все же потормознее будет в симуляции, по понятным причинам.

В - третьих, если что-то постоянно правишь в проекте каждый раз его переразводить опять-таки долго (если он большой, конечно - мой случай) ограничиться синтезом быстрее.

В - четвертых, симулирую синтезированный проект как раз для отлавливания таких глюков и чудес преобразования в RTL. Эти глюки не меняются и не добавляются при расстановке, разводке и прочих этапах.

 

В - пятых. P&R как раз симулирую редко. Так разок посмотреть что все живо. Времянка должна обеспечиваться разводчиком по констрейнам.

 

 

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


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

Здравствуйте.

Раз вы говорите, что в симуляции Х-ы не исчезают сами собой со временем, значит это не будет происходить и в работе схемы. И если при загрузке ПЛИСы значение в BRAM само собой устанавливается в '0' и вы его используете(этот ноль) в дальнейшем, то как быть с reset-ом? То что было в памяти записано до ресета - то и подхватили?

Я всегда делаю сбрасываемый регистр(он обычно небольшой выходит) в котором учитываю состояние памяти. И при подхватывании данных от BRAM смотрю состояние нужного элемента. И в зависимости от него через мультиплексор в регистр пишу либо нуль, либо данное из памяти. Да, получается задержка в один такт, зато никаких вопросов ни при симуляции, ни при работе не возникает.

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


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

Раз вы говорите, что в симуляции Х-ы не исчезают сами собой со временем, значит это не будет происходить и в работе схемы.

"Х" - неопределенное значение памяти или регистра ДЛЯ СИМУЛЯТОРА.

Все только критикуют, не зная задачи, и никто не пишет по делу!

 

Придется слегка описать проект:

Есть ПЛИС которая собирает измерительные данные, кладет их в буфер(RAM) и отправляет этот буфер по интерфейсу другому устройству.

 

Размер буфера = 1КБ. И всегда по интерфейсу передается весь буфер = 1 КБ!

Но, количество данных постоянно записываемых в этот буфер настраивается и может быть от 0 до 1КБ.

Т.е., например, я всегда пишу в него 700 байт остальные 300 байт не пишу никогда (возможно в процессе работы устройства настройки заменят и буду писать 1КБ). Приемник принимает 1КБ и читает из него первые 700 байт, дальше игнорирует. И приемнику и мне действительно до фонаря какие там значения по старту были в этих 300 байтах, которые я не пишу. Что мне теперь инициализировать их каким-то автоматом только чтобы симулятор их понял, мне что заняться нечем? В реальном устройстве я их буду анализировать только если буду писать, но передаю я их всегда!

 

 

П.С. Есть пример по-проще: стартует любая ПЛИС с несбрасываемой и не инициализированной RAM памятью. Зачача - посчитать CRC буфера RAM по старту и выдать! Как просимулировать такой синтезированны(или P&R) проект?

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

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


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

Приемник принимает 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;

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


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

Как вариант - в начале теста заполнить весь блок 0, а потом перейти к основному тесту.

'X' для OTP плисок можно рассматривать как любую случайную величину, либо как неопределенное состояние(для ram необходимо отдельно узнавать, для триггеров - однозначное значение только после инициализации). В этом случае лучше заложить в ваш проект автоматическую инициализацию блока памяти по сбросу в значение 0.

 

PS: поведение правильного исходного кода не должно отличаться от поведения синтезированной/разведенной схемы. отличие д.б. только в задержках.

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


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

TRILLER

 

Все это понятно, и требует дополнительной логики в проект.

 

Хотелось бы решение, не требующие изменения железа.

А то как-то глупо получается вмешиваться в проект, чтобы угодить какому то там симулятору.

 

 

Нашел я тут начальную инициализацию памяти в Modelsim, только долго это все получиться ибо инициализировать надо банок 20. Вот бы сразу в verilog писать директивы для начальной инициализации при симуляции и чтобы синтезатор тащил эту инфу через синтезируемые файлы или хотябы создавал дополнительные, а то как то криво все это! Приходится сидеть искать как он назвал эти банки на сколько штук их разложил как они называются и где лежат и в ручную иничиализировать. Попробую все жэто конечно в скрипт загнать, но как мы все знаем при малейшем изменении проекта все пути и названия линий меняются так что хз.

 

Ну собственно что это я - это все и есть проблемы синтеза ПЛИС :angry2:.

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


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

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'));

Это начальная инициализация нулём. Она не требует дополнительной логики)). Я, если честно, так не делаю - предпочитаю всё жёстко контролировать. Но для модели самое оно. На верилог, я думаю, есть аналог.

Не понимаю, если честно, в чём затруднение?

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


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

Не понимаю, если честно, в чём затруднение?

Начальная инициализация в verilog и VHDL само собой есть.

Но только при симуляции етого самого verilog или VHDL.

 

Как только вы синтезируете код в RTL для какой-либо конкретной ПЛИС то все инициализации действуют если архитектура ПЛИС это приемлит. Если не приемлит то все инициализируется в "X" для симулятора, в реальной ПЛИС начальные значения памяти и регистров устанавливается случайным образом.

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

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


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

Здравствуйте, Уважаемые форумчане.

 

Делаю проект для ПЛИС Actel Axcelerator.

Плиска однократная. Инициализации памяти по старту нет!

 

Синтез делаю в Synplify. Симуляцию в Modelsim.

 

Симуляция кода работает нормально. При симуляции синтезированного проекта все валится из-за неизвестного начального значения ячеек RAM.

 

В некоторых местах проблем это не создает, т.к. алгоритмы работают только с теми ячейками памяти в которые пишутся данные в процессе работы.

 

Но есть блоки проекта, которые лопатят все ячейки RAM непрерывно и они не могут работать с сигналами типа "xxxx" - валится все кругом.

 

Наворачивать к каждому RAM - блоку автомат записи нуля по старту не хочется, к тому же времянку изменит!

 

Может кто-нибудь решал уже такую задачу?

 

Кроме как использовать доплнительный блок инициализации, другого способа нет. Тем более надо учитывать, что в железе состояние памяти будет, так же, неопределенным. С большой долей вероятности в памяти будут нули, но не факт.

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


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

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

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

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

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

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

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

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

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

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