Процесс разработки проекта для ПЛИС в пакете Actel Libero IDE. Часть II

№ 11’2008
PDF версия
В этой части статьи рассказано о процессе создания симуляции RTL-модели. К сожалению, многие уделяют ему недостаточно внимания, считая, что могут быстрее отладить проект непосредственно на плате, а симуляцию считают пустой тратой времени.

Все статьи цикла:

Симуляцию можно осуществлять двумя способами — графическим, используемым по умолчанию, с помощью
WaveFormer, и созданием собственной симуляционной модели с помощью HDL-редактора и/или в SmartDesign. Симуляционную
модель еще называют тестбенчем (test bench).
По сути, тестбенч — это такой же проект,
но более высокого уровня, который включает в себя модель проекта и модули окружения, формирующие входные тестовые воздействия на него.

Конфигурация симуляции проекта

В меню «Проект» (Project) выберите пункт
«Настройки». В открывшемся окне нужно выбрать закладку «Симуляция» (Simulation) или
в окне процесса проектирования (ProjectFlow)
нажать на кнопке Simulation на стрелочку
в верхнем левом углу или кликнуть правой
кнопкой мыши на этой кнопке и в выпадающем меню выбрать «Опции» (Options). Откроются окно настройки проекта с открытой закладкой настройки симуляции (рис. 1).

Рис. 1. Панель настройки симуляции

По умолчанию все настройки сделаны для
симуляции тестбенча, созданного вWaveFormer.
Командный файл DO для загрузки проекта
в ModelSim и модуль верхнего уровня test
bench создаются автоматически.

Рис. 2. Схема верхнего уровня проекта

Рассмотрим процесс симуляции на примере небольшого проекта (рис. 2). Он включает в себя умножитель частоты PLL_S_10to40,
формирующий из входной частоты 10 МГц
внутреннюю 40 МГц, четырехразрядный счетчик Cntr4 и компаратор cmp4_with5, на выходе которого формируется активный уровень, если значение на выходе счетчика равно 5, и схему И (and2), формирующую сигнал
сброса из внешнего сигнала рестарта и сигнала LOCK PLL.

Создание симуляционной модели
(тестбенча)

WaveFormer — графический редактор, позволяющий прорисовывать временную диаграмму входных воздействий (рис. 3). Сделать
это можно несколькими способами. Во-первых, можно непосредственно рисовать диаграмму, выбирая при помощи кнопок вверху
тип (одиночный сигнал или шина) и состояние сигнала до и после перехода (переход в высокое или низкое, в высокоомное или неопределенное состояние).

Рис. 3. Окно редактирования WaveFormer

Тактовый сигнал можно сформировать автоматически. Для этого выделите сигнал правой
клавишей и выберите в окне Signal(s)Clock(s)
(рис. 4). Предварительно убедитесь, что не
выделено других сигналов. Если какой-либо
сигнал или сигналы выделены, то снимите
выделение, кликнув левой клавишей мыши
на этих сигналах.

Рис. 4. Редактирование временной диаграммы сигналов

Создать или изменить диаграмму сигнала
можно также через панель свойств сигнала
(рис. 5). Для этого выделите правой клавишей сигнал и выберите Edit Selected Signal(s).
Откроется панель Signal Properties («Свойства сигнала»). Здесь вы можете изменить сам
сигнал, задать задержки переключения по отношению к выбранному сигналу или сигналам и многое другое. Выбрав закладки Verilog
или VHDL, можно описать поведение сигнала на одном из этих языков.

Рис. 5. Панель свойств сигнала

После того как формирование диаграммы
входных воздействий завершено, сохраните
ее и затем конвертируйте, выбрав в меню
Import/Export -> Export Timing Diagram As….
В открывшемся окне экспорта выберите тип
файла — Verilog или VHDL, в зависимости от
выбранного языка проекта, и сохраните файл.
Закройте WaveFormer.

Разберем файл тестбенча, сгенерированный
пакетом. Приведем листинг файла, в котором
формируются частота и сигнал сброса:

