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

Начнем по порядку с самого начала.
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 — структура процессов, отображает схему протекания данных

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

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

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

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

Для того чтобы сделать окно плавающим нужно нажать кнопку

Для того чтобы выйти из режима моделирования, нажимаем Simulate -> End Simulation.
Вот как бы и все.
- +1
- 28 ноября 2011, 18:32
- opolo84
Интересно, а вот можно, как в 9-ом квартусе, просто нарисовать waveform и просимулировать?
Просто testbench — это хорошо и круто, но для мелких проектов проще нарисовать входные сигналы…
Просто testbench — это хорошо и круто, но для мелких проектов проще нарисовать входные сигналы…
- PPetrovich
- 28 ноября 2011, 20:22
- ↓
Может быть ))
Надо потренироваться )))
Хотя я всё равно юзаю Icarus-Verilog. И мне хватает ))
Надо потренироваться )))
Хотя я всё равно юзаю Icarus-Verilog. И мне хватает ))
- PPetrovich
- 28 ноября 2011, 21:29
- ↑
- ↓
Рисовать на сколько знаю не получится, да и зачем? проще описать все что нужно, ИМХО быстрее получится, тем более, что в последних версиях квартуса вас все равно отправят симулировать в моделсим.
Зато в моделсим много вариантов, как написать тестбенч:
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.
Зато в моделсим много вариантов, как написать тестбенч:
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.
Рисовать на сколько знаю не получится, да и зачем? Проще описать все что нужно, ИМХО быстрее получится, тем более, что в последних версиях квартуса вас все равно отправят симулировать в моделсим.
Зато в 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.
Зато в 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.
Рисовать на сколько знаю не получится, да и зачем? Проще описать все что нужно, ИМХО быстрее получится, тем более, что в последних версиях квартуса вас все равно отправят симулировать в моделсим.
Зато в 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.
Зато в 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.
А есть для ПЛИСа что-нибудь такое чтобы не код писать, а самому из лог. элементов схему составлять?)
Да, думаю что любая среда от производителей, поддерживает схемотехнический ввод. Те же ISE и Quartus. Только как раз назначение языка HDL уйти от схемотехнического проектирования. Схемотехнический ввод, нужен больше для сборки различных функциональных узлов на высоком уровне иерархии, а собирать схемы из простых логических элементов — это рыть котлован палкой-копалкой.
Всем привет.
Возможно мой вопрос может показать дурацким, но всё же.
В статье есть упоминание о Testbench и то, чтобы его создать для проекта, надо нажать Source -> Show Language Templates.
Но, к сожалению, у себя в ModelSim этот пункт не нашёл.
Использую (точнее пытаюсь использовать:)) ModelSim ALTERA STARTER EDITION 10.4d
Как мне добавить Testbench?
Возможно мой вопрос может показать дурацким, но всё же.
В статье есть упоминание о Testbench и то, чтобы его создать для проекта, надо нажать Source -> Show Language Templates.
Но, к сожалению, у себя в ModelSim этот пункт не нашёл.
Использую (точнее пытаюсь использовать:)) ModelSim ALTERA STARTER EDITION 10.4d
Как мне добавить Testbench?
Вот как раз так, как автор делает, т.е. в ручном режиме, я бы работать и не советовал. Можете здесь же мою статью «Геморрой под названием ...» прочитать. Но с ней вполне вменяемо можно работать (особенно в больших и сложных проектах) с помощью скриптов и батников. Также удобно входные воздействия (например, сигналы) готовить в Матлабе. Сейчас готовлю статью на эту тему на этот ресурс, доделаю — выложу.
Комментарии (21)
RSS свернуть / развернуть