Создание LUT и инициализация с помощью .coe для ModelSim/QuestaSim

Фон

Для этого LUT нужна ширина 32 и глубина 256.

Итак, у меня есть LUT, созданный IP-ядром. Теперь я хочу сам создать его экземпляр, чтобы он работал в симуляторе (это также помогает мне самому узнать все параметры). Я делал это много раз для FIFO, но никогда раньше не создавал LUT, поэтому, пожалуйста, проверьте, что я сделал, выглядит правильно. Я просто хочу создать LUT значений и иметь возможность читать их обратно. Я использовал блок оперативной памяти для этого.

Я пробовал на двух разных компьютерах с:

QuestaSim-64 10.2c_5
ModelSim SE-64 10.1b

Проблема

Так что я могу скомпилировать код. Когда я пытаюсь открыть его:

vsim work.top

Он открывает IDE и зависает на:

# Loading unisim.rb36_internal_vhdl(rb36_internal_vhdl_v)#1

Если я удалю:

INIT_FILE => "lut.coe",

Потом загружается нормально. Так что я знаю, что эта линия ломает его.

ЛУТ:

Итак, у меня есть LUT, это выглядит правильно для вас? Существуют ли другие способы создания LUT с файлом .coe?

lut : RAMB36E1 
generic map(
    INIT_FILE => "lut.coe",
    READ_WIDTH_A => 36
    )
port map
    (
    addrardaddr => addr_lut,
    addrbwraddr => X"0000",
    cascadeina => '0',
    cascadeinb => '0',
    clkardclk => clk_i,
    clkbwrclk => clk_i,
    diadi => X"00000000",
    dibdi => X"00000000",
    dipadip => X"0",
    dipbdip => X"0",
    doado => data_lut,
    enarden => '1',
    enbwren => '0',
    injectdbiterr => '0',
    injectsbiterr => '0' ,
    regceb => '0',
    regcearegce => '1',
    rstramarstram => rst_i,
    rstramb => rst_i,
    rstregarstreg => rst_i ,
    rstregb => rst_i,
    wea => X"0",
    webwe =>  X"00"   
    );

Пробовал заменить вышеуказанное на 18 КБ ОЗУ, та же ошибка:

# Loading unisim.rb18_internal_vhdl(rb18_internal_vhdl_v)#2

ЛУТ:

lut : RAMB18E1 -- Simple Duel Port mode, 512 deep
generic map(
    INIT_FILE => "lut.coe",
    RAM_MODE => "SDP"
    )
port map
    (
    addrardaddr => addr_lut,
    addrbwraddr => "00000000000000",
    clkardclk => clk_i,
    clkbwrclk => clk_i,
    diadi => X"0000",
    dibdi => X"0000",
    dipadip => "00",
    dipbdip => "00",
    doado => data_lut_b,
    dobdo => data_lut_a,
    enarden => '1',
    enbwren => '0',
    regceb => '0',
    regcearegce => '1',
    rstramarstram => rst_i,
    rstramb => rst_i,
    rstregarstreg => rst_i ,
    rstregb => rst_i,
    wea => "00",
    webwe =>  X"0"   
    );

person fiz    schedule 30.07.2015    source источник
comment
Использование специфичных для устройства примитивов очень ограничено. Я бы предложил использовать общее описание, если это возможно. Это решение также может использоваться симуляторами без поддержки примитивов конкретного поставщика.   -  person Paebbels    schedule 31.07.2015


Ответы (2)


Серьезно. Выбросьте ядро ​​IP и файл COE. ((Если это единственное место, где хранятся ваши данные, не выбрасывайте их!)

Subtype Data_Word is std_logic_vector(31 downto 0);
Type Lut_Type is Array(0 to 255) of Data_Word;
Constant Lut : Lut_Type := (
 0 => X"00000001",
 1 => X"00000002",
...
17 => X"DEADBEEF",
others => (others => 'X') );

Подставьте, конечно, свой коэффициент. Чтобы получить бонусные баллы, используйте скрипт или даже программу на C или VHDL для чтения файла COE и записи приведенного выше фрагмента VHDL.

Работа выполнена.

Его можно синтезировать, моделировать и переносить на другие ПЛИС.

(ИМХО, проблема переносимости является настоящей причиной для IP-ядер большинства поставщиков. Но я сделаю исключение для сложных ядер, таких как интерфейсы памяти PCIe или DDR.)

person user_1818839    schedule 30.07.2015
comment
На самом деле я выбрасываю IP-ядро, но решил, что могу переработать файл .coe. Спасибо, я посмотрю это завтра утром, когда мой мозг будет менее жареным - person fiz; 30.07.2015
comment
Синтаксис файла COE - person ; 30.07.2015
comment
Я думаю, с помощью вышеуказанного метода - инструменты все еще генерируют мне блок RAMB - person fiz; 30.07.2015
comment
Обычно так и было. Если он по какой-то причине отказывается, (а) проверьте свою конвейерную обработку - вам нужен регистр на его адрес или выход (BRAM синхронный) и (б) в документации есть атрибут (что-то вроде attribute RAMSTYLE of Lut is "BRAM";), который должен принудительно это сделать. Я не помню, чтобы этот атрибут был необходим, но это полезно знать. - person user_1818839; 31.07.2015

Для инструментов Xilinx существует простой и короткий способ чтения файлов *.mem или *.hex непосредственно в VHDL. Содержимое файла можно использовать в моделировании и синтезе в качестве инициализации BlockRAM.

Xilinx предлагает пример кодирования в UG901 на странице 124:

type RamType is array(0 to 7) of bit_vector(31 downto 0);

impure function InitRamFromFile (RamFileName : in string) return RamType is
  FILE RamFile : text is in RamFileName;
  variable RamFileLine : line;
  variable RAM : RamType;
begin
  for I in RamType'range loop
    readline (RamFile, RamFileLine);
    read (RamFileLine, RAM(I));
  end loop;
  return RAM;
end function;

signal RAM : RamType := InitRamFromFile("rams_20c.data");

Пример относится к ОЗУ, но его можно легко преобразовать в ПЗУ (LUT), если удалить порт записи и заменить сигнал константой.

Более продвинутую реализацию можно найти, например, в PoC. .mem.ocrom.sp. Эта реализация также работает с sltsyncrams Altera, которые csn читают файлы *.mif.

person Paebbels    schedule 30.07.2015
comment
Спасибо, это действительно хороший альтернативный ответ. Хотя я написал короткий скрипт, который генерирует приведенный выше LUT, который я попробую в первую очередь. Если это сработает, я попробую это позже, так как это выглядит немного более общим = D - person fiz; 31.07.2015
comment
Я забыл упомянуть, как выглядит формат файла *.mem: n строк для n слов памяти, поэтому 1 строка на слово памяти; каждое слово памяти кодируется шестнадцатеричными символами ASCII. - person Paebbels; 31.07.2015
comment
Хорошим способом использования этого ответа было бы адаптировать функцию для прямого чтения файлов .coe, пропустить ненужные строки, а затем извлечь коэффициенты из полезных строк. - person user_1818839; 31.07.2015
comment
@fiz Не стесняйтесь расширять ocrom для чтения новых форматов файлов :) - person Paebbels; 31.07.2015
comment
Ура, поскольку файл .coe на данный момент исправлен, я просто скопировал значения из него, но я попытаюсь использовать это в будущих проектах, если мне это понадобится =) - person fiz; 03.08.2015