Jump to content

    

VoltageCurrent

Участник
  • Posts

    28
  • Joined

  • Last visited

Reputation

0 Обычный

About VoltageCurrent

  • Rank
    Участник
    Участник

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Неа (( Synplify синтезирует всё до конца и кастомных ошибок не выбрасывает. Может я, конечно, что-то не так в нём делаю, но если у кого есть Synplify - можете подтвердить или опровергнуть.
  2. Что же, тогда большое спасибо за проверенное опытом решение! Теплится надежда, что @makc подскажет решение, основанное на ассертах, но согласно тому, что я про них читал, этот механизм применим лишь к стадии симуляции.
  3. Спасибо большое, но чую, иные синтезаторы могут залезть внутрь if-а вне зависимости от значения его условия. И обнаружить ошибку. Думаю, как бы покрасивей вызывать костылеобразное деление на ноль - это могло бы быть более кросплатформенно. Надо будет попробовать и то и другое на различных синтезаторах.
  4. Не вполне понимаю, как это сделать. module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); <что-то, что должно вызвать ошибку, если тест_парам равен единице>//TEST_PARAM must be zero assign some_out = some_in; endmodule Что нужно вписать в код, чтобы он упал на синтезе при TEST_PARAM=1 и не упал при, скажем, TEST_PARAM=0 ? Что-нибудь типа такого: module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); parameter dummy = 10/(TEST_PARAM-1);//TEST_PARAM must be zero assign some_out = some_in; endmodule Предположим, что она есть. Как ею воспользоваться для решения данной задачи?
  5. Если так, то это офигенно! Не, я просто не пойму Synopsys, это же не ООП реализовать в синтезатор! Это же просто... сообщения! Подобный код не то, что второкурсник - продвинутый 10-классник написал бы. И в дополнение к этому, так милы советы: "Не, а вот нужно параметризовывать модули. Вот вы параметризуете, отладите, натычете туда дефайнов и познаете мудрость бытия, счастье и (возможно) богатство!" Да-да, можно обпараметризоваться, а потом нафигачить дичь в самих параметрах и всё пойдёт по ммм... по коричневой субстанции. Потому, что за 15 лет в синтезаторе не реализовали выполнение $error. А я ещё ругался на Альтеру за неполную поддержку SV. Да подразделение Квартуса - чёртовы герои СистемВерилога!
  6. Аа. Не, я поковырял Гугл изрядно. В том числе, нашёл на electronix тему 12-летней давности Verilog. Создание сообщений об ошибках, где нет внятных ответов. А также, нашёл практически эталонный образец творчества в духе "Тем, кто и так знает, всё будет кристально ясно. Те, кто сталкиваются в первый раз - не поймут ничего" про ассерты (код выполнен в виде картинок, лайк!). Потом уже попробовал метод тыка (в Quartus всё получилось именно благодаря ему). А уже потом написал сюда.
  7. Нет, в документе Synopsys Synplify Pro for Microsemi Edition User Guide по слову "$error" не находится ни одного совпадения. Стесняюсь спросить, а почему вы спрашиваете?
  8. Хочу, чтобы внутри моего библиотечного модуля происходила проверка входных параметров. И если они не удовлетворяют определённым условиям, то на стадии синтеза выдавалась бы осмысленная ошибка с указанием на то, какие параметры и как именно не удовлетворяют условиям. В Quartus для этой цели я сделал проверку параметров в блоке initial: module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); initial begin if(TEST_PARAM == 1) $error("TEST_PARAM must be zero"); end assign some_out = some_in; endmodule ...и Quartus исправно выдаёт данную ошибку. Пробую делать тоже самое в Synplify, он игнорирует $error, собирает проект и лишь выдаёт предупреждение, что: При попытке вставить условие непосредственно в тело модуля, Synplify выдаёт такую ошибку: А при попытке написать так: module test_module #(parameter TEST_PARAM = 1) (input some_in, output some_out); assert (TEST_PARAM == 1) $error("TEST_PARAM must be zero"); else $error("good!!"); assign some_out = some_in; endmodule ...Synplify всё собирает, не выдаёт никаких ошибок и не выводит мои сообщения. Вопрос: как в Synplify на стадии синтеза вывести кастомное сообщение об ошибке? P.S. Есть известный анекдот, в котором турист идёт по горам/лесам, встречает пожилого местного жителя и спрашивает его: - Добрый день, уважаемый! Скажите пожалуйста, не знаете ли вы, чем здесь так неприятно пахнет, прямо скажем, воняет? - О-о-о, молодой человек! Как-то раз один юноша из соседнего села... <далее идёт длинная-длинная история в духе Ромео-и-Джульетты> ...жили они долго и счастливо и/или умерли в один день! - А-а. Ясно. А пахнет-то чем? - Да фиг его знает, нагадил кто-то, наверное. Разбираясь с ассерт-ассет, кавер-фигавер и методологиями верификации, я понял, что про них написано очень много и очень заумно. И в первую очередь они нужны для симуляции, а к синтезу относятся весьма косвенно. Поэтому, хотелось бы пропустить все истории про Ромео-и-Джульетту и понять чем воняет, как решить типовую (как мне представляется) задачу вывода ошибки в зависимости от значения параметров на этапе синтеза. То есть: 1) может ли Synplify это делать? 2) И если да, то при помощи каких конкретно слов?
  9. Пишу код в Quartus на SystemVerilog. В ходе синтеза необходимо вычислить по входным параметрам модуля некое значение и использовать его в качестве параметра модуля более низкого уровня. То есть, есть модуль верхнего уровня main в котором используется целевой модуль test_module: `ifndef TEST_MODULE_LIB `define TEST_MODULE_LIB `include "test_module.sv" `endif module main ( input clk, output reg some_out ); test_module #( .PARAM_A (12.3), .PARAM_B (45.6) ) my_module ( .clk (clk), .some_out(some_out) ); endmodule И есть код целевого модуля test_module и его под-модуля sub_module: module test_module #( parameter real PARAM_A, parameter real PARAM_B )( input clk, output reg some_out ); function int my_func(); int res = PARAM_A/PARAM_B; return res; endfunction //const int FUNC_RESULT = my_func(); //parameter FUNC_RESULT = my_func(); sub_module #( .FUNC_RESULT (FUNC_RESULT) ) sub_module ( .clk (clk), .some_out(some_out) ); endmodule module sub_module #( parameter FUNC_RESULT )( input clk, output reg some_out ); assign some_out = clk; endmodule В случае, если я расскоментирую строку с объявлением параметра: parameter FUNC_RESULT = my_func(); ...я получу ошибку в самом объявлении параметра: В случае, если я раскомментирую строку с объявлением константы типа int: const int FUNC_RESULT = my_func(); ...я получу ошибку при передаче константы в под-модуль: В последнем случае, технически, я бы мог перенести функционал под-модуля в основной модуль и всё бы заработало (внутри модуля test_module использовать полученную константу синтезатор позволяет). Но есть ли возможность всё же как-либо забросить результат вычисления функции в под-модуль через параметр, чтобы всё было красиво не только снаружи test_module, но и внутри него?
  10. Есть необходимость при синтезе в определённых обстоятельствах выводить достаточно длинное сообщение. Сообщение можно вывести при помощи функции $error(): $error("very-very-very loooooooooong string"); Оптимально было бы разбить строковую константу на две, как в коде, так и при выводе сообщения. Но минимально хотелось бы её разбить хотя бы в коде. Однако это не получается, хотя я попробовал несколько вариантов: Вариант №1: $error("very-very-very"); $error("loooooooooong string"); Две команды $error() не помогут так каr синтез закончится на первой из них выведя "very-very-very" Вариант №2: $error("very-very-very", " loooooooooong string"); также выведет только "very-very-very" Вариант №3: $error("very-very-very \ loooooooooong string"); выведет буквально "very-very-very \n loooooooooong string" То есть \n пропечатывается буквально, в строке вывода. Вариант №4: string str1 = "very-very-very"; string str2 = " loooooooooong string"; $error(str1 + str2); Синтез подобной конструкции заканчивается сообщением: near text: "string"; expecting "end" <...> То есть тип string в качестве типа переменных SystemVerilog не поддерживается синтезатором Quartus. В качестве параметра он также не поддерживается. Вопрос: есть ли какие-либо ещё варианты сделать не по уродски вывод сообщения об ошибке и тот код, что будет его выводить?
  11. Предположим, есть некоторый модуль и у него имеется входной параметр, позволяющий его настроить. Однако, при определённых предельных значениях параметра, поведение модуля окажется неправильным, либо синтез закончится неочевидной ошибкой, потому, что от ошибки до параметра достаточно много промежуточных элементов кода. Есть ли возможность в SV при определённых значениях параметра выдавать синтаксическую ошибку, с текстом, заданным самим разработчиком?
  12. Имеются общие соображения по поводу 2,5% погрешности на частоту тактирования RS-232. Типа, если захват принимающим устройством происходит в середине старт-бита, то к последнему биту рассогласование не должно превысить 50%. Следовательно, если в пакете 10 бит, то на каждом должно рассогласовываться не более 5%. А так как принимающее и передающее устройства способны ошибиться по частоте в разные стороны, то если каждая сторона ошибается не более, чем на 2,5%, всё будет хорошо. Однако в стандарте на RS-232 я из временных параметров нашел только минимальную длительность перехода между битами - переходный процесс по стандарту не должен быть короче, чем 4% от длительности бита для уменьшения перекрёстных помех. Встречался ли кто-нибудь с официальными документами, в которых приводились бы расчёты именно на погрешность тактирования и джиттер в RS-232 ?
  13. Предположим, у модуля есть некий вектор и параметр-число. Например: parameter TEST_PARAM = 123; reg [7:0]test_reg; В блоке always этому регистру можно присвоить значение параметра: test_reg[7:0] <= TEST_PARAM; Возможно ли сообщить регистру только верхние биты параметра? Как-нибудь так: test_reg[7:5] <= TEST_PARAM[7:5];