====== Синтез Xilinx FPGA в пакетном режиме ====== Разработчики FPGA обычно пользуются графическими оболочками типа Xilinx ISE или Aldec Active-HDL. Но существует также возможность запуска транслятора в пакетном режиме, что имеет определённые преимущества. Например, при длительном сопровождении проекта возникает необходимость пересборки системы из исходных текстов на другом компьютере или на другой версии синтезатора. При диалоговом режиме возникают проблемы с восстановлением нужных режимов синтезатора (а их сотни). Второе преимущество - возможность отслеживания изменений в конфигурации синтезатора. При пакетном запуске все настройки режимов синтезатора хранятся в текстовом виде, что даёт возможность сравнения версий в SVN. Диалоговые оболочки обычно хранят настройки в бинарном виде, и сравнение версий не работает. ====== Синтез для Xilinx ====== Подробно процесс синтеза описан в статье [[http://www.compitech.ru/html.cgi/arhiv/02_03/stat_132.htm | Валерия Зотова]]. ===== xst ===== Синтезатор XST (расшифровывается как Xilinx Synthesis Technology) преоразует исходное описание на языке высокого уровня в список логических цепей (netlist). [[http://toolbox.xilinx.com/docsan/xilinx8/books/data/docs/xst/xst0001_1.html | Документация на сайте Xilinx]]. На входе нужно создать файл параметров синтеза и файл-список модулей на языке Verilog. Файл параметров синтеза "project.xst": run -top regfile -p xc3s500e-fg320-5 -opt_mode Speed -opt_level 1 -ifn project.src -ifmt mixed -ofn project.ngc -ofmt NGC Файл со списком модулей исходного Verilog-кода "project.src": verilog work regs.v verilog work alu.v verilog work bus.v verilog work uart.v Запуск синтезатора: xst -ifn project.xst -ofn project.log -intstyle silent В результате порождаются следующие файлы: * project.ngc --- список логических цепей проекта * project.log --- отчет о результатах процесса синтеза ===== ngdbuild ===== Утилита NGDBuild преобразует файл NGC в файл формата NGD, описывающий схему в виде элементарных логических элементов (И, ИЛИ, декодеры, триггеры и память). [[http://toolbox.xilinx.com/docsan/data/alliance/dev/dev2.htm | Документация на сайте Xilinx]]. Кроме файла NGC, требуется также файл топологических ограничений UCF. В частности, в нем задается привязка сигналов к ножкам микросхемы, например файл "pins.ucf": NET "clk" LOC = "A10"; NET "reg_wr" LOC = "A3"; NET "reg_a[0]" LOC = "A4"; NET "reg_a[1]" LOC = "A5"; NET "reg_a[2]" LOC = "A6"; (и т. д.) При запуске необходимо указать также тип микросхемы: ngdbuild -p xc3s500e-fg320-5 project.ngc -uc pins.ucf В результате порождаются следующие файлы: * project.ngd --- описание проекта на низком логическом уровне * project.bld --- отчет о результатах процесса ===== map ===== Утилита MAP отображает схему из файла NGD, представленную в виде элементарных логических элементов, на компоненты заданной конкретной микросхемы программируемой логики. Результат записывается в файл NCD (Native Circuit Description) --- физическое представление проекта в компонентах данного чипа Xilinx FPGA. [[http://toolbox.xilinx.com/docsan/data/alliance/dev/dev6.htm | Документация на сайте Xilinx]]. При запуске необходимо указать тип микросхемы. Флаг "-pr b" разрешает размещать триггеры как в i-, так и в o-регистрах: map -pr b -p xc3s500e-fg320-5 project В результате порождаются следующие файлы: * project.nсd --- физическое представление схемы в компонентах конкретного чипа * project.mrp --- отчет о результатах процесса * project.pcf --- ограничения схемы для трассировщика PAR * project.ngm * project_usage.xml ===== par ===== Трассировщик PAR читает файл NСD, производит размещение компонентов и трассировку соединений. Также используется файл ограничений PCF, порожденный утилитой MAP. Результат записывается в другой файл в вормате NCD (Native Circuit Description). [[http://toolbox.xilinx.com/docsan/data/alliance/dev/dev10.htm | Документация на сайте Xilinx]]. При запуске флаг "-w" разрешает перезаписывать существующие файлы: par -w project project_r.ncd В результате порождаются следующие файлы: * project_r.ncd --- схема с размещением и трассировкой * project_r.par --- отчет о результатах процесса * project_r.unroutes --- список неоттрассированных путей * project_r.pad --- информация о ножках ввода-вывода * project_r_pad.csv --- то же в формате CVS * project_r_pad.txt --- то же в текстовом формате ===== trce ===== Утилита TRCE (Timing Reporter and Circuit Evaluator) производит временной анализ синтезированной схемы. [[http://toolbox.xilinx.com/docsan/data/alliance/dev/dev12.htm | Документация на сайте Xilinx]]. Вызов: trce -v 25 project_r.ncd project.pcf Порождается файл: * project_r.twr --- отчет анализа временных ограничений ===== bitgen ===== Утилита BITGEN читает файл NCD и выдает файл прошивки для загрузки в чип FPGA. [[http://toolbox.xilinx.com/docsan/data/alliance/dev/dev13.htm | Документация на сайте Xilinx]]. При запуске флаг "-w" разрешает перезаписывать существующие файлы, флаг "-l" включает создание файла "project_r.ll": bitgen project_r.ncd -l -w ФЛАГИ Флаги задают конфигурацию микросхемы, например: -g TdoPin:PULLNONE \ -g DonePin:PULLUP \ -g CRC:enable \ -g StartUpClk:CCLK Порождается файл: * project_r.bit --- прошивка в бинарном виде * project_r.bgn --- отчет о результатах процесса * project_r.ll --- описание размещения отдельных логических элементов в битовом потоке прошивки ===== Обобщающий Makefile ===== Все эти этапы синтеза можно объединить в одном файле Makefile. DESIGN = regfile SRC = regfile.v DEVICE = xc3s500e-fg320-5 BGFLAGS = -g TdoPin:PULLNONE -g DonePin:PULLUP \ -g CRC:enable -g StartUpClk:CCLK all: $(DESIGN).bit clean: rm -f *~ cleanall: clean rm -rf build $(DESIGN).bit build/project.src: @[ -d build ] || mkdir build @rm -f $@ for i in $(SRC); do echo verilog work ../$$i >> $@; done build/project.xst: build/project.src echo "run" > $@ echo "-top $(DESIGN)" >> $@ echo "-p $(DEVICE)" >> $@ echo "-opt_mode Speed" >> $@ echo "-opt_level 1" >> $@ echo "-ifn project.src" >> $@ echo "-ifmt mixed" >> $@ echo "-ofn project.ngc" >> $@ echo "-ofmt NGC" >> $@ build/project.ngc: build/project.xst $(SRC) cd build && xst -ifn project.xst -ofn project.log -intstyle silent build/project.ngd: build/project.ngc pins.ucf cd build && ngdbuild -p $(DEVICE) project.ngc -uc ../pins.ucf build/project.ncd: build/project.ngd cd build && map -pr b -p $(DEVICE) project build/project_r.ncd: build/project.ncd cd build && par -w project project_r.ncd build/project_r.twr: build/project_r.ncd cd build && trce -v 25 project_r.ncd project.pcf $(DESIGN).bit: build/project_r.ncd build/project_r.twr cd build && bitgen project_r.ncd -l -w $(BGFLAGS) @mv -f build/project_r.bit $@