Симуляция MAX II UFM в ModelSim

симуляция maxii_ufm в modelsim altera

Вопрос: "Как симулировать с помощью ModelSim проекты, содержащие компонент UFM (User Flash Memory) микросхемы MAX II".

Краткий ответ: "Нужно использовать Verilog модели этого компонента". Модель UFM входит в состав ModelSim – Altera, вот эту модель нужно брать и использовать в процессе симуляции.

Попробуем просимулировать какой нибудь из «Марсоходовских» проектов. Возьмем, например, проект AVR процессора и попробуем его в ModelSim. Когда-то давно я делал тестирование этого проекта встроенным симулятором Altera Quartus II v9. Потом Altera удалила встроенный симулятор из комплекта Quartus II. Остался только ModelSim. С помощью ModelSim я этот проект никогда раньше не симулировал.

Итак, возьмем наш проект микроконтроллера Reduced AVR вот здесь:

Reduced AVR, v2 ( 41875 bytes )
. Проект содержит собственно «ядро» процессора, который может опрашивать кнопочки платы Марсоход, может управлять восьмью светодиодами. Программа для процессора хранится в памяти UFM. Чтения из этой памяти мы и будем симулировать.

1. После разархивирования проекта открываем его с помощью Altera Quartus II. Для просмотра проекта выбираем в меню View => Utility Windows => Project Navigator. В открывшемся окне навигатора проекта выбираем «max2» и открывается схема проекта.

Схема процессора AVR

2. Мы не можем симулировать схемотехнические файлы в ModelSim. Нужно преобразовать нашу схему, которая является модулем самого верхнего уровня, в файл Verilog. Это можно сделать вручную – просто заново написать top-level на Verilog. А можно попробовать конвертировать схему в модуль Verilog автоматическими средствами. Среда Altera Quartus II содержит такой инструмент. Посмотрим как он работает. В принципе, преобразование схемы в описание на Verilog не представляет ни какой проблемы. Это можно делать однозначно. Итак, мы смотрим на схему, представленную файлом max2.bdf. Выбираем пункт меню File => Create / Update => Create HDL Design File from Current File… Появляется диалоговое окно, предлагающее создать VHDL или Verilog файл.

Создать Verilog файл по схеме

Я выбираю Verilog max2.v файл. После того, как файл создан, его нужно открыть в среде Quartus II через пункты меню File => Open.

3. Объявим новый файл max2.v файлом самого верхнего уровня через пункты меню Project => Set as Top-Level Entity.

4. Пробуем откомпилировать квартусом ( через пункты меню Processing => Start Compilation ). Странно, но проект не откомпилировался. Видимо случился один из багов самого Quartus II. При преобразовании схемы в файл верилога он сгенерировал такой код, который сам не может откомпилировать. Вот это чудеса. Смотрю на сообщения об ошибках (меню Viev => Utility Windows => Messages ). Ошибки выдаются на строки вот такого вида:

assign    f4 = {port2,port2,port2,port2,port2,port2,port2,port2,port2,port2}[5];

Действительно это несколько странная запись. По схеме должно быть вот так:

assign    f4 = {
  port2[5],port2[5],port2[5],
  port2[5],port2[5],port2[5],
  port2[5],port2[5],port2[5],port2[5] };

Исправляю все эти ошибки. После этих исправлений проект нормально компилируется. Теперь у нас есть всесь проект написаный полностью на Verilog и не содержащий схем. Можно пробовать симулировать?

5. Запускаю ModelSim-Altera Starter Edition. Дальше стараюсь все делать по инструкции, которую я написал когда-то давно. В ModelSim перехожу в папку проекта rAVR (меню File => Change Directory… ), пытаюсь откомпилировать с помощью ModelSim все Verilog файлы проекта и заодно создать библиотеку для симуляции (меню Compile => Compile… ). Тут меня ждет другое удивление. Среда ModelSim выдает сообщения об ошибках компиляции. Видимо Altera Quartus II и ModelSim по разному интерпретируют мой код Verilog, или я просто не знаю как назначить версию спецификации Verilog для компилятора. Все сообщения об ошибках касаются того случая, что переменная или регистр используются раньше, чем объявлены.

6. Будем исправлять исходники. Просто перенесу объявления в начало файла rAVR.v. Открываю файл rAVR.v в Quartus II для редактирования. Тихо ругаюсь. Файл когда-то был написан в Quartus II v9. Некоторые комментарии по тексту были на русском языке. Теперь Quartus II v11 показывает русские буквы кракозябрами. Ну вот кто скажет, почему? Буду исправлять в редакторе notepad++. Тем более, что он делает подсветку синтаксиса Verilog вполне приятную. Значит перенес объявления wire opcode_ready, addr_inc, fix_result в начало файла. Теперь ModelSim компилирует нормально.

7. Теперь давайте еще раз посмотрим внимательно на иерархию проекта. Наш файл верхнего уровня содержит модуль флеш памяти UFM под названием altufm_none1. Этот модуль описан в двух файлах altufm_none1.v и altufm_none_bb.v – оба этих файла созданы с помощью Altera Megafunction Wizard. При этом altufm_none_bb.v нам совершенно бесполезен, так как содержит только объявление модуля и больше ничего. Если случайно altufm_none_bb.v был включен в библиотеку Work для ModelSim, то удалите его, а затем перекомпилируйте altufm_none1.v.

8. Конечно нам для симуляции проекта нужен tesbench. Напишем, что-то совсем простое, вроде вот этого:


`timescale 1ns / 1ns;

module testbench();

reg clk;
initial
  clk=0;

always
  #10 clk = ~clk;

reg [3:0]key;

initial
begin

  key = 4'b1111;
  #100000;
  $finish;
end

wire [9:0]f0;
wire [9:0]f1;
wire [9:0]f2;
wire [9:0]f3;
wire [9:0]f4;
wire [9:0]f5;
wire [7:0]led;

max2 max2inst(
  .clock100Mhz(clk),
  .key(key),
  .f0(f0), .f1(f1), .f2(f2),
  .f3(f3), .f4(f4), .f5(f5),
  .led(led)
);

endmodule


Такой тестбенч содержит только экземпляр «чипа» max2 с подключенными генератором, кнопочками и светодиодами. В общем модель платы Марсоход в миниатюре. Тестбенч так же должен быть прикомпилирован к библиотеке Work средствами ModelSim (меню Compile => Compile… потом выбираем нужный файл).

9. Попробуем симулировать. Выбираем в меню ModelSim пункты Simulate => Start Simulation… Появляется диалоговое окно, где нужно выбрать наш тестбенч в нашей библиотеке Work.

ModelSim выбираем testbench

Что мы видим: симуляция не может быть проведена, так как не найден модуль maxi_ufm. Вот как выглядит сообщение об ошибке в ModelSim:

#         Region: /testbench/max2inst/b2v_inst13
# Loading work.altufm_none1
# Loading work.altufm_none1_altufm_none_kes
# ** Error: (vsim-3033) C:/common/ravr/max2ravr2/max2ravr2/altufm_none1.v(125): Instantiation of 'maxii_ufm' failed. The design unit was not found.
#         Region: /testbench/max2inst/b2v_inst14/altufm_none1_altufm_none_kes_component
#         Searched libraries:
#             C:\common\ravr\max2ravr2\max2ravr2\work
# Loading work.rAVR
# ** Warning: (vsim-3009) [TSCALE] - Module 'rAVR' does not have a `timescale directive in effect, but previous modules do.
#         Region: /testbench/max2inst/b2v_inst8
# Error loading design
# Load canceled


Таким образом, видно, что нам нужна модель памяти UFM. Если поискать по папкам, где установлен сам ModelSim, то легко можно найти файл maxi_atoms.v, который и содержит модель maxi_ufm.

10. Самый простой способ использования модели UFM – это скопировать файл maxi_atoms.v из комплекта ModelSim в папку нашего проекта, затем добавить его в библиотеку Work и откомпилировать. У меня этот файл maxi_atoms.v находится в папке c:\altera\10.0\modelsim_ase\altera\verilog\src. У себя вы его сами легко найдете.

Можно ли теперь после добавления модели симулировать? К сожалению опять нет. Точнее симулировать можно, но ничего толком не увидите. Это из-за того, что некоторые регистры в модулях проекта не имеют назначенного начального состояния, а некоторое устанавливаются в начальное состояние по сигналу сброса, который не используется и присоединен к земле. Нужно исправить это в исходниках проекта.

11. Собственно для успешной симуляции нужно указать, что регистры ip и ufm_counter изначально находятся в нуле (файл rAVR.v):

reg [5:0]ufm_counter=0;
reg [8:0]ip=0;


Кроме этого, в файле div_clk.v нужно внести аналогичное изменение для регистра cnt:

reg [3:0]cnt=0;

Вот эти изменения и были сделаны мной сейчас в оригинальном проекте.
Для реальной ПЛИС это не очень важно, так как по умолчанию регистры при старте чипа и так находятся в нуле. А вот для симуляции нужно либо явно указывать, либо иметь для модулей сигнал асинхронного сброса reset. Иначе симулятор не сможет просчитать состояние всех зависящих от неопределенной переменной сигналов.

12. Симуляция. Выбираю пункты меню Simulate => Start Simulation…

Выбираю testbench.v После этого, добавляю интересующие меня сигналы модуля UFM к просмотру на Waveform. Запускаю симулятор командой run 20000 в командной строке ModelSim или в меню Simulate => Run => Run 100

Вот то, что я вижу:

Симуляция в ModleSim

Первая команда, считанная процессором из UFM (User Flash Memory) – это 0xE800. Все так и есть, это правильно – последовательность команд программы описана в avr_prog.mif файле (Memory Initialization File). Там действительно первая команда 0xE800. Рассматривая дальше можно видеть, как процессор выбирает команды из памяти и делает условные переходы. Память UFM вообще-то имеет последовательный интерфейс, так что какой-то конвейер в процессоре вы не увидите, слишком медленно идет обращение к памяти программы. Тем не менее, видно, что симуляция поекта с помощью ModelSim вполне возможна.

Весь уже исправленный проект с библиотекой Work для ModelSim можно взять здесь:

Надеюсь эта статья поможет вам симулировать более сложные проекты, содержащие модели сторонних производителей.

 

 

 

Добавить комментарий