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

ConstHw

Участник
  • Постов

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

  • Посещение

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


  1. Всем привет Есть комплект ZC706+ плата ЦАП/АЦП . Таких комплектов два. На каждом на процессоре запущено приложение, работающее поверх, LWIP, через который происходит управление - загрузка/чтение чтение данных из памяти, запуск DMA контроллеров для DAC/ADC. Синхронизацию радиочасти сейчас опустим, как завести обший клок на FPGA тоже понятно. Надо, чтобы обе платы запускали свои DMA транзакции (а значит и вещание в эфир) строго одновременно. Как я сейчас это вижу 1) В обе платы по сети загружаются данные. 2) Плата А переводится в режим slave и процессор ждет прерывания 3) Плата B в режиме мастер, получает по сети коману "давай" и посылает прерывание наружу, ждет N тактов и запускает свой DMA контроллер 4) Плата А получает прерывание и тоже запускает свой DMA 5) Profit! Соединить платы между собой можно через SMA разъем, на него у платы А можно вывести один из портов прерывания. А вот как быть с платой B? Как сформировать сигнал запуска с минимальной задержкой? Вытащить процесс синхронизации блоков между собой в RTL часть? Или все не так и есть другие способы решения? Спасибо
  2. Вы симулятор свой пишите? Похвально Вопрос не в том, как написать тикль, чтобы написать add_wave /bla/bla/sig0 radix -decimal Вопрос, как сделать так чтобы при добавлении сигнала его radix выбирался автоматически в зависимости от типа сигнала signed/unsigned. Тиклем вы можете написать эту директиву для конкретных сигналов, а такой вариант как раз и не устраивает.
  3. iosifk, Maverick, коллеги, обращаю внимание Я знаю, как настроить для отдельного сигнала. Из гуя, из консоли, как сохранить результат. Проблема - САПР понимал и менял радикс, не я руками.
  4. Всем привет Столкнулся с такой проблемой. Допустим есть сигналы logic signed [9:0] sig0; logic unsigned [9:0] sig1; logic [9:0] sig2; Ранее пользовался симулятором Cadence и когда вытаскивал эти сигналы на Waveform они отображались соответствующим radix sig0 - signed decimal, sig1 - unsigned decima, sig2 - hex Сейчас пользуюсь QusetaSim 10.4d и он никакой разницы для них не делают - все отображаются в виде global Radix, приходится менять radix каждого сигнала руками в GUI или в консоле/скрипте. Подскажите, есть ли способ настроить ModelSim чтоб он чуял типы сигналов и для явно обозначенных signed/unsigned применялся соответствующий radix?
  5. lexus.mephi Это синтезабельно? RobFPGA То что синтезатор вивады не умеет в массив интерфейсов =/ http://www.xilinx.com/support/answers/55135.html С этим проектом пока приходится пользоваться старой вивадой, но может кто в курсе - в 16.2 не починили еще? Пока решил поставил костыль расщеплением интерфейса на структуры, протаскивание через generate цикл внутрь блока и сборка обратно в интерфейс внутри.
  6. Всем привет У меня есть некоторый вычисительный блок, который я копирую N-раз в generate. Допустим я задал где то снаружи порт A и присвоил его в генерейте module foo_block #() ( input [7:0] port_a, input [7:0] port_b, output [7:0] port_c ); //------------------- logic [N-1:0][7:0] a_values; logic [N-1:0][7:0] c_rez; for (i = 0; i<N; i++) begin my_gen foo_block #( ) u_foo_block ( .port_a ( a_values [ i ] ), .port_c ( c_rez [ i ] ) ); end А вот к порту B я хочу иметь непосредственный доступ. То есть назначить каждый индивидуально my_gen[0].u_foo_block( .port_b(42) ); my_gen[0].u_foo_block( .port_b(17) ); my_gen[0].u_foo_block( .port_b(25) ) Как это сделать? Вариант создать массив B и задать в него руками значения, а потом присвоить в генерейте не подходит logic [N-1:0][7:0] b_values; assign b_vales[0] = 42; assign b_vales[0] = 17; assign b_vales[0] = 25; Не подходит потому что порт b на самом деле интерфейс, а Xilinx не поддерживает массив интерфейсов =/ Или поддерживает?
  7. Всем привет Среда Vivado 2016.1 Есть модуль, в который заходит 2 клока, регистр защелкнутый по первому клоку (cfg_clk) передается во второй регистр, который защелкивается по второму (clk) module foo ( input clk_cfg , input clk , input a , output b ) always @(posedge clk_cfg) begin reg_a <= a; end always @(posedge clk) begin reg_b <= reg_a; end Модуль предполагается использовать в режиме, когда оба эти клока будут одинаковые, т.е. браться физически из одного клока .cfg_clk (clk) .clk (clk) Сейчас синтезирую модуль отдельно и не могу понять,как правильно указать виваде что эти клоки суть один клок. Через визард создаю констрейн что порт clk главный и от него рожается клок cfg_clk create_clock -period 4.000 -name clk -waveform {4.000 2.000} -add [get_ports clk] create_generated_clock -name cfg_clk -source [get_ports clk] -multiply_by 1 -combinational -add -master_clock clk [get_ports {cfg_clk}] Однако после синтеза вижу inter clock paths violation, для цепи reg_b <= reg_a; поскольку требуемая задержка 0.000. Что я делаю не так? вариант set false path не предлагать.
  8. Всем привет Возник тонкий вопрос. Пользуюсь перечисляемым типом с предустановленными значениями и хочу этот тип переключать enum logic [1:0] {ALPHA = 0, BETA = 1, GAMMA = 2} muxer; always @(posedge clk) muxer <= cfg_wdata[1:0]; end Cadence Incisive при симуляции высыпает варнгинг This assignment is a violation of SystemVerilog strong typing rules for enumeration datatypes. Как правильно присваивать значение, чтобы избежать этого нарушения?
  9. 1) Смысл библиотек станет понятным, если нажав ctr кликнуть по ним мышкой и посмотреть содержимое :) 2) Список памятей поддерживаемых 7 серией http://www.xilinx.com/products/technology/...ng.html#7series Да, на тему что попробовать - Лаба 4, полшаговое руководство http://www.xilinx.com/support/documentatio...dded-design.pdf Цинк бук, там примеры по цинку, но примеры программ переносимы на Микроблейз http://www.zynqbook.com/download-book.html ПыСы и английский не очень для точного понимания. Это критическая проблема, которую надо решать чем скорее тем лучше, если вы хотите развиваться.
  10. Однако в XSIM это симулируется корректно. Интерфейсу в тестбенче можно вызвать таск, другому интерфейсу в RTL можно присвоить значение через assign. Да, SV
  11. Подскажите, как быть. Есть интерфейс, для простоты будет считать, что в нем только клок. interface foo_int #(); logic clk; task RunRst (); clk <= 0; endtask endinterface Дальше я объявляю этот интерфейс и хочу присвоить в него (в RTL коде, не в симуляции) какой то клок foo_int s0_cfg(); assign s0_cfg.clk = clk ; И вот тут падает ошибка : Illegal combination of driver and procedural assignment to variable clk detected (procedural assignment found in task/function RunClk Task нигде не вызывается, но Cadence все равно ругается. Замена в таске присвоения <= на = не меняет результат. Что я делаю не так? Как оставить возможность вызывать таски интерфейса в тестбенче, при этом сохраняя возможность присвоения в RTL? UPD http://stackoverflow.com/questions/1924986...ignment-warning Замена не помогает. Видимо я не понимаю что то важное про интерфейсы
  12. [-1] для примера, там сложная логика в цикле виде for (i=0;i<M;i++) register (i*8**MAGIC-FOO+i/3), то есть индексы выходят за обе границы. Симуляция не останавливается, варнинги сыпятся на компиляции, их много и это мешает вычитывать остальные
  13. Raven в первом случае ошибка присвоения assign в reg. И в обоих проблема (проблема ли?) чтения выходного регистра.
  14. Всем привет. Есть чужой кусок кода, в котором Cadence Incisive при симуляции генерит варнинги на тему out of band - в цикле происходит обращение к несуществующим индексам регистров и массивов. При дальнейшем обсуждении будем считать, что исправить это и написать по людски нельзя, но код работает. Вопросы 1) Cadense Invisive крутится на RedHat, можно как то средствами ОС, или директивами компилятора, или атрибутами в коде отфильтровать выдачу варнингов на данную строчку кода? Что вроде вроде (* NO WARNING *) reg[-1] = 32'h42; Или парсить выдачу симулятора в консоль регулярным выражением, удаляя сообщения вида ncelab: *W,BNDWRN (/home/my_source.v,32|42): Bit-select or part-select index out of declared bounds. 2) Что вообще говорит стандарт Verilog об обращении к несуществующим индексам? Там гарантировано будет X при симуляции и 0 при имплементации? Или это undefined behaviour и там может сидеть единорог? Или при симуляции обработается так же как в Си, выдав случайный кусок памяти?
  15. AVR отсутствие проверки границ массива при чтении и записи ускоряет работу программы. Так же как "ручное управление" памятью позволяет выстрелить себе в ногу (слить всю память), зато позволяет делать программы реального времени. Это плюсы и минусы. У implict declaration плюсов нет, собственно по итогам дискуссии по-моему это стало очевидно. Почему адепты верилога не считают это проблемой не очень понятно. Про SV согласен. По мере расширения его поддержки синтезаторами и моделилками, альтернатив ему просто не будет.
  16. Вы занимаетесь какой то левой софистикой, сначала пытаясь увести спор в область денег, а при неудачной попытке делаете вид что, раз не о деньгах, то и спорить не о чем. Человек указал на конкретную проблему языка, на него набросились с что во-первых "тесты" во-вторых "писать надо уметь". Я согласен с ним в этом вопросе - implict declaration это серьезный минус Verilog как средства разработки. Если есть что возразить по существу, то вопрос выше - пример, где эта особенность оказывается полезной. Тыкать в меня, что я не могу изменить корпоративные стандарты (кто если не я), указывать на свой богатый опыт, предлагать что то куда то сунуть не стоит. Давайте по существу.
  17. Fat Robot, коллеги, мы не говорим сейчас о бизнесе и работе. Куча говнокода написано на Коболе и Дельфи и можно получать большие деньги, поддерживая этот код. От языка 1С кровоточат глаза, но он востребован в России и можно тоже неплохо получать. Вопрос по существу языка. Сборщик мусора это хорошо или плохо? А быть программистом на плюсах или на шарпе, что лучше? Где больше платят? Между этими вопросами связи практически никакой нет. Так же как и вопрос корпоративных стандартов и традиций страны по выбору языка не связан с такими вот косяками. Возвращаясь к теме топикстартера - ждем пример где implict declaration реально приносит пользу в современном "боевом" коде (про пользу для gatelevel писал выше да).
  18. Fat Robot очень жаль, что ваш работодатель засовает ваше мнение туда, где ему по вашему место. По вопросу - да конечно разработчик должен владеть и VHDL и Verilog, оба довольно бедные и простые, поддерживать и писать надо на обоих, иначе делишь доступный рынок труда пополам. Если без перехода на личности и, завуалированных оскорблений, то может вернемся к обсуждению сути? Полезное применение implict declaration? Maverick,а он ведь очень удачный. В нем используются многомерные массивы, которые есть в VHDL и SV, но нет в Verilog. То есть в рамках стандарта Verilog-95 вышло бы больше менее ясного кода.
  19. Fat Robot да ну зачем мне в комиссию, там сидят гораздо более компетентные специалисты, которые еще 10 лет назад выпустили стандарт на SV который учитывает все эти проблемы. И 20 лет зада выпустили стандарт VHDL так же свободный от указанных проблем. Мне хватает. По поводу лаконичности, вот несколько примеров с AD, люди декларируют wire потому что это повышает читаемость. https://github.com/analogdevicesinc/hdl/blo...axi_dmac.v#L247 https://github.com/analogdevicesinc/hdl/blo...ata_mover.v#L85 Допустим это помогает экономить время на написание кода (хотя любой разработчик всегда тратит на отладку больше, чем на написание), хорошо бы увидеть реальный пример. Примеров, когда необъявленный ваер приводил к ошибке вроде достаточно. Maverick хотелось бы все таки пример где "wire по умолчанию" давал преимущество. А какая именно конструкция на VHDL занимала больше места? Ваш пример кстати написан на SV, многомерные массивы, типа logic и $clog2 это все из стандарта SV.
  20. Не приписывайте мне пожалуйста мне какие то свои мысли, что я против тестов. На тестах вы увидите расхождение с моделью, пойдете искать причину и найдете проблему однобитной шины, которую исправите. При том, что подобная примитивная ошибка может быть отловлена еще при прогоне компилятора. Приведите пожалуйста какой нибудь пример, где "лаконичность и удобство" в экономии одной строчки объявления повысила читаемость кода. Не в смысле сейчас тут напишите синтетический пример "было 4 строчки стало 3", а какой нибудь реальный проект в котором эта особенность что то реально улучшила. ОпенКорс, Analog Devices, Xilinx корки и проч.
  21. По теме топикстартера Не понятно, почему спор Verilog-VHDL относится к разряду религиозных. Религиозные споры применительно к IT это когда за каждой стороной есть своя объективная правда, свои преимущества. Matlab не дает проверить результат присвоения if (a=B), потому что это плодит ошибки. Зато медленнее работает. C не проверяет границы массивы, зато быстрее работает. Функциональное vs ООП. В каждом подобном случае есть объективные достоинства и недостатки. Вопросу декларирования переменных тоже посвящено куча работ. Можно объявлять все переменные в одном месте, как в С и Паскале. Можно объявлять по месту использования, как в SystemVerilog или C++. Можно вообще не объявлять как в Питоне или Матлабе. У каждого такого подхода есть плюсы и минусы. То что верилог по умолчанию считает недекларированным сигнал однобитным ваером это костыль. Костыль, который разработчики языка воткнули туда 100 лет назад, когда моделировали gate level схемы из чугуна и сосновых досок и соединять триггер с элементом И без объявления ваера было действительно удобно. Сейчас эта конструкция плодит ошибки и ничего больше. Если вы поднялись с уровня моделирования гейтов, то эта особенность дает ровно 0 преимуществ и переодически добавляет ошибки. Советы пользоваться тестами тут вообще не при чем никаким боком. Язык сам по себе должен давать пользователю возможность писать хорошо, отлавливать очевидные ошибки и не писать плохо. Например язык Go разрабатывался именно для этих целей - для людей, не для машин. Язык верилог мешает писать хорошо (нет библиотек, пэкэджей, шин в интерфейсах, юзер-дефайн-типов,убогость возможности функций и структур) и наоборот подталкивает пользователя лепить ошибки (то самое умолчанное wire 1) Это никакие не милые особенности и уж тем более глупым высокомерием кажутся выпады "сперва научись писать без ошибок дурак". Это проблемы языка, которые прекрасно решены в SystemVerilog. То есть разработчики стандарта как раз понимали все. Отрицать наличие проблемы и кичиться возможность стрелять в ногу так же осмысленно и разумно, как радоваться что ваш любимый САПР падает каждый час обеспечивая вам необходимый перерыв в работе и заставляет вовремя сохраняться и вообще учит ответственности. Поскольку ответы "моделируй перед имплментацией и нет проблем" звучат уже много лет и появятся снова, поясню еще на примерах Вот советы о том, как писать код без ошибок http://www.viva64.com/ru/b/0391/ А вот методика тестирования https://en.wikipedia.org/wiki/Unit_testing Они не противоречат другу другу, не исключают, а дополняют. Сначала ты пишешь правильный код и проверяешь его компилятором/анализатором/глазами, потом тестируешь (в моделилке, в железе, в сети). Вопрос хороший верилог - плохой vhdl относится к первому этапу, а не ко второму. То что тесты позволяют на более позднем этапе выловить ошибку, устранимую на раннем, это достоинство средств тестирования, проблема языка остается.
  22. Спасибо! С default конструкцией лучше, но все равно хочется еще короче Нашел еще красивое решение для одномерного дешифратора http://www.asic-world.com/examples/systemv...og/decoder.html assign decoder_out = (enable) ? (1 << binary_in) : 16'b0; Провернуть бы такое для двумерного :)
×
×
  • Создать...