Ни на одном из форумов, которые я смог найти, мне не задавали вопросов, и я не смог найти, как это сделать, используя документацию GHDL. Очевидно, у меня недостаточно репутации, чтобы задать вопрос GHDL в SuperUser (у них нет тегов), поэтому я должен спросить здесь.
Я пытаюсь смоделировать ядро DSP, которое содержит несколько самописных ядер vhdl, а также несколько ядер Xilinx coregen с использованием GHDL. Я должен признать, что я довольно новичок в GHDL, но не новичок в VHDL. Я знаю, что логика рассматриваемого ядра и тестового стенда верна, поскольку она хорошо моделируется с использованием ISim. Однако у программы есть свои ограничения, поэтому я хочу попробовать GHDL.
Тем не менее, GHDL, похоже, не справляется с имитацией компилятора Xilinx FIR из-за отсутствия файла фильтра.
Я настраиваю свою среду моделирования, используя приведенные ниже фрагменты Makefile.
#GHDL CONFIG
GHDL_CMD = ghdl
GHDL_FLAGS = --ieee=synopsys --warn-no-binding
# vhdl filebase
SRCBASE = ../../../source
ISEBASE = /opt/Xilinx/14.7/ISE_DS/ISE/vhdl/src
####################
# import all the necessary source files
# first the external libraries
$(GHDL_CMD) -i $(GHDL_FLAGS) --work=unisim $(ISEBASE)/unisims/{,primitive/}*.vhd
$(GHDL_CMD) -i $(GHDL_FLAGS) --work=ieee_proposed $(ISEBASE)/ieee_proposed/*.vhd
$(GHDL_CMD) -i $(GHDL_FLAGS) --warn-no-library --work=xilinxcorelib $(ISEBASE)/XilinxCoreLib/*.vhd
# then the components roughly in the right order
# (the order actually does not matter, since the analysis step generates the correct order)
mkdir work
$(GHDL_CMD) -i $(GHDL_FLAGS) --work=work $(SRCBASE)/coregen/*.vhd
$(GHDL_CMD) -i $(GHDL_FLAGS) --work=work $(SRCBASE)/pcie/pkg_types.vhd
$(GHDL_CMD) -i $(GHDL_FLAGS) --work=work $(SRCBASE)/DSP/*.vhd
#finally the main testbench (could be merged with the above)
$(GHDL_CMD) -i $(GHDL_FLAGS) dsptop_tb.vhd
########################
# create the Make file (the binding warning is disabled due to the many generates in the xilinx core libraries)
# also analyzes the design and generates the correct hierarchy strcture
$(GHDL_CMD) -m $(GHDL_FLAGS) -fexplicit --work=work dsp_top_tb
# run the stuff
$(GHDL_CMD) -r $(GHDL_FLAGS) -fexplicit --work=work dsp_top_tb
как вы можете понять из операторов импорта, мои исходные файлы на самом деле находятся в другом каталоге, что, однако, не беспокоит GHDL.
До последней инструкции все работает нормально. Однако при выполнении последней команды я получаю сообщение об ошибке:
endfile with a non-opened file
from: xilinxcorelib.fir_compiler_v6_3(behavioral).fn_read_mif_file at fir_compiler_v6_3.vhd:1648
ghdl:error: error during elaboration
Я считаю, что проблема в том, что мой FIR-компилятор создается с использованием Xilinx FIR-компилятора и использует файл COE для указания коэффициентов фильтра. Строка, в которой возникает ошибка, фактически открывает файл с указанием коэффициентов фильтра. В файле VHDL, сгенерированном coregen, он указан здесь
-- Configuration specification
FOR ALL : wrapped_decimator_7fold USE ENTITY XilinxCoreLib.fir_compiler_v6_3(behavioral)
GENERIC MAP (
c_coef_file => "decimator_7fold.mif", -- < Problematic file
Теперь мой вопрос: как заставить GHDL искать файл. Я уже скопировал его в папку, где выполняется команда запуска. Насколько я могу судить, я не могу импортировать файлы, отличные от VHDL, для распознавания GHDL. Итак, как я могу смоделировать фильтр, созданный FIR-компилятором, с помощью GHDL?
Я надеюсь, что кто-то знает, как это сделать.
Заранее спасибо!
Как я изначально сказал, это не Makefile, а просто фрагменты, которые я считаю важными, поскольку они определяют структуру папок и их расположение, а также то, как я запускаю ghdl. C_ELABORATION_DIR на самом деле хороший намек, я его пропустил. НО... как я сказал в конце, я пытался скопировать файл .mif в папку, где выполняется ghdl, но безрезультатно. Я постараюсь указать этот дженерик напрямую. Ваше здоровье
@user1155120
Ваше предложение было абсолютно правильным. К сожалению, у меня было больше mif-файлов, чем я знал, и GHDL на самом деле не указал, на какой из них он жаловался. Я узнал об этом, установив параметр c_elaboration_dir напрямую и, в конечном итоге, скопировав неисправный VHD-файл и вставив оператор отчета.
В конце концов, решение, к которому я пришел, заключалось в том, чтобы скопировать все файлы mif в каталог выполнения ghdl, т.е.
cp $(SRCBASE)/coregen/*.mif ./
в мейкскрипте. Это решило проблему. Вы хотите опубликовать свой ответ, чтобы я мог принять его в качестве решения, или вы довольны кудо?
Спасибо еще раз!
Это больше похоже на комментарий, чем на ответ.
Зачем? В нем указано решение проблемы, т.е. копирование всех файлов mif.
См. Как задать хороший вопрос? и Как написать хороший ответ?. Я отложил последнюю ссылку, не отвечая на вопрос как есть. Полезной частью вашего вопроса является сообщение об ошибке, содержащее имя файла (найдено в исходном коде ISE 14.7 XilinxCoreLib VHDL). Ваша проблема не может быть воспроизведена без минимальный воспроизводимый пример, вместо этого ее можно устранить.
VHDL ожидает, что пользовательский код сообщит об ошибках. Строка 1646 fir_compiler_v6_3.vhd использует file_open, который записывает в filestatus тип FILE_OPEN_STATUS (предположительно пишет NAME_ERROR). Это код Xilinx, вы можете винить их. С исходным кодом fir_compiler_v6_3.vhd вы можете устранять неполадки, сообщая о статусе файла и C_ELABORATION_DIR и C_COEF_FILE (вместе путь) вместо MCVe. VHDL следует стандарту интерфейса POSIX, включая определение абсолютного пути к файлу из текущего рабочего каталога (где выполняется ghdl).
Еще раз спасибо, что нашли время. Ваш последний комментарий, конечно же, является кровавой подробностью того, что я сделал для устранения неполадок. Но я не думаю, что в ответе обязательно должно быть указано, КАК я пришел, чтобы найти ответ. Я также не думаю, что в этом случае был необходим поддающийся проверке пример, поскольку я предполагал, что кто-то с экспертными знаниями (например, вы) тоже посмотрит на мой (уже довольно обширный) текст и подскажет, как решить проблему. Что и произошло, поэтому я считаю, что предоставил достаточно информации для решения проблемы. Полный пример означал бы публикацию полного тестового стенда.
То, что я на самом деле считаю, что мне не хватает в моем ответе, - это ваше первое и последнее предложение, которое на самом деле объясняет то, что мне не хватает. Но именно поэтому я попросил вас опубликовать ответ, чтобы я мог принять его как решение. И еще: решение проблемы (если не копировать и не изменять файл coregen vhdl верхнего уровня) состоит в том, чтобы скопировать все файлы mif в каталог выполнения ghdl.
Привет, спасибо, что нашли время.