Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
ModelSim. С чего начать. / ПЛИС / Сообщество EasyElectronics.ru

ModelSim. С чего начать.

ModelSim довольна мощная среда для симуляции и отладки программ на HDL языках. Лично я, использую ее, как платформо-независимую среду для изучения языка VHDL. При своей относительно скромной ресурсоемкости эта среда отлично подходит для разработки описаний алгоритмов работы цифровых устройств, при этом она может быть подключена к системам проектирования на ПЛИС и использована как мощный отладчик, вместо, довольно скромных по возможностям, встроенных симуляторов. Бесплатную студенческую версию ModelSim PE можно скачать с сайта www.model.com.
Начнем по порядку с самого начала.

1. Создаем проект.

Для создания проекта необходимо открыть программу и выбрать File -> New -> Project.

Откроется окно диалога создания проекта. Заполняем необходимые поля и нажимаем OK.

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

Я выбираю создание нового файла. Появиться следующее окно. Заполняем форму и наживаем OK.

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

Все, заготовка проекта готова, щелкаем два раза по названию файла в окне Project, откроется окно Source, в него надо писать наш код. Начинаем ваять.

2. Написание и компиляция программы.

В качестве примера введу в окно Source такой код(дешифратор):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity DC is
  Generic(H_A : integer := 2; P_C : integer := 7);
    Port ( P_IN : in  STD_LOGIC_VECTOR (H_A downto 0);
			  SEL_EN : in std_logic;
           P_OUT : out  STD_LOGIC_VECTOR (P_C downto 0));
end DC;

architecture Behavioral of DC is

begin
P1 :process(P_IN,SEL_EN)
variable TEMP : std_logic_vector(P_C downto 0):= (others => '0');
begin
	if (SEL_EN = '1') then
	TEMP := (others => '0')
	TEMP(conv_integer(P_IN)) := '1';
	P_OUT <= TEMP;
	else
		P_OUT <= "11111111";
	end if;
end process;
end Behavioral;

в нем есть одна ошибка, специально сделал.
Для того, чтобы проверить на ошибки код, необходимо его скомпилировать. Для этого, сначала сохраняем файл, находясь в окне Source нажимаем File -> Save или кнопку на панели инструментов. Потом нажимаем в окне Project на правую кнопку на нашем файле выбираем из правого контекстного меню Compile -> Compile selected

Сразу измениться статус нашего файла и в окне Transcript появиться сообщение об ошибке. Для того, чтобы найти и исправить ошибку щелкаем два раза на сообщение об ошибке. Увидим окно с описанием и месте ошибки.

Щелкаем по описанию ошибки два раза. Подсветится место ошибки в окне Source. Судя по описанию ошибки не хватает точки с запятой перед подсветившейся строкой. Исправляем, сохраняем файл и компилируем еще раз. Получаем приятное сообщение зелененьким цветов в окне Transcript, компиляция выполнена успешно.

3. Создание Testbench

Для проверки функционирования алгоритма нашего устройства необходимо создать испытательный стенд, который представляет собой еще один объект проекта, но без портов. В его архитектуре мы декларируем наше ранее написанное устройство как компонент, подключаем к нему воздействующие сигналы и проверяем его поведение. В ModelSim довольно мощная система шаблонов, сделаем испытательный стенд с их помощью. Для этого вызовем окно шаблонов. Находясь в окне Source выбираем из меню Source -> Show Language Templates. Слева появиться дополнение к окну Source.

Щелкаем два раза по Create Testbench. Появиться окно мастера создания испытательного стенда. Выполняем необходимые шаги.


В результате проделанных действий увидим, что в наш проект был добавлен файл с испытательным стендом. Если оставили все галочки в настройках, то он откроется автоматом и будем примерно такого содержания:
LIBRARY ieee  ; 
USE ieee.std_logic_1164.all  ; 
USE ieee.std_logic_arith.all  ; 
USE ieee.STD_LOGIC_UNSIGNED.all  ; 
ENTITY dc_tb  IS 
  GENERIC (
    H_A  : INTEGER   := 2 ;  
    P_C  : INTEGER   := 7 ); 
END ; 
 
ARCHITECTURE dc_tb_arch OF dc_tb IS
  SIGNAL SEL_EN   :  STD_LOGIC  ; 
  SIGNAL P_IN   :  std_logic_vector (H_A downto 0)  ; 
  SIGNAL P_OUT   :  std_logic_vector (P_C downto 0)  ; 
  COMPONENT DC  
    GENERIC ( 
      H_A  : INTEGER ; 
      P_C  : INTEGER  );  
    PORT ( 
      SEL_EN  : in STD_LOGIC ; 
      P_IN  : in std_logic_vector (H_A downto 0) ; 
      P_OUT  : out std_logic_vector (P_C downto 0) ); 
  END COMPONENT ; 
BEGIN
  DUT  : DC  
    GENERIC MAP ( 
      H_A  => H_A  ,
      P_C  => P_C   )
    PORT MAP ( 
      SEL_EN   => SEL_EN  ,
      P_IN   => P_IN  ,
      P_OUT   => P_OUT   ) ; 
END ; 

Как видим из текста, был создан новый объект проекта, в декларативной части архитектуры объявлено наше устройство в виде компонента, а так же все необходимые сигналы. В теле архитектуры объявлено наше устройство и к нему подключены все необходимые сигналы. Осталось только задать воздействия. Это делаем так же при помощи шаблонов.Помещаем курсор в окне Source в конце тела архитектуры, в окне шаблонов выбираем Stimulus Generators -> Counter. Далее настраиваем по собственному вкусу в соответствии с картинками. В моем случае имя и разрядность сигнала счетчика совпадает с P_IN.




В результате всех манипуляций получим такой код:

signal clk: std_logic; -- пока отбрасываем, потом станет понятно почему
signal reset: std_logic; -- в декларативную часть
signal P_IN: std_logic_vector(2 downto 0); -- можно отбросить, так как уже задекларировано ранее при создании TestBench
      process_P_IN: process (clk) -- весь процесс закидываем в тело архитектуры, перед словом END
      begin
      	if (clk'event and clk = '1') then
      		if (reset = '1') then
      			P_IN <= (others => '0');
      		else
      			P_IN <= P_IN + 1;
      		end if;
      	end if;
      end process;


Доведем использование шаблонов до абсурда и сделаем еще тактовый сигнал для счетчика с использованием шаблона. Выбираем Stimulus Generators -> Clock и настраиваем сигнал.

Получим код:

signal clk: BIT := '0'; -- в декларативную часть
clk <= not clk after 50 ns; -- в тело архитектуры

Осталось добавить в в тело архитектуры уставновку сигналов reset и SEL_EN
reset <= '0';
SEL_EN <= '1';
и поправить декларацию сигнала счетчика P_IN, присвоив ему определенное начальное состояние
SIGNAL P_IN   :  std_logic_vector (H_A downto 0) := "000" ;

В итоге получим следующий код испытательного стенда:
LIBRARY ieee  ; 
USE ieee.std_logic_1164.all  ; 
USE ieee.std_logic_arith.all  ; 
USE ieee.STD_LOGIC_UNSIGNED.all  ; 
ENTITY dc_tb  IS 
  GENERIC (
    H_A  : INTEGER   := 2 ;  
    P_C  : INTEGER   := 7 ); 
END ; 
 
ARCHITECTURE dc_tb_arch OF dc_tb IS
  SIGNAL SEL_EN   :  STD_LOGIC  ; 
  SIGNAL P_IN   :  std_logic_vector (H_A downto 0) := "000" ; -- нужно поправить для того, чтобы заработал счетчик в моделировании 
  SIGNAL P_OUT   :  std_logic_vector (P_C downto 0)  ; 
  signal reset: std_logic;
  signal clk: BIT := '0';
  COMPONENT DC  
    GENERIC ( 
      H_A  : INTEGER ; 
      P_C  : INTEGER  );  
    PORT ( 
      SEL_EN  : in STD_LOGIC ; 
      P_IN  : in std_logic_vector (H_A downto 0) ; 
      P_OUT  : out std_logic_vector (P_C downto 0) ); 
  END COMPONENT ; 
BEGIN
  DUT  : DC  
    GENERIC MAP ( 
      H_A  => H_A  ,
      P_C  => P_C   )
    PORT MAP ( 
      SEL_EN   => SEL_EN  ,
      P_IN   => P_IN  ,
      P_OUT   => P_OUT   ) ;
clk <= not clk after 50 ns;
reset <= '0';
SEL_EN <= '1';
process_P_IN: process (clk)
begin
	if (clk'event and clk = '1') then
		if (reset = '1') then
			P_IN <= (others => '0');
		else
			P_IN <= P_IN + 1;
		end if;
	end if;
end process;
    
END ; 

Сохраняем файл и компилируем. Ошибок быть не должно.

4. Моделирование работы

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

Запуститься симуляция. В зависимости от настроек могут быть видны различные окна. Их расположение можно сохранять и сбрасывать при помощи меню Layout. Сначала можем получить какой нибудь такой вид. Все окна можно влючить и выключить через меню View

В ModelSim довольно много окон, но нас пока будут интересовать следующие окна:
  • Wave — окно построения временных диаграмм
  • Structure — окно структуры проекта, показывает иерархию проекта, при выборе любой структуры в остальных окнах будут отображаться ее данные
  • Objects — окно сигналов, здесь отображаются сигналы выбранного объекта проекта
  • Processes — показывает существующие процессы и их статус
  • Dataflow — структура процессов, отображает схему протекания данных
В ModelSim поддерживается Drag and Drop, по этому можно перетаскивать элементы из одного окна в другое. Для начала, перетащим из окна сигналов, интересующие нас сигналы, на временную диаграмму. Для того, чтобы было удобней следить за сигналами счетчика, установим форму представления сигнала P_IN беззнаковым десятичным. Для этого из правого контекстного меню выберем Radix -> Unsigned

Дальше найдите на панели инструментов и настройте время моделирования.

Меняйте время на свое усмотрение и запускайте на моделирование.
Если все сделали правильно, то получим результат:

Найдите панель инструментов с маркерами и добавте один маркер

Кстати, менять сигналы прямо в режиме симуляции, можно нажимая на правую кнопку на сигналах в окне Wave и выбирая из правого контекстного меню Clock, Force, NoForce.
Теперь попробуем посмотреть структуру процессов нашего проекта. Сделаем следующее, выберем верхний уровень иерархии в окне Stucture и нажмем Add -> To Dataflow -> All items in design
В окне DataFlow получим схему протекания данных, если установить маркер Wave и двигать им, то в DataFlow будут отображаться изменения.

Для того чтобы сделать окно плавающим нужно нажать кнопку в правом верхнем углу любого окна.
Для того чтобы выйти из режима моделирования, нажимаем Simulate -> End Simulation.

Вот как бы и все.
  • +1
  • 28 ноября 2011, 18:32
  • opolo84

Комментарии (20)

RSS свернуть / развернуть
еще не читал, но уже нравится. Все в тему :)
здорово, что активность в теме ПЛИС ненулевая )))
0
Интересно, а вот можно, как в 9-ом квартусе, просто нарисовать waveform и просимулировать?
Просто testbench — это хорошо и круто, но для мелких проектов проще нарисовать входные сигналы…
0
Не знаю, наверное нет. Но смысла рисовать сигналы не вижу, это дольше получиться чем описывать.
0
Может быть ))
Надо потренироваться )))
Хотя я всё равно юзаю Icarus-Verilog. И мне хватает ))
0
можно. для этого в окне wave есть кнопка edit mode. только вроде она работает с теми сигналами, которые были созданы в ручную, те через create wave
0
Да, здорово, надо будет поковыряться, изучить.
0
Рисовать на сколько знаю не получится, да и зачем? проще описать все что нужно, ИМХО быстрее получится, тем более, что в последних версиях квартуса вас все равно отправят симулировать в моделсим.
Зато в моделсим много вариантов, как написать тестбенч:
1) Например, можно писать исполнаяемые do-файлы на TCL или сразу в консоли
Беру пример из головы:
force clk 0 0ns, 1 {70ns} –repeat 100ns;
такая команда генерирует сигнал clk как повторяющуюся последовательность импульсов с периодом 100 нс и длительностью «0» — 70 нс, «1» — 30 нс
Как это делать, можно глянуть здесь: fpga.in.ua/fpga/cad-pld/verilog-basics-laboratory-works/lr1-znakomstvo-so-sredoj-modelirovaniya-modelsim.html
2) Можно средствами языка HDL- создавать простенькие тестебенчи
(та же секция initial в Verilog), я не говорю уже о системных функциях (например, $display, $write в том же Verilog)

3) Cложные тестбенчи и верификацию проектов можно делать с использованием СИ с помощью VPI/PLI или DPI.
0
Рисовать на сколько знаю не получится, да и зачем? Проще описать все что нужно, ИМХО быстрее получится, тем более, что в последних версиях квартуса вас все равно отправят симулировать в моделсим.
Зато в Modelsim много вариантов, как написать тестбенч:
1) Например, можно писать исполнаяемые do-файлы на TCL или сразу в консоли
Беру пример из головы:
force clk 0 0ns, 1 {70ns} –repeat 100ns;
такая команда генерирует сигнал clk как повторяющуюся последовательность импульсов с периодом 100 нс и длительностью «0» — 70 нс, «1» — 30 нс
Как это делать, можно глянуть здесь: fpga.in.ua/fpga/cad-pld/verilog-basics-laboratory-works/lr1-znakomstvo-so-sredoj-modelirovaniya-modelsim.html
2) Можно средствами языка HDL- создавать простенькие тестебенчи
(та же секция initial в Verilog), я не говорю уже о системных функциях (например, $display, $write в том же Verilog)

3) Cложные тестбенчи и верификацию проектов можно делать с использованием СИ с помощью VPI/PLI или DPI.
0
Рисовать на сколько знаю не получится, да и зачем? Проще описать все что нужно, ИМХО быстрее получится, тем более, что в последних версиях квартуса вас все равно отправят симулировать в моделсим.
Зато в Modelsim много вариантов, как написать тестбенч:
1) Например, можно писать исполнаяемые do-файлы на TCL или сразу в консоли
Беру пример из головы:
force clk 0 0ns, 1 {70ns} –repeat 100ns;
такая команда генерирует сигнал clk как повторяющуюся последовательность импульсов с периодом 100 нс и длительностью «0» — 70 нс, «1» — 30 нс
Как это делать, можно глянуть здесь.
2) Можно средствами языка HDL- создавать простенькие тестебенчи
(та же секция initial в Verilog), я не говорю уже о системных функциях (например, $display, $write в том же Verilog)

3) Cложные тестбенчи и верификацию проектов можно делать с использованием СИ с помощью VPI/PLI или DPI.
0
прошу прощения, сайт тупит, коммент продублировался, не знаю, как удалить лишние
0
Вроде понял что к чему… Надо будет поэкспериментировать…
Спасибо.
0
А есть для ПЛИСа что-нибудь такое чтобы не код писать, а самому из лог. элементов схему составлять?)
0
Да, думаю что любая среда от производителей, поддерживает схемотехнический ввод. Те же ISE и Quartus. Только как раз назначение языка HDL уйти от схемотехнического проектирования. Схемотехнический ввод, нужен больше для сборки различных функциональных узлов на высоком уровне иерархии, а собирать схемы из простых логических элементов — это рыть котлован палкой-копалкой.
0
Одна строчка кода Verilog может заменить тебе целую логическую функцию собранную из десятков элементов.
0
Некропостер детектед.
-1
эм… what? 0.0
Значит теперь если я наткнусь на какую либо статью через гугл интересующую меня, которая будет старше 1/2 года да еще и оставлю там коммент, то должен быть подвержен анафеме?
0
Zero Post detected!
0
Всем привет.
Возможно мой вопрос может показать дурацким, но всё же.
В статье есть упоминание о Testbench и то, чтобы его создать для проекта, надо нажать Source -> Show Language Templates.
Но, к сожалению, у себя в ModelSim этот пункт не нашёл.
Использую (точнее пытаюсь использовать:)) ModelSim ALTERA STARTER EDITION 10.4d

Как мне добавить Testbench?
0
Вот как раз так, как автор делает, т.е. в ручном режиме, я бы работать и не советовал. Можете здесь же мою статью «Геморрой под названием ...» прочитать. Но с ней вполне вменяемо можно работать (особенно в больших и сложных проектах) с помощью скриптов и батников. Также удобно входные воздействия (например, сигналы) готовить в Матлабе. Сейчас готовлю статью на эту тему на этот ресурс, доделаю — выложу.
0
Вопрос в тему:

Возможно ли из Quartus «Simulator Waveform Editor» (University Program VWF) нарисованные там сигналы перенести в ModelSim?

Не могу разобраться если возможно это сделать через пункт в нем же «Simulate/GEnerate ModelSim Testbench and Script»
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.