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

Трудности перехода на verilog

Перешел на verilog. Прочитав пару книг, цикл статей Иосифа К. и т.п., решил написать для проверки UART.

Во- первых, постоянно warning`и выдаются, то разрядность операции больше и ее значение будет обрезано до разрядности левой части, то другие мелочи..раздражает. На VHDL все warning мне были понятны и отностительно быстро устранялись, так чтобы проект компилировался с минимумом или без них. А тут на простых вещах выдается.

 

То сигналы с целью оптимизации вырезаны. Описание проекта и предупреждения синтезатора выложу завтра. Сей час хочу обсудить общие вопросы.

1) Как инициализировать все биты единицами или нулями?

2) Где можно найти парамтрические описания или примеры устройств с хорошим стилем написания? ( вот сей час опенкорс открыл)

3) Жуткие проблемы с тестбенчами, пишу деревянно. Буду очень признателен за ссылку на литературу/паттерны/статьи с хорошими примерами тесбенчей на этом языке.

4) Пишу под xilinx. Там есть синтезатор XST. Как я понимаю я могу задать начальное значение регистров( из доков самого синтезатора и кристалла). Вопрос, как граммотно это делается и во что синтезируется схема с начальным значением, к примеру сдвигового регистра.

5) ОБЩИЙ. порой нужно выводить контрольные точки из нижних уровней иеархии. Как на verilog/vhdl проделывают данный трюк не мучаясь, добавляя в интерфейс сигналы.

 

 

 

В данный момент я в замешательстве. Хотелось овладеть данным языком, т.к. очень удобен, да и в общем.. Но уже второй день совсем не идут дела. Поэтому приму толковые советы.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. vector = {DATA_SIZE{1'b1}}; vector = {DATA_SIZE{1'b0}};

2. хз, стилей много разных, уверен мой хороший:) но я его не могу показать:))))

3. обычно тестбенчи к верилогу пишут на систем верилоге, это продолжение языка, с большими бонусами. В частности концепция UVM. Поищите SystemVerilog for verification. На чистом верилоге тестбенчи беднее

4. Ой, забываем про систем верилог если у вас не вивада). Исе и план ахед его не поддерживает.

Начальные значения можете задавать при объявлении

 

reg [DATA_SIZE - 1 : 0] MyData = {DATA_SIZE{1'b1}};

или в блоке initial begin end

или через сброс, синхронный, асинхронный.

У ксалинкса технологические ячейки поддерживают начальную установку в заданное значение, так что все работает корректно.

В случае асинхронной установки (у ксалинкса есть только сброс) ячейка на уровне схемы ставиться с инверсией, и все входящие значения инвертируются, то есть как бы получается ячейка со сбросом в 0, но за счет инвертера как бы сбрасывается в 1. Это делает синтезатор, вам парится не надо.

5. доступ по иерархии в тестбенчах через точку. my_module.my_in_module.my_signal, можно в $display, можно в вейформ, можно присвоить куда, можно через форс задать.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. vector = {DATA_SIZE{1'b1}}; vector = {DATA_SIZE{1'b0}};

4. Ой, забываем про систем верилог если у вас не вивада). Исе и план ахед его не поддерживает.

1. В SV синтаксисе можно так : vector = '0; или vector = '1;

2. Для ИСЕ и планахеда есть ещё Синплифай. Либо через нетлист, либо встроенная поддержка (ИМХО очень криво сделана).

По поводу "оптимизации" шин. Не забывайте их объявлять, иначе все необъявленные вектора превращаются в однобитные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По хорошему лучше не инициализировать единицами и нулями, а сделать установку по ресету.

 

В тестбенче доступ к контрольным точкам можно получить через "точку".

Например

wire control_0 = uut_name.module_0.submodule_0.control_point;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5. доступ по иерархии в тестбенчах через точку. my_module.my_in_module.my_signal, можно в $display, можно в вейформ, можно присвоить куда, можно через форс задать.

Если я не ошибаюсь, то тут нужно еще, чтобы модуль, содержащий нужный сигнал, был написан тоже на верилоге.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перешел на verilog. Прочитав пару книг, цикл статей Иосифа К. и т.п., решил написать для проверки UART.

Во- первых, постоянно warning`и выдаются, то разрядность операции больше и ее значение будет обрезано до разрядности левой части, то другие мелочи..раздражает. На VHDL все warning мне были понятны и отностительно быстро устранялись, так чтобы проект компилировался с минимумом или без них. А тут на простых вещах выдается.

 

То сигналы с целью оптимизации вырезаны. Описание проекта и предупреждения синтезатора выложу завтра. Сей час хочу обсудить общие вопросы.

1) Как инициализировать все биты единицами или нулями?

2) Где можно найти парамтрические описания или примеры устройств с хорошим стилем написания? ( вот сей час опенкорс открыл)

3) Жуткие проблемы с тестбенчами, пишу деревянно. Буду очень признателен за ссылку на литературу/паттерны/статьи с хорошими примерами тесбенчей на этом языке.

4) Пишу под xilinx. Там есть синтезатор XST. Как я понимаю я могу задать начальное значение регистров( из доков самого синтезатора и кристалла). Вопрос, как граммотно это делается и во что синтезируется схема с начальным значением, к примеру сдвигового регистра.

5) ОБЩИЙ. порой нужно выводить контрольные точки из нижних уровней иеархии. Как на verilog/vhdl проделывают данный трюк не мучаясь, добавляя в интерфейс сигналы.

Чтобы не было варнингов, надо большинство модулей делать параметризированными. И разрядности задавать в самом верхнем, а оттуда передавать параметры в нижние до самого низа. И функциями пересчитывать локальные параметры для нижних модулей...

Вот для ISE примеры:

c:\Xilinx\14.7\ISE_DS\ISE\ISEexamples\wave_gen_ver_v6.zip

 

Там и UART и тестбенчи для него..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток,

я пока использую ISE, т.к. под рукой плата есть с спартаном 6. Но в сторону вивадо тоже смотрю, уже начинаю с ним знакомиться.

 

Для тестирования буду использовать modelSim. Ну как синтезатор - саму среду ISE/ViVado.

 

Вчера ночью я исправил свои ошибки. Полазив по форуму нашел схожую ошибку/ошибки:

1) Иногда вычитаю/ прибавляю и т.п. целые числа, без указания размерности, что интерпретируется как целое число. Синтезатор приводит правую часть к 32 разрядам, потом грозиться обрезать их под левую часть

2) При написании параметрических модулей опять параметр использую в правой части без указания размерности, что приводит к предупрежденям, к примеру:

parameter devider = 4;
output reg [ $clog2( devider * 3/2 ) - 1 : 0 ]    loadValue;
always@(*) begin
        // какое-то описание
                loadValue    = devider*3/2;
end

 

Тут я правильно понимаю, что или разрядность всего выражения правой части необходимо указать явно или его операндов? Без указания возникают предупреждения.

 

loadValue    = devider*(3'd3)/(2'd2);

 

3) Глупые ошибки из серии в одном месте сделал ресет по другому фронту.

Кстати, катируется ли локально на некоторых модулях управлять ресетом? К примеру счетчик. Хочу чтобы он был сброшен в определенные моменты. Не страшно ли управлять ресетом, пропустить через логику?

 

 

Я понял про доступ к переменной/сети в тестбенчах, которые находяться в нижних уровнях иерархии. Но как получить доступ в синтезируемой схеме. Вдруг мне понадобиться использовать сигнал, который на нижнем уровне и вывести его на котрольную точку, для синхронизации или т.п. мало ли. Тут только переписывать все интерфейсы до высокого?

 

Но вот с начальным значением в среде попробую уже сам. В доках синтезатора указано, что или при объявлении или через блок init. Просто я схематехнически не представляю, во что выливается начальная установка?

Reset я использую однозначно. Пока что синхронный, т.к. ассинхронный следует более внимательней вести.

 

А так пойду на новую иттерацию обучения. Скачал еще пару книжек и примеров.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Не делай так. Всегда указывай верную разрядность. Ворнинги же не просто так. Это убережёт от ошибок.

2. Указывай разрядности всегда!

parameter devider = 3'd4;

3. Не управляй асинхронным ресетом. Сделай отдельный логический сигнал, который будет по клоку (синхронный ресет) тебе сбрасывать в нужные состояния.

 

В синтезируемой схеме выводи нужные сигналы через порты модулей. Да, только так.

 

Ни чего сложного в асинхронном ресете нет. А ошибочность можно контролировать простейшими скриптами.

 

P.S. То есть, я так понимаю, проблема не в верилоге или переходе на него, а в неверном подходе к написанию RTL (или в недостаточности знаний об этом).

P.P.S. Деление в целых числах сразу делать - это уже интересно :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я пока использую ISE, т.к. под рукой плата есть с спартаном 6. Но в сторону вивадо тоже смотрю, уже начинаю с ним знакомиться.

Систем верилог приятен для синтеза, но практически бесценен для верификации и симуляции. ModelSim вроде с ним дружит, так что тестбенчи можно писать на нем и под ксалинкс младших серий в случае внешних симуляторов.

 

parameter devider = 3'd4;

это вы ничего не изменили, правильно

parameter [2:0] DEVIDER = 3'd4;

а еще правильнее и размерность сделать параметром.

 

Более того синтезатор еще и хитрый, он понимает что 16 бит умножить на 16 бит в общем случае будет 32 бита, и тоже ругнется. Как и при сложении 3 бит и 3 бит, он в общем случае ожидает 4 битный ответ и при присвоении в 3 битную переменную ругнется. С счетчикам counter <= counter + 1'b1; Работает. Ровно как и counter <=0; Несмотря на то что 0 в этом случае 32 битный, он однозначно расширяется и сужается до любой размерности, потому что он 0. В прочих случаях надо заводить wire сигнал правильной размерности, в него присваивать математическое выражение, а потом его правильно обрезав сохранять в регистры.

 

 

Кстати, катируется ли локально на некоторых модулях управлять ресетом?

Почему нет? Ресет не клок в ксалинксе он спец цепей не имеет (в альтере асинхронный вроде как имеет спец путь). В любом случае независимо от того какой ресет синхронный или асинхронный его снятие всегда пересинхронизируют на рабочую частоту модуля, так что все будет ок.

 

Кстати ксалинкс больше рекомендует синхронные сеты и ресеты, у них в ячейках спец входы есть, а вот асинхронный у них кажется только сброс.

 

 

Я понял про доступ к переменной/сети в тестбенчах, которые находяться в нижних уровнях иерархии. Но как получить доступ в синтезируемой схеме. Вдруг мне понадобиться использовать сигнал, который на нижнем уровне и вывести его на котрольную точку, для синхронизации или т.п. мало ли. Тут только переписывать все интерфейсы до высокого?

А какие еще могут быть варианты? Если у вас нет пути сигнала, то как его получить. Конечно можно взять сделать нетлист, найти сигнал и к нему прикрутить руками что-то, но это не верно стратегически. Он же и пооптимизироваться может по ходу пьесы, и объединиться с чем-то. Правильно действительно просто пробросить его прямо отдельной линией через всю иерархию, так как будто бы он был с самого начала.

 

Просто я схематехнически не представляю, во что выливается начальная установка?

схема конфигурации ПЛИС на последних этапах просто дергает сет или ресет ячеек, устанавливая их в заданное значение. То есть это не такой хитрый элемент который после включения питания придумывает свое состояние, это просто работа механизма загрузки конфигурации ПЛИС.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...