Продолжение. Начало в№ 10'2008
Процесс разработки проекта
для ПЛИС в пакете Actel Libero IDE
Сергей КАРПОВ
karpov@actel.ru
В этой части статьи рассказано о процессе создания симуляции RTL-модели. К сожалению, многие уделяют ему недостаточно внимания, считая, что могут быстрее отладить проект непосредственно на плате, а симуляцию считают пустой тратой времени.
Симуляцию можно осуществлять двумя способами — графическим, используемым по умолчанию, с помощью WaveFormer, и созданием собственной симу-ляционной модели с помощью HDL-редактора и/или в SmartDesign. Симуляционную модель еще называют тестбенчем (test bench). По сути, тестбенч — это такой же проект, но более высокого уровня, который включает в себя модель проекта и модули окружения, формирующие входные тестовые воздействия на него.
Конфигурация симуляции проекта
В меню «Проект» (Project) выберите пункт «Настройки». В открывшемся окне нужно выбрать закладку «Симуляция» (Simulation) или в окне процесса проектирования (ProjectFlow) нажать на кнопке Simulation на стрелочку в верхнем левом углу или кликнуть правой кнопкой мыши на этой кнопке и в выпадающем меню выбрать «Опции» (Options). Откроется окно настройки проекта с открытой закладкой настройки симуляции (рис. 1).
По умолчанию все настройки сделаны для симуляции тестбенча, созданного в WaveFormer. Командный файл DO для загрузки проекта
Рис. 2. Схема верхнего уровня проекта
в ModelSim и модуль верхнего уровня test bench создаются автоматически.
Рассмотрим процесс симуляции на примере небольшого проекта (рис. 2). Он включает в себя умножитель частоты PLL_S_10to40, формирующий из входной частоты 10 МГц внутреннюю 40 МГц, четырехразрядный счетчик Cntr4 и компаратор cmp4_with5, на выходе которого формируется активный уровень, если значение на выходе счетчика равно 5, и схему И (and2), формирующую сигнал сброса из внешнего сигнала рестарта и сигнала LOCK PLL.
Создание симуляционной модели (тестбенча)
WaveFormer — графический редактор, позволяющий прорисовывать временную диаграмму входных воздействий (рис. 3). Сделать
это можно несколькими способами. Во-первых, можно непосредственно рисовать диаграмму, выбирая при помощи кнопок вверху тип (одиночный сигнал или шина) и состояние сигнала до и после перехода (переход в высокое или низкое, в высокоомное или неопределенное состояние).
Тактовый сигнал можно сформировать автоматически. Для этого выделите сигнал правой клавишей и выберите в окне Signal(s)<->Clock(s) (рис. 4). Предварительно убедитесь, что не выделено других сигналов. Если какой-либо сигнал или сигналы выделены, то снимите выделение, кликнув левой клавишей мыши на этих сигналах.
Создать или изменить диаграмму сигнала можно также через панель свойств сигнала (рис. 5). Для этого выделите правой клавишей сигнал и выберите Edit Selected Signal(s). Откроется панель Signal Properties («Свойст-
Рис. 1. Панель настройки симуляции
Рис. 3. Окно редактирования WaveFormer
Signals) <■> ОосЦі)
Save
Save As...
Г
Рис. 4. Редактирование временной диаграммы сигналов
Непосредственно тестовый модуль, включающий модуль проекта и тестовые модули:
module testbench;
parameter SYSCLK_PERIOD = 100; // 10MHz
reg SYSCLK; reg NSYSRESET;
initial
begin
SYSCLK = 1'b0;
NSYSRESET = 1'b0;
end
Signal Properties
Name: | POWERDOWN Г Active Low
________________| Analog Props... | Grid Lines...
<• Drive
E(*jabon Entry | verfog | VHDt |
Typ< locofcan Eqn -• | . . (SiGl end 5IG2) d . 5
I--------------------------------------------3jJ
Oodc | Undocked 3 Edge/level: [pos 3
Set: | Not Used ^ ctear: | Not Used Tj
Clock ЕпаЫе: | Not Used | Advanced Renter... |
Г” Use Waveform from Library
Wfm Eqn | 18ns-Z (5-1 5-0)*5 9-« 9-L S-V5-Х T] Label Eqn | | Hex(Inc(0(2,5)j T]
F? Export Sgnal Direction: | output jr]
Г Analog Display See Ratio: [Г"
Signal Type: |4_**e 3
Radix: [hex 3 eusMS8:| LSB= [
Г Fafeng Edge SensÄve Г~ Rising Edge Senstive OK I Cancel I Apply I Prev |
Рис. S. Панель свойств сигнала
ва сигнала»). Здесь вы можете изменить сам сигнал, задать задержки переключения по отношению к выбранному сигналу или сигналам и многое другое. Выбрав закладки Verilog или VHDL, можно описать поведение сигнала на одном из этих языков.
После того как формирование диаграммы входных воздействий завершено, сохраните ее и затем конвертируйте, выбрав в меню Import/Export -> Export Timing Diagram As.... В открывшемся окне экспорта выберите тип файла — Verilog или VHDL, в зависимости от выбранного языка проекта, и сохраните файл. Закройте WaveFormer.
Разберем файл тестбенча, сгенерированный пакетом. Приведем листинг файла, в котором формируются частота и сигнал сброса:
//////////////////////////////////////////////////////////////////////
// Created by Actel SmartDesign Tue Oct 07 11:54:49 2008
//////////////////////////////////////////////////////////////////////
Задаем разрешение:
'timescale 1ns/100ps
Тестовый модуль, формирующий сигнал рестарта:
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii // Reset Pulse
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
initial
begin
#(SYSCLK_PERIOD * 10 )
NSYSRESET = 1'b1;
end
Тестовый модуль, формирующий тактовый сигнал:
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii 10MHz Clock Driver iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii always @(SYSCLK)
#(SYSCLK_PERIOD i 2) SYSCLK <= !SYSCLK;
Непосредственно модуль проекта:
//////////////////////////////////////////////////////////////////////
// Instantiate Unit Under Test: rtl_l1
//////////////////////////////////////////////////////////////////////
rtl_l1 rtl_l1_O (
// Inputs
.Aclr({1{1'bO}}), !!! Сигнал рестарта не подключен
к входу рестарта модуля проекта!!!
.Clock(SYSCLK), Тактовый сигнал подключается
к тактовому входу модуля проекта
// Outputs
.AEB(
// Inouts V
); 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/pre-compiled/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. Временная диаграмма работы будет создана для выбранного модуля. Можно создать тестбенч для выбранного модуля самостоятельно, способом, аналогичным уже описанному. Только модуль тестбенча нужно создавать для выбранного модуля. ■
Продолжение следует