//////////////////////////////////////////////////////////////////////
// Created by Actel SmartDesign Tue Oct 07 11:54:49 2008
//////////////////////////////////////////////////////////////////////

Задаем разрешение:

`timescale 1ns/100ps

Непосредственно тестовый модуль, включающий модуль проекта и тестовые модули:

module testbench;

parameter SYSCLK_PERIOD = 100; // 10MHz

reg SYSCLK;
reg NSYSRESET;

initial
begin

  SYSCLK = 1’b0;
    NSYSRESET = 1’b0;
end

Тестовый модуль, формирующий сигнал
рестарта:

//////////////////////////////////////////////////////////////////////
// Reset Pulse
//////////////////////////////////////////////////////////////////////
initial
begin
  #(SYSCLK_PERIOD * 10 )
    NSYSRESET = 1’b1;
end

Тестовый модуль, формирующий тактовый сигнал:

//////////////////////////////////////////////////////////////////////
// 10MHz Clock Driver
//////////////////////////////////////////////////////////////////////
always @(SYSCLK)
  #(SYSCLK_PERIOD / 2) SYSCLK <= !SYSCLK;

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

//////////////////////////////////////////////////////////////////////
// Instantiate Unit Under Test: rtl_l1
//////////////////////////////////////////////////////////////////////
rtl_l1 rtl_l1_0 (
  // Inputs
.Aclr({1{1’b0}}),

.Clock(SYSCLK),

// Outputs
.AEB( )

// Inouts


!!! Сигнал рестарта не подключен
к входу рестарта модуля проекта!!!
Тактовый сигнал подключается
к тактовому входу модуля проекта
);

endmodule

Сразу заметим, что сигналы тактовой частоты и рестарта в генерируемом модуле
тестбенча всегда имеют название SYSCLK
и NSYSRESET соответственно. Если в модуле проекта входами являются непосредственно тактовые и цепи сброса, например, вход
PLL или сброса триггера, то они автоматически будут соединены с тактовыми сигналами
тестбенча. Но если цепи не явно глобальные
(например, как в нашем примере: сигнал рестарта подключен к входу POWERDONE
PLL), то автоматически сигнал не будет подключен, и симуляция будет неправильная.
Править файл тестбенча не имеет смысла, так
как при первом же изменении и перегенерации проекта этот файл будет восстановлен,
и цепи снова окажутся отключены. Исправления нужно вносить в проект. Желательно,
чтобы на верхнем уровне они имели названия SYSCLK и NSYSRESET. Тогда одноименные цепи автоматически соединятся.

Командный файл загрузки проекта

Подключаем библиотеки, устанавливаем
рабочую директорию и проверяем, что библиотеки еще не загружены:

quietly set ACTELLIBNAME proasic3
quietly set PROJECT_DIR “D:/Work/HDL_PRJ/msim_edu”

if {[file exists presynth/_info]} {

  echo “INFO: Simulation library presynth already exists”
} else {
  vlib presynth
}
vmap presynth presynth
vmap proasic3 “C:/Actel/Libero_v8.4/Designer/lib/modelsim/precompiled/
vlog/proasic3”

Загружаем и компилируем в ModelSim
файлы проекта и файл тестбенча:

vlog -work presynth “${PROJECT_DIR}
/smartgen/PLL_S_10to40/PLL_S_10to40.v”
vlog -work presynth “${PROJECT_DIR}/smartgen/cntr4/cntr4.v”
vlog -work presynth “${PROJECT_DIR}
/smartgen/cmp4_with5/cmp4_with5.v”
vlog -work presynth “${PROJECT_DIR}
/component/work/rtl_l1/rtl_l1.v”
vlog -work presynth “$
/ {PROJECT_DIR}/component/work/msim_edu_top/msim_edu_top.v”
vlog “+incdir+${PROJECT_DIR}/component/work/msim_edu_top”
-work presynth “${PROJECT_DIR}
/component/work/msim_edu_top/testbench.v”

Запускаем симуляцию на 1000 нс:

vsim -L proasic3 -L presynth -t 1ps presynth.testbench
add wave /testbench/*
run 1000ns

В окне Project Flow пакета Libero IDE на
кнопке Stimulus Editor кликнем правой клавишей мыши или левой клавишей нажимаем на стрелку в левом верхнем углу этой
кнопки. В открывшемся меню выбираем
Organize Stimulus…. В открывшейся панели
в правом окне выбираем файл testbench.v
и добавляем его в проект симуляции, нажав
кнопку Add. Он переместится в правое окно.

Создание проекта симуляции завершено.
Можно запускать симулятор, для чего нужно
нажать в окне Project Flow кнопку ModelSim.

Подобный способ создания модели для симуляции удобен, когда входные воздействия
относительно просты и известны заранее.
Однако при создании сложной верификационной модели, где входное воздействие зависит от выходного или входной сигнал имеет сложный алгоритм, модель удобнее создавать в виде RTL-модели более высокого
уровня, в которой RTL-модель проекта является одним из модулей.

Создадим в Smart Design проект симуляции
и назовем его, например, msim_edu_top_tb.

После того, как проект симуляции успешно создан и сгенерирован, необходимо сконфигурировать симулятор, чтобы запускался
наш проект симуляции, а не создаваемый по
умолчанию модуль тестбенча. Для этого
кликните правой клавишей мыши на кнопке Simulation или левой на стрелке в верхнем
левом углу кнопки и в меню выберите пункт
Options…. На открывшейся панели снимите
галочку напротив параметра Use automatic
DO File. В поле напротив User defined DO File
введите имя своего командного файла или
нажмите на кнопку с тремя точками и в открывшемся окне найдите и выберите свой
DO-файл. DO — это командный файл, определяющий параметры ифайлы для симуляции.
В нем, например, определяется рабочая директория, проверяется, что симуляция еще не запущена, и т. д., а также перечисляются файлы
для симуляции. Его нужно создать заранее. Это
можно сделать самостоятельно, а можно пойти на маленькую хитрость. Сначала создайте симуляцию по умолчанию, а вWaveFormer
задайте только тактовый сигнал. Будет создан
автоматически файл run.do, который появит-
ся в Simulation File в окне Design Explorer.
Откройте этот файл, кликнув дважды левой клавишей мыши на имени. Измените
две строчки в конце файла, заменив наименование файла симуляции по умолчанию
testbench.vhd и путь к нему в строчке:

vcom -93 -explicit -work presynth “${PROJECT_DIR}
/stimulus/testbench.vhd”

На имя вашего файла симуляции путь, как
правило, следующий:

/component/work/<имя файла симуляции>/

А в строчке:

vsim -L proasic3 -L presynth -t 1ps presynth.testbench

замените testbench на имя вашего файла симуляции без расширения.
Затем сохраните файл с новым именем,
выбрав в меню File пункт Save run.do As….
Это название файла введите на панели настройки симуляции в поле User defined DO File.
После того, как введены все параметры на панели настройки, нажмите кнопку OK.

Затем нажмите правой клавишей мыши на
кнопке Stimulus Editor и выберите пункт Organize
Stimulus. На открывшейся панели в правом окне должно находиться имя только вашего файла симуляции. При необходимости, добавьте его
из левого окна и удалите файл симуляции, созданный по умолчанию, из правого.

Теперь можно запускать симуляцию.

Проверить работу в симуляции можно не
только для верхнего уровня проекта, но и любого блока. Для этого необходимо в окне Design
Explorer выбрать соответствующий модуль
и запустить WaveFormer, нажав на кнопку в окне Project Flow. Временная диаграмма работы
будет создана для выбранного модуля. Можно создать тестбенч для выбранного модуля
самостоятельно, способом, аналогичным уже
описанному. Только модуль тестбенча нужно
создавать для выбранного модуля.

Процесс разработки проекта для ПЛИС в пакете Actel Libero IDE. Часть III

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *