ConstHw
Участник-
Постов
56 -
Зарегистрирован
-
Посещение
Весь контент ConstHw
-
Синрхронизация двух Zynq
ConstHw опубликовал тема в Работаем с ПЛИС, области применения, выбор
Всем привет Есть комплект ZC706+ плата ЦАП/АЦП . Таких комплектов два. На каждом на процессоре запущено приложение, работающее поверх, LWIP, через который происходит управление - загрузка/чтение чтение данных из памяти, запуск DMA контроллеров для DAC/ADC. Синхронизацию радиочасти сейчас опустим, как завести обший клок на FPGA тоже понятно. Надо, чтобы обе платы запускали свои DMA транзакции (а значит и вещание в эфир) строго одновременно. Как я сейчас это вижу 1) В обе платы по сети загружаются данные. 2) Плата А переводится в режим slave и процессор ждет прерывания 3) Плата B в режиме мастер, получает по сети коману "давай" и посылает прерывание наружу, ждет N тактов и запускает свой DMA контроллер 4) Плата А получает прерывание и тоже запускает свой DMA 5) Profit! Соединить платы между собой можно через SMA разъем, на него у платы А можно вывести один из портов прерывания. А вот как быть с платой B? Как сформировать сигнал запуска с минимальной задержкой? Вытащить процесс синхронизации блоков между собой в RTL часть? Или все не так и есть другие способы решения? Спасибо -
Вы симулятор свой пишите? Похвально Вопрос не в том, как написать тикль, чтобы написать add_wave /bla/bla/sig0 radix -decimal Вопрос, как сделать так чтобы при добавлении сигнала его radix выбирался автоматически в зависимости от типа сигнала signed/unsigned. Тиклем вы можете написать эту директиву для конкретных сигналов, а такой вариант как раз и не устраивает.
-
iosifk, Maverick, коллеги, обращаю внимание Я знаю, как настроить для отдельного сигнала. Из гуя, из консоли, как сохранить результат. Проблема - САПР понимал и менял радикс, не я руками.
-
ModelSim Waves signed/unsigned
ConstHw опубликовал тема в Среды разработки - обсуждаем САПРы
Всем привет Столкнулся с такой проблемой. Допустим есть сигналы 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? -
lexus.mephi Это синтезабельно? RobFPGA То что синтезатор вивады не умеет в массив интерфейсов =/ http://www.xilinx.com/support/answers/55135.html С этим проектом пока приходится пользоваться старой вивадой, но может кто в курсе - в 16.2 не починили еще? Пока решил поставил костыль расщеплением интерфейса на структуры, протаскивание через generate цикл внутрь блока и сборка обратно в интерфейс внутри.
-
SV: get acces to unit from generate
ConstHw опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Всем привет У меня есть некоторый вычисительный блок, который я копирую 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 не поддерживает массив интерфейсов =/ Или поддерживает? -
Vivado: Generated clock
ConstHw опубликовал тема в Среды разработки - обсуждаем САПРы
Всем привет Среда 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 не предлагать. -
embddr, des00 спасибо, помогло
-
SV: enumerated types assignment
ConstHw опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Всем привет Возник тонкий вопрос. Пользуюсь перечисляемым типом с предустановленными значениями и хочу этот тип переключать 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. Как правильно присваивать значение, чтобы избежать этого нарушения? -
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 ПыСы и английский не очень для точного понимания. Это критическая проблема, которую надо решать чем скорее тем лучше, если вы хотите развиваться.
-
Однако в XSIM это симулируется корректно. Интерфейсу в тестбенче можно вызвать таск, другому интерфейсу в RTL можно присвоить значение через assign. Да, SV
-
Cadence Incisive : task в Интерфейсе
ConstHw опубликовал тема в Среды разработки - обсуждаем САПРы
Подскажите, как быть. Есть интерфейс, для простоты будет считать, что в нем только клок. 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 Замена не помогает. Видимо я не понимаю что то важное про интерфейсы -
Всем большое спасибо за помощь
-
[-1] для примера, там сложная логика в цикле виде for (i=0;i<M;i++) register (i*8**MAGIC-FOO+i/3), то есть индексы выходят за обе границы. Симуляция не останавливается, варнинги сыпятся на компиляции, их много и это мешает вычитывать остальные
-
Raven в первом случае ошибка присвоения assign в reg. И в обоих проблема (проблема ли?) чтения выходного регистра.
-
Cadence Incisive : убрать варнинги
ConstHw опубликовал тема в Среды разработки - обсуждаем САПРы
Всем привет. Есть чужой кусок кода, в котором 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 и там может сидеть единорог? Или при симуляции обработается так же как в Си, выдав случайный кусок памяти? -
AVR отсутствие проверки границ массива при чтении и записи ускоряет работу программы. Так же как "ручное управление" памятью позволяет выстрелить себе в ногу (слить всю память), зато позволяет делать программы реального времени. Это плюсы и минусы. У implict declaration плюсов нет, собственно по итогам дискуссии по-моему это стало очевидно. Почему адепты верилога не считают это проблемой не очень понятно. Про SV согласен. По мере расширения его поддержки синтезаторами и моделилками, альтернатив ему просто не будет.
-
Вы занимаетесь какой то левой софистикой, сначала пытаясь увести спор в область денег, а при неудачной попытке делаете вид что, раз не о деньгах, то и спорить не о чем. Человек указал на конкретную проблему языка, на него набросились с что во-первых "тесты" во-вторых "писать надо уметь". Я согласен с ним в этом вопросе - implict declaration это серьезный минус Verilog как средства разработки. Если есть что возразить по существу, то вопрос выше - пример, где эта особенность оказывается полезной. Тыкать в меня, что я не могу изменить корпоративные стандарты (кто если не я), указывать на свой богатый опыт, предлагать что то куда то сунуть не стоит. Давайте по существу.
-
Fat Robot, коллеги, мы не говорим сейчас о бизнесе и работе. Куча говнокода написано на Коболе и Дельфи и можно получать большие деньги, поддерживая этот код. От языка 1С кровоточат глаза, но он востребован в России и можно тоже неплохо получать. Вопрос по существу языка. Сборщик мусора это хорошо или плохо? А быть программистом на плюсах или на шарпе, что лучше? Где больше платят? Между этими вопросами связи практически никакой нет. Так же как и вопрос корпоративных стандартов и традиций страны по выбору языка не связан с такими вот косяками. Возвращаясь к теме топикстартера - ждем пример где implict declaration реально приносит пользу в современном "боевом" коде (про пользу для gatelevel писал выше да).
-
Fat Robot очень жаль, что ваш работодатель засовает ваше мнение туда, где ему по вашему место. По вопросу - да конечно разработчик должен владеть и VHDL и Verilog, оба довольно бедные и простые, поддерживать и писать надо на обоих, иначе делишь доступный рынок труда пополам. Если без перехода на личности и, завуалированных оскорблений, то может вернемся к обсуждению сути? Полезное применение implict declaration? Maverick,а он ведь очень удачный. В нем используются многомерные массивы, которые есть в VHDL и SV, но нет в Verilog. То есть в рамках стандарта Verilog-95 вышло бы больше менее ясного кода.
-
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.
-
Не приписывайте мне пожалуйста мне какие то свои мысли, что я против тестов. На тестах вы увидите расхождение с моделью, пойдете искать причину и найдете проблему однобитной шины, которую исправите. При том, что подобная примитивная ошибка может быть отловлена еще при прогоне компилятора. Приведите пожалуйста какой нибудь пример, где "лаконичность и удобство" в экономии одной строчки объявления повысила читаемость кода. Не в смысле сейчас тут напишите синтетический пример "было 4 строчки стало 3", а какой нибудь реальный проект в котором эта особенность что то реально улучшила. ОпенКорс, Analog Devices, Xilinx корки и проч.
-
По теме топикстартера Не понятно, почему спор 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 относится к первому этапу, а не ко второму. То что тесты позволяют на более позднем этапе выловить ошибку, устранимую на раннем, это достоинство средств тестирования, проблема языка остается.
-
SV: array assignment
ConstHw ответил ConstHw тема в Языки проектирования на ПЛИС (FPGA)
des00 Все понял, спасибо! -
SV: array assignment
ConstHw ответил ConstHw тема в Языки проектирования на ПЛИС (FPGA)
Спасибо! С default конструкцией лучше, но все равно хочется еще короче Нашел еще красивое решение для одномерного дешифратора http://www.asic-world.com/examples/systemv...og/decoder.html assign decoder_out = (enable) ? (1 << binary_in) : 16'b0; Провернуть бы такое для двумерного :)