Перейти к содержанию
    

des00

Модератор
  • Постов

    9 579
  • Зарегистрирован

  • Победитель дней

    4

Весь контент des00


  1. никак они к ним не привязываются. исходники компилируются в библиотеку с именем отличным от work. для поделок от ментора это будет vlog -work my_lib_pipa my_lib_pipa_file.v затем эта либа цепляется как внешняя при запуске моделирования/компиляции vcom -L my_lib_pipa my_lib_work_file.vhd vsim -L my_lib_pipa work.tb Это позволяет использовать уже скомпилированную готовую библиотеку. Точно также вы поступаете когда используете библиотеку готовых примитивов (например unisim/Xilinx, altera_mf/Altera и т.д.).
  2. да какие обиды, просто интересно было что послужило источником буквы Э в этом слове %) ладно проехали это означает что все пакеты нужно искать в текущей рабочей либе. по умолчанию это либа носит название work, но никто не мешает вам назвать ее например pipa и подключить еще уже скомпилированную библиотеку popa; тогда вам нужно будет писать так library pipa; library popa; use pipa.const_pkg.all; use popa.func_pkg.all;
  3. :bb-offtopic: давно интересно почему вы всегда пишете проЭкт, а не проЕкт ? Вы стебетесь над своими проектами и не воспринимаете их всерьез ? : ) понятие библиотеки относиться не к исходникам, а с компилятору. поэтому пути до библиотек прописывать в коде не нужно, надо задавать их в настройках компилятора.
  4. Потребовалось тут для коллеги сделать обвязку автоматического теста на основе логов от голд модели. Сделал вот такой набросок в моделсиме module tb; parameter int pDATA_W = 32 ; parameter int pFFT_SIZE = 256; //------------------------------------------------------------------------------------------------------ // used types //------------------------------------------------------------------------------------------------------ typedef bit [pDATA_W-1:0] data_t; typedef struct { data_t re, im; } cmplx_data_t; typedef cmplx_data_t cmplx_data_array_t [pFFT_SIZE]; //------------------------------------------------------------------------------------------------------ // used constants //------------------------------------------------------------------------------------------------------ const string cIN_FILE_NAME = "input.txt"; const string cOUT_FILE_NAME = "output.txt"; const string cSET_FILE_NAME = "settings.txt"; int NUM = 0; //------------------------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------------------------ int ifp; int ofp; cmplx_data_array_t iram; cmplx_data_array_t oram; initial begin : main get_config(); $display("settings %0d", NUM); open_files(); for (int i = 0; i < NUM; i++) begin read_infile(); $display("read done"); read_outfile(); $display("read done"); end close_files(); end //------------------------------------------------------------------------------------------------------ // file I/O config functions //------------------------------------------------------------------------------------------------------ function void get_config(); int fp; string str; begin fp = $fopen(cSET_FILE_NAME, "r"); if (fp == 0) begin $display("config file open error, use default settings"); end if ($fscanf(fp, "num = %d", NUM) == 0) begin $display("parse config string error"); end $fclose(fp); end endfunction //------------------------------------------------------------------------------------------------------ // file I/O data functions //------------------------------------------------------------------------------------------------------ function void open_files (); ifp = $fopen(cIN_FILE_NAME, "r"); ofp = $fopen(cOUT_FILE_NAME, "r"); if (ifp == 0 || ofp == 0) begin $display("can not open files"); $stop; end endfunction function void close_files(); $fclose(ifp); $fclose(ofp); endfunction function void read_infile(); read_file(ifp, iram); endfunction function void read_outfile(); read_file(ofp, oram); endfunction function automatic void read_file(int fp, ref cmplx_data_array_t ram); for (int i = 0; i < $size(ram); i++) begin ram[i] = read_cmplx_sample(fp); end endfunction function automatic cmplx_data_t read_cmplx_sample (int fp); string str; cmplx_data_t sample; begin if ($fgets(str, fp) == 0) begin $display("EOF occured"); $stop; end sample.re = 0; sample.im = 0; if (str.len != 1) begin // read complex data if ($sscanf(str, "%d%di", sample.re, sample.im) == 0) begin $display("parse string failed"); $stop; end end return sample; end endfunction endmodule все работает, но вот попытка запустить сие в альдеке 8.1 провалилось. Ладно бы он не знает что такое константные строки и что такое ссылка на массив, но ведь он даже не может сделать $fgets/привести массив чаров к строке/вернуть строку из функции/распарсить строку/массив чаров. И неужели на этом кто то работает ???? :)
  5. дык они же все полностью конфигурируемые и с процессорным интерфейсом %) Если вколотить настройки фиксированные, обрезать всякие таблицы дескрипторов, хешей, расширенную логику диагностики, дополнительное буферирование, флоу-контрол и прочее, то получиться много компактнее. Ну а пакеты можно чем угодно набивать, хоть КА, хоть своим CISC/RISC. ЗЫ либо дождитесь USB3.0 и переход не потребуется ;)
  6. Это следующая итерация %) Господа прошу помощи вот в таком вопросе. Положим есть линейный адаптивный эквалайзер с 8 мю тапами. Коэффициент тапа изменяется в пределах -2.000 ... 1.999. Т.е. максимальное усиление данного фильтра 2*8 == + 4 бита разрядности что бы фильтр всегда работал без переполнений. При разрядности данных/коэффициентов 16 бит требуемая разрядность фильтра 36 бит. Положим что на выходе требуется те же 16 бит. Теперь вопрос. Как правильно взять выходной сигнал с выхода эквалайзера, по разрядам, что бы уровень выходного сигнала имел ту же амплитуду что и входной ? Мне не понятно вот что : у эквалайзера работающего в режиме захвата, совокупное усиление фильтра порядка 1, по этому отчеты сигнала нужно брать без учета дополнительных старших бит, т.е. в данном примере [29:14]. Но если эквалайзер пошел в "разнос", то ИМХО при таком взятии данных возникнут ошибки переполнения разрядной сетки. Как правильно поступают в этом случае ? В случае TSE эквалайзера перед блоком принятия решений можно взять биты [35:14] и поставить ограничитель, а как поступают для FSE эквалайзеров, ведь после него отчеты пойдут на схему recovery и такое ограничение может вызвать не корректную работу схемы восстановления частоты ? Или я неправильно понимаю картину мира ? В каком месте модема обычно ставят FSE эквалайзеры. Понятно что его ставят после RRC фильтра, но куда ставить если у меня после RRC фильтра стоит ару(до него или после? Спасибо.
  7. Вы маню с дуней не путайте %) register insertion никакого отношения к register duplication не имеет. Рекомендую почитать хендбук на квартус по этой теме.
  8. решил пройтись по opencores а вот это не безрегистровый ли процессор ? :)) http://opencores.org/projects.cgi/web/tiny8/overview The registers resides in RAM addressed via a base pointer in the WP register (like the TMS9900).
  9. Кхм, зная слово wishbone и project очень сложно найти на этом сайте страницу http://opencores.org/browse.cgi/by_category и разделе SoC WISHBONE Builder: http://opencores.org/projects.cgi/web/wb_builder/overview WISHBONE Conmax IP Core : http://opencores.org/projects.cgi/web/wb_conmax/overview WISHBONE Conbus IP Core : http://opencores.org/projects.cgi/web/wb_conbus/overview сразу дам ответ на вопрос как скачать, зарегистрируйтесь.
  10. ИМХО вы поняли все правильно, только через введение нового типа %)
  11. многократно обсуждалось, поиск по ключевому слову "синхронозатор" выводит на тему http://electronix.ru/forum/index.php?showt...mp;#entry449467 там есть ссылки и примеры. Удачи !!!
  12. а смысл соревноваться в искусстве register duplication с синтезатором? вставить дополнительный триггер он не умеет(это надо ручками), а вот расщепить путь на 2 может. Все от тактовой и ваших ресурсов зависит. Ищите книгу Wiley.Advanced.FPGA.Design.Jun.2007
  13. Полагаю что из активных участников форума, похоже что я единственный кто занимается OVM достаточно плотно %(( Вот моя точка зрения. Насчет времени разработки тестбенча не могу понять что вас удивляет, вы знаете примеры когда разработка автоматизированного (НЕ ad-hoc) тестбенча с функциональным покрытием >80% занимала мало времени? К сведению верификация занимает порядка 50% времени разработки крупного проекта. Насчет увеличения производительности тут вопрос сложный. Что касается первого проекта на OVM то : Если вы не приняли концепцию SV ООП увеличение составит минус (200-300)%. Если вы уже работали с SV ООП и достаточно хорошо разбираетесь в рандомизации, ее ограничениях, механизме синхронизации программных тредов и подходах в отладке на классах то оно составит минус (100-200)%. После этого если вы не будете пользоваться какой либо библиотекой вы в любом случае будете разрабатывать транзакции с констрейнами, драйвера, агенты, мониторы, придумывать систему переопределения свойств и параметров объектов, систему логов. В итоге это получится та же OVM/VMM/AVM только заточенная под конкретный тестбенч. Поэтому не думаю что не используя готовые (и отлаженные сообществом разработчиков !!!) либы вы выиграете время. Что касается OVM никто не заставляет вас делать как в учебниках т.е. использовать те интерфейсы и методы которые они предлагают(хотя это более правильно). Из материалов форума ovmworld я понял что сами разработчики достаточно свободно себя ведут, не всегда регистрируют объекты, создают компоненты, транзакции без фабрики и макросов и т.д(но к сожалению этого в учебниках не описано). Тут полная свобода действий %) Что касается конкретных цифр, я планирую модернизировать/переписать тестбенч для своего опенсорс проекта. Потребуется 100% переписка того кода, который есть. С точки зрения того OVM опыта что у меня есть сейчас это должно занять 2 полноценных дня. При этом ляжет все достаточно красиво, понятно и компактно. У меня нет 100% уверенности в этом, на эту работу планирую выделить ближайшие выходные, после этого станет ясно ошибся я или нет. Если интересно потом могу сообщить результат %)) в той же ветки я вам ответил %) вот моя точка зрения: никогда не работал с FPGA Advantage, от HDL Designera меня тошнит (все равно не рисую, а редактор там ТАК тормозит), как можно работать в убогом интерфейсе квесты тоже не понимаю. Все делаю в обычном текстовом редакторе, компилирую в нем же или с командной строки/скриптами. Поэтому не могу понять вашей ситуации. Не собираетесь же вы SV классы создавать, описывать методы, соединять, конфигурировать в GUI мышкой? Не вижу в этом ни смысла ни искры. Ну вот как то так %))
  14. кхм, господа я дико извиняюсь, но если предмет поиска это поиск регистров вместо защелок, то ничего что rising_edge/falling_edge в коде есть только в одном месте, а описание вида process(c) begin if (c = '1') bla-bla-bla end process; принципиально приводит к синтезу latch (защелки по уровню) вместо тригера (защелки по фронту) ? :))
  15. пример встраивания динамического объекта в статический и в фабрику http://ovmworld.org/forums/showpost.php?p=...amp;postcount=2 я еще не до конца со всем этим разобрался. пока набираюсь опыта управления виртуальными секвенсерами и OVM фабрикой. Заканчиваю только второй простой проект на OVM. Поэтому тут пока помочь не могу. хмм, в таком случае вам действительно проще сделать все на асертах + немного поведенческого описания. Класс для данного случая изыбточен, хотя на нем много можно красивостей сделать. И пропертя в него передать и covergroup на делать и логи красиво вести и части проверок через фабрику отключать/включать.... 2 CaPpuCcino скормил вот это квесте 6.4 int bus_command_order_number[parameter bus_number]='0; int bus_register_write_order_number[parameter bus_number]='0; ** Error: tb.v(99): near "parameter": syntax error, unexpected "parameter" int bus_command_order_number[bus_number]='0; ** Error: tb.v(99): Cannot assign a packed type to an unpacked type это кто у нас такое компилит ? ИМХО так должно быть int bus_command_order_number[bus_number]='{defаult : 0}; да и в стандарте вроде не видно используемых вами таких назначений 3.7 Array literal 8.13 Assignment patterns
  16. не проснулся еще, глянул не туда. как хорошо быть хоть в чем то уверенным на 100%, а если будут мультиплексировать 2 потока ? или 8 ? или обрабатывать не мультиплексированый поток? В общем я бы написал нормальный sdc файл и не парился по этому поводу.
  17. 1. хмм а неужели это работает в кристалле ? что то мне подсказывает что мультицикл в применении к сигналам разрешения использовать нельзя, к datapath между регистрами на этом сигнале можно. 2. А вы уверены что вам или вашим коллегам через несколько месяцев не придет в голову изменить характеристики сигнала EnDataIn2 ? Например для увеличения производительности его сделают со скважностью 2. И рассматривая ваш блок как гарантировано рабочий и не видя предупреждений временного анализатора будут мучительно долго искать с помошью фена и фризера причину нестабильности работы. Это к тому, что мультицикловость здесь это свойство вашего текущего проекта и делать это свойством разработанного вами блока я бы не стал. Про мультициклы рекомендую посмотреть http://electronix.ru/forum/index.php?showt...=52323&st=0 Удачи!!!
  18. ни в коей мере не сомневаюсь что такие люди есть. Ну я бы не был столь категоричен, если синтезатору грамотно "объяснить" что от него хотят, разложит как миленький. Главное знать как "объяснять" и что бы синтезатор нормальный, класса квартуса 8 ки %) В свое потратил на изучение возможностей достаточно много времени. Вот именно соотношение трудозатрат/выхлоп далеко не в пользу данного метода, крайне редко требуется достигать по чипу 500МГц и на таких частотах забивать 100% кристалла. Но вполне допускаю что грамотное описание + RPM в некоторых случаях дает хороший выйгрыш.
  19. вы про константы или про параметры ? library ieee; use ieee.std_logic_1164.all; entity pipa is port ( a,b : in std_logic; c : out std_logic ); constant CONST : std_logic := '0'; -- тут кстати можно асерты на порты нагородить end entity; architecture popa of pipa is begin c <= (a and b) xor CONST; end architecture; определяется поддержкой синтезатора
  20. хмм, перечитал еще раз пост, либо я что не понимаю либо одно из двух %) я ничего не говорил про не эффективность применения утверждений для проверки функционирования логики RTL. Я предложил рассмотреть вариант использования динамического объекта вместо статического для проверки внутренней логики. В любом случае этот объект будет уникальным и на него можно возложить помимо задачи проверки утверждений еще и задачи оценки покрытия логики, протоколирования работы модуля, интерфейса конфигурирования этого объекта и обмена логами с главным тестбенчем. Все зависит от задачи, обычный assert хорош, когда нужно ловить ошибки "по месту" на коротких тестах, но когда тесты длительные и в большей степени автономные мне больше нравится концепция предлагаемая создателями OVM для объектов класса ovm_monitor, включающая все что я выше написал. Как то упустил такую возможность, это даже облегчает дело. Можно создать хорошую связку из модуля отладки и динамического объекта внутри его. Преимущество динамического объекта в возможности его конфигурации на лету. Особенно если вы используете верификационную систему с таким понятием как фабрика.
  21. если мне память не изменяет без разницы. просто константу в архитектуре можно переопределить в другой архитектуре.
  22. ощущение что пишете реферат/курсовой по теме уровня "Что же круче". Правда эта тема потеряла актуальность лет 5-7 назад. Информации в сети об этом море, тот же Xcell Journal Смотря что понимать под словом вентиль, если lcell фпга то за свою жизнь ни одного человека не видел. Если базовые примитивы то кроме уважаемого Aprox и еще пары человек за последние лет 5 что то и не припомню
  23. Не могу считать себя профессионалом в данной области, поэтому прошу строго не относиться %) тут я бы разделил задачу на 2 : 1. тестирование внешних интерфейсов 2. тестирование внутренней логики Первая достаточно хорошо решается через интерфейс + набор assertion и при грамотном проектировании позволит вам сделать resuse assertion IP на будущее. Вторую я бы все таки решал не через иерархический доступ. Минус такого подхода в том, что в случае изменения имени инстанса, потребуется его модификация в коде. Я бы предложил вам подумать об инкапсулированном в ваш модуль singleton классе-мониторе, на который и возложить все задачи. указатель на этот объект можно легко передавать в верификационное окружение и сделать к нему нормальный API интерфейс. 3. по смотрите на функцию $stable специально для контроля таких вещей придумана книги Assertion Based Design , Creating Assertion-Based IP + книга по линку http://electronix.ru/forum/index.php?showt...amp;st=30 ЗЫ. Думаю что на Concurrent assertions свет клином не сошелся, никто не мешает использовать обычное поведенческое описание с использованием Immediate assertions.
×
×
  • Создать...