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

ModelSim и отрицательные числа в .mif файлах

Всем привет. Столкнулся с тем, что Modelsim отказывается читать отрицательные числа в .mif файлах. Квартус нормально читает. Заполнение файла верное, версия Modelsim 10.1d.

 

Пример mif файла:

 


   -- Matlab generated Memory Initialization File (.mif)
   -- Created on: 03-Jun-2017

 WIDTH = 18;
 DEPTH = 512;

 ADDRESS_RADIX = UNS;
 DATA_RADIX    = DEC;

 CONTENT BEGIN
   0 : 0;
   1 : 0;
   2 : 0;
   3 : 0;
   4 : 0;
   5 : 0;
   6 : 0;
   7 : 0;
   8 : 0;
   9 : 0;
   10 : 0;
   11 : 0;
   12 : 0;
   13 : 0;
   14 : 0;
   15 : 0;
   16 : 0;
   17 : 13749;
   18 : 0;
   19 : 8849;
   20 : 0;
   21 : 3949;
   22 : 0;
   23 : -950;
   24 : 0;
   25 : 33349;
......

   END;

 

На этот файл Modelsim выдает такую ошибку:

# ERROR: D:/matlab/new.mif, line 34, Invalid Altera-mif record.

 

34 строка - первое встретившееся в списке отрицательное число.

 

Сейчас извращаюсь с переводом в бинарный вид в Matlab'e и потом пишу в mif. Это Modelsim кушает на ура.

 

Где я допускаю ошибку? Возможно с какой-то определенной версии Modelsim'a появилась поддержка отрицательных чисел в mif?

 

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


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

А при чём тут лично ModelSim? Он понятия не имеет ни о каких mif-файлах. Mif-файлы читаются в IP-ядрах. Как ядро написано, так ModelSim и работает.

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


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

Сейчас извращаюсь с переводом в бинарный вид в Matlab'e и потом пишу в mif. Это Modelsim кушает на ура.

 

Где я допускаю ошибку? Возможно с какой-то определенной версии Modelsim'a появилась поддержка отрицательных чисел в mif?

А почему просто не открыть в квартусе миффайл и не сохранить в формате хекс?

Или еще проще - на первой строке файла кликнуть правой кнопкой мыши и выбрать формат в Memory radix.

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


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

А при чём тут лично ModelSim? Он понятия не имеет ни о каких mif-файлах. Mif-файлы читаются в IP-ядрах. Как ядро написано, так ModelSim и работает.

 

ящитаю, что это ModelSim, т.к. Quartus вполне спокойно поедает mif-файлы c десятичными отрицательными числами. Однако ModelSim упорно выдает ошибку (пример в первом посте). Имеется ли различие в ip-ядрах ModelSim и Quartus? Устанавливались они вместе, так что подразумевается, что используются одинаковые ip-ядра, библиотеки и т.д. Если не прав - подскажите, пожалуйста.

 

А почему просто не открыть в квартусе миффайл и не сохранить в формате хекс?

Или еще проще - на первой строке файла кликнуть правой кнопкой мыши и выбрать формат в Memory radix.

 

Спасибо, об этом как-то не подумал даже. Не догадался :biggrin: Так гораздо проще. Но все равно вопрос открыт - почему Quartus умеет в отрицательные числа, а Modelsim - нет? Ведь это не что-то из-ряда вон выходящее и сложное.

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


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

ящитаю, что это ModelSim
Вы можете щетать что угодно.

пример в первом посте
Там не написано, в каком модуле происходит ошибка.

Устанавливались они вместе, так что подразумевается, что используются одинаковые ip-ядра, библиотеки и т.д.
Откуда ваш Моделсим знает про модели IP-ядер Квартуса? Вы сами компилировали эти библиотеки?

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


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

Вы можете щетать что угодно.

 

Хорошо)

 

Там не написано, в каком модуле происходит ошибка.

 

Приведен в качестве примера файл mif. Memory Initialization File. Если не ошибаюсь, они используются только в модулях, связанных с памятью. Причем, чаще всего, именно для ROM памяти. Могу ошибаться.

Конкретно этот файл используется для инициализации ROM памяти ip-ядра Quartus'a 13.1, 64-битная версия. Я посчитал, что такие подробности не понадобятся, прошу прощения. :laughing:

 

Откуда ваш Моделсим знает про модели IP-ядер Квартуса? Вы сами компилировали эти библиотеки?

 

Как я уже говорил, Моделсим был установлен совместно с Квартусом, из одного источника, т.е. предполагается, что они связаны друг с другом, общие библиотеки и т.д. В скрипте для запуска симуляции Моделсим подключены библиотеки альтеры:

vsim +initreg+0 +initmem+0 -novopt -L altera_mf_ver tb

 

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

И как компилировать библиотеки для Модельсима я представляю достаточно смутно :biggrin:

 

 

 

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


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

Приведен в качестве примера файл mif. Memory Initialization File. Если не ошибаюсь, они используются только в модулях, связанных с памятью. Причем, чаще всего, именно для ROM памяти. Могу ошибаться.

Конкретно этот файл используется для инициализации ROM памяти ip-ядра Quartus'a 13.1, 64-битная версия. Я посчитал, что такие подробности не понадобятся, прошу прощения. :laughing:

Мне это ни о чём не говорит. При возникновении ошибки МоделСим пишет, в каком модуле произошла ошибка. Типа такого:

#    Time: 1155 ns  Iteration: 1  Process: /xxx_tb/line__201 File: /home/zzz/work/project/tb/xxx_tb.vhd

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

vsim +initreg+0 +initmem+0 -novopt -L altera_mf_ver tb

А, тут Verilog. Предупреждать надо.

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


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

MIF-файл подсовывается альтеровскому IP-ядру. Моделсим же, при симуляции (или компиляции - не помню уже) генерит из вашего MIF-а файла файл с расширением .ver, и уже его потом использует при симуляции.

Ничего прописывать не надо - все делается и подсасывается само.

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


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

Насколько я вижу в task convert_mif2ver, отрицательные числа действительно не поддерживаются:

                else if (r == `MINUS)
                begin
                    r = $fgetc(ifp);
                    if (r == `MINUS)
                    begin
                        // Ignore all the characters which which is part of comment.
                        r = $fgetc(ifp);

                        while ((r != `NEWLINE) && (r != `CARRIAGE_RETURN))
                        begin
                            r = $fgetc(ifp);

                        end

                        if ((r == `NEWLINE) || (r == `CARRIAGE_RETURN))
                        begin
                            line_no = line_no +1;

                            if ((buffer == "contentbegin") && (get_address_data_pairs == `FALSE))
                            begin
                                get_address_data_pairs = `TRUE;
                                get_address = `TRUE;
                                buffer = "";
                            end
                        end
                    end
                    else
                    begin
                        error_status = `TRUE;
                        $display("ERROR: %0s, line %0d, Invalid Altera-mif record.", in_file, line_no);
                        done = `TRUE;
                        disable READER;
                    end
                end

То есть парсер таков, что если после минуса идёт ещё один минус, то это начало комментария. Если после минуса идёт любой другой символ, то это ошибка формата.

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


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

Насколько я вижу в task convert_mif2ver, отрицательные числа действительно не поддерживаются:

 

...

 

То есть парсер таков, что если после минуса идёт ещё один минус, то это начало комментария. Если после минуса идёт любой другой символ, то это ошибка формата.

 

Ого, спасибо большое! Теперь все гораздо понятнее стало. Еще и появился вариант, что можно посмотреть, когда ломается то, что не должно. Кстати, скажите, пожалуйста, вашу версию Modelsim или Questa, для статистики, так сказать.

 

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


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

Кстати, скажите, пожалуйста, вашу версию Modelsim или Questa, для статистики, так сказать.
Версия тут ни при чём. Я просто открыл 220model.v, идущий с Квартусом, и посмотрел код. Этот код будет работать одинаково во всех симуляторах.

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


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

Всем привет. Столкнулся с тем, что Modelsim отказывается читать отрицательные числа в .mif файлах. Квартус нормально читает. Заполнение файла верное, версия Modelsim 10.1d.

 

Где я допускаю ошибку? Возможно с какой-то определенной версии Modelsim'a появилась поддержка отрицательных чисел в mif?

Можно пойти и другим путем...

Забейте параметрами чтение mif для симулятора

 

если параметр simulate == "Yes"

 

то следующее только для симулятора

// synthesis translate_off

reg [7:0] mem[0:255];

$readmemh("my_init_file.dat", mem, 0, 255); // что-то вроде этого

// synthesis translate_on

 

в противном случае

(* ram_init_file = "my_init_file.mif" *) reg [7:0] mem[0:255];

 

 

 

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


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

Можно пойти и другим путем...

Забейте параметрами чтение mif для симулятора

 

если параметр simulate == "Yes"

 

то следующее только для симулятора

// synthesis translate_off

reg [7:0] mem[0:255];

$readmemh("my_init_file.dat", mem, 0, 255); // что-то вроде этого

// synthesis translate_on

 

в противном случае

(* ram_init_file = "my_init_file.mif" *) reg [7:0] mem[0:255];

 

Спасибо за идею, скорее всего, так и поступлю.

 

В продолжение темы - на досуге поковырял библиотеки sim_lib/220model.v Quartus'ов. Поддержки отрицательных чисел в mif-файлах нет вплоть до Quartus'a 16.0. Версии старше не смотрел - пока нет времени. Если кто-то их пользует(16.1 - 17.0) - можно посмотреть их новые библиотеки, мб там что-то новое придумали и добавили поддержку. Буду благодарен за информацию :smile3046:

А еще было бы круто узнать, можно ли так делать у Xilinx. Просто для общего развития.

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


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

А еще было бы круто узнать, можно ли так делать у Xilinx. Просто для общего развития.
У Xilinx mif-файл представляет из себя исключительно список чисел в двоичном формате. Никаких ADDRESS_RADIX и подобного там нет. Но этот файл пользователю не виден. Он генерируется из coe-файла, который является входным для CoreGen. Формат coe-файла имени Xilinx похож на формат mif-файла имени Altera. https://www.xilinx.com/itp/xilinx10/isehelp...file_syntax.htm

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


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

Спасибо за идею, скорее всего, так и поступлю.

 

В продолжение темы - на досуге поковырял библиотеки sim_lib/220model.v Quartus'ов. Поддержки отрицательных чисел в mif-файлах нет вплоть до Quartus'a 16.0. Версии старше не смотрел - пока нет времени. Если кто-то их пользует(16.1 - 17.0) - можно посмотреть их новые библиотеки, мб там что-то новое придумали и добавили поддержку. Буду благодарен за информацию :smile3046:

А еще было бы круто узнать, можно ли так делать у Xilinx. Просто для общего развития.

Для "общего развития" могу рассказать по скайпу... Мой адрес - в личной карточке...

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


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

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

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

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

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

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

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

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

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

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