реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Трудности перехода на verilog
go2winner
сообщение Apr 13 2017, 19:37
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 19-10-15
Пользователь №: 88 917



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

То сигналы с целью оптимизации вырезаны. Описание проекта и предупреждения синтезатора выложу завтра. Сей час хочу обсудить общие вопросы.
1) Как инициализировать все биты единицами или нулями?
2) Где можно найти парамтрические описания или примеры устройств с хорошим стилем написания? ( вот сей час опенкорс открыл)
3) Жуткие проблемы с тестбенчами, пишу деревянно. Буду очень признателен за ссылку на литературу/паттерны/статьи с хорошими примерами тесбенчей на этом языке.
4) Пишу под xilinx. Там есть синтезатор XST. Как я понимаю я могу задать начальное значение регистров( из доков самого синтезатора и кристалла). Вопрос, как граммотно это делается и во что синтезируется схема с начальным значением, к примеру сдвигового регистра.
5) ОБЩИЙ. порой нужно выводить контрольные точки из нижних уровней иеархии. Как на verilog/vhdl проделывают данный трюк не мучаясь, добавляя в интерфейс сигналы.



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

Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 13 2017, 20:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 222
Регистрация: 17-02-06
Пользователь №: 14 454



1. vector = {DATA_SIZE{1'b1}}; vector = {DATA_SIZE{1'b0}};
2. хз, стилей много разных, уверен мой хорошийsm.gif но я его не могу показатьsm.gif)))
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, можно в вейформ, можно присвоить куда, можно через форс задать.

Go to the top of the page
 
+Quote Post
Bad0512
сообщение Apr 14 2017, 02:15
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 787
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(Golikov A. @ Apr 14 2017, 03:45) *
1. vector = {DATA_SIZE{1'b1}}; vector = {DATA_SIZE{1'b0}};
4. Ой, забываем про систем верилог если у вас не вивада). Исе и план ахед его не поддерживает.

1. В SV синтаксисе можно так : vector = '0; или vector = '1;
2. Для ИСЕ и планахеда есть ещё Синплифай. Либо через нетлист, либо встроенная поддержка (ИМХО очень криво сделана).
По поводу "оптимизации" шин. Не забывайте их объявлять, иначе все необъявленные вектора превращаются в однобитные.
Go to the top of the page
 
+Quote Post
Vascom
сообщение Apr 14 2017, 06:47
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



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

В тестбенче доступ к контрольным точкам можно получить через "точку".
Например
Код
wire control_0 = uut_name.module_0.submodule_0.control_point;
Go to the top of the page
 
+Quote Post
KalashKS
сообщение Apr 14 2017, 10:25
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 208
Регистрация: 7-02-11
Пользователь №: 62 755



Цитата(Golikov A. @ Apr 13 2017, 23:45) *
5. доступ по иерархии в тестбенчах через точку. my_module.my_in_module.my_signal, можно в $display, можно в вейформ, можно присвоить куда, можно через форс задать.

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

Go to the top of the page
 
+Quote Post
iosifk
сообщение Apr 14 2017, 10:32
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 3 640
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(go2winner @ Apr 13 2017, 22:37) *
Перешел на 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 и тестбенчи для него..


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
go2winner
сообщение Apr 14 2017, 11:08
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 19-10-15
Пользователь №: 88 917



Доброго времени суток,
я пока использую 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 я использую однозначно. Пока что синхронный, т.к. ассинхронный следует более внимательней вести.

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

Go to the top of the page
 
+Quote Post
Vascom
сообщение Apr 14 2017, 11:15
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



1. Не делай так. Всегда указывай верную разрядность. Ворнинги же не просто так. Это убережёт от ошибок.
2. Указывай разрядности всегда!
Код
parameter devider = 3'd4;

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

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

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

P.S. То есть, я так понимаю, проблема не в верилоге или переходе на него, а в неверном подходе к написанию RTL (или в недостаточности знаний об этом).
P.P.S. Деление в целых числах сразу делать - это уже интересно sm.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 14 2017, 12:43
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 222
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
я пока использую 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 сигнал правильной размерности, в него присваивать математическое выражение, а потом его правильно обрезав сохранять в регистры.


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

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

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


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

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

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

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

Go to the top of the page
 
+Quote Post
go2winner
сообщение Apr 25 2017, 06:03
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 19-10-15
Пользователь №: 88 917



Спасибо всем за ответы. !
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th October 2017 - 18:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01282 секунд с 7
ELECTRONIX ©2004-2016