Pull to refresh

Comments 10

Интересная статья. А моделирование в Active — HDL вы не проводили?
Я моделирую в ModelSim Altera, так как она совершенно бесплатная. Ну, или в ISIM, если работа идёт с Xilinx (хоть они и не рассматривались в данной статье). ActiveHDL — на заре тысячелетия изучал, но «париться» с ломанными версиями при наличии совершенно бесплатных и встроенных в систему разработки — а смысл?

Но в рамках рассмотренной проблематики — проверять надо, как оно синтезируется, а Gate Level моделирование — замутное. Проще было осциллографом убедиться. Тем более, что хотелось именно реальные результаты увидеть.
Ну да, действительно. У ActiveHDL есть студенческая версия, которой я и пользуюсь, так как студент, то есть, к сожалению, с практическими задачами я еще не сталкивался. Для таких новичков как я, мне кажется, что было бы полезно в решении вашей задачи увидеть самое обычное временное моделирование)
Кажется, я понял, где мы друг друга не понимаем. Давным-давно я прослушал курсы по программированию ПЛИС на VHDL, где нас как раз на ActiveHDL обучали. Изучили мы язык, набрались опыта, наделали лабораторных работ… И вот добыл я свою первую ПЛИС (тогда их было добыть достаточно сложно, из Швеции привёз), начинаю делать под неё первую прошивку… И на меня сыплется гора ошибок. Гружу в систему моделирования — всё прекрасно работает.

Оказалось, что нас забыли предупредить, что есть язык, а есть — его синтезируемое подмножество. И только жалкая часть языковых конструкций будет синтезирована. Да и там — тоже свои заморочки (например, управлять сигналом можно только из одного процесса). Пришлось потратить месяц, чтобы изменить стиль разработки.

Большинство обзорных статей про SystemVerilog едины по стилю. Сначала идёт рассказ о новых вещах, как они прекрасны. Затем — комментарий: «А это вообще синтезируемо?». И дальше — обычно разговор сходит на общие темы. Вот я и решил выбрать красивых вещей и проверить:

1) Насколько они синтезируемы
2) Насколько оптимален результат синтеза конкретно массивов с индексацией «на лету»

Результаты — в статье. И именно поэтому моделирование самого языка для данной статьи бесполезно. Оно сработает, куда ж оно денется? Моделировать пришлось бы на уровне вентилей после упаковки в ПЛИС. Осциллограмма — это практически то же самое. Но глядя на результаты моделирования, скептики у нас сказали бы, что этому верить можно, но с натягом, а вот то, что видно на осциллографе — оно видно на осциллографе. Это уже физическая вещь.

Посему в данной конкретной статье осциллограммы — более приемлемы.
Беру свои слова обратно. Не отмоделируется… Чтобы отмоделировалось (я играл с последним примером) надо добавить начальную инициализацию переменной iter. В ПЛИС же она чему-то, да равна, а длина перебора — 4 такта. В модели же к неизвестно чему прибавляем единицу — будет опять неизвестно что. Так что
logic	[$clog2(cnt)-1:0] iter = 0;

Тогда вот такая моделька
`timescale 1 ps / 1 ps
module checkObj2();
logic			clk50;
logic	[1:0] button;
logic [1:0] group [4];

ObjTest2 dut(
.clk50,
.button,
.group
);
always 
begin
	clk50 = 0;
	#10000;
	clk50 = 1;
	#10000;
end
initial
begin
		button = 2'b00;
		#5500000;
		button = 1'b01;
		#5000000;
		button = 2'b11;
		#5000000;
		button = 2'b00;
end
endmodule

даст такую картинку

image
Ну, а там видно, что изменение состояния кнопки (я выделил их жёлтым) даст «разбегающееся» изменение состояния ножек. С какой ножки начнётся разбег — зависит от того, в какой момент кнопку нажали (на то он и Round Robin)
Я пару лет назад пробовал. Active-HDL сам по себе понравился, он жутко удобен именно как среда, в которой всё есть — полное УДОБНОЕ IDE. Mоdelsim — по сути только симулятор, тот-же редактор нужно отдельно прикручивать. Но Active-HDL отставал от Mоdelsim по числу поддерживаемых фич. языка. Мне это было критично, поэтому от него отказался.
За это время думаю много чего нагнали, но и Mоdelsim думаю не стоял на месте. Вопрос будет в том, насколько Вам будет критичны те фичи, что могут быть ещё не реализованы в Active-HDL.
Идея упакованных/неупакованных объектов — это большой шаг по сравнению с классическим верилогом, и она красива, в некотором смысле, но только пока мы находимся в рамках моделирования на последовательных машинах. Но если переходить к синтезу в аппаратуре, то она начинает существенно мешать, т.к. никаких упакованных/неупакованных объектов нет, есть лишь конкретная реализация, в которой можно делать что угодно (насколько хорошо оно ляжет на ту или иную технологическую базу — вопрос отдельный).
Ой. А в quartus завезли modport?! Урра, это ж приятно! А он чекает направления?
Чуть переделал наброски неопубликованного примера. Получилось примерно так:
interface demoInterface ();
logic		in;
logic		out;
modport InDevice (input in,output out);
endinterface

module ObjTest3 #(parameter cnt=4)
(
	input clk,
	input button
);

demoInterface interfaces  [cnt]();

fakedevice f (interfaces[0]);

endmodule

module fakedevice (demoInterface.InDevice Bus);
	assign Bus.in = Bus.out;
endmodule

На что мне было сказано:
Error (10231): Verilog HDL error at ObjTest3.sv(28): value cannot be assigned to input «in»

Вывод: Чекает! Ну, и второй вывод — не зря я всё-таки вёл осмотр возможностей на самой свежей версии.
Одно замечание. Тулы синтеза умеют только импортировать SV; на выходе у них в 100% случаев получается обычный верилог-нетлист. Соответственно, это означает флатованные до 1-го разряда интерфейсы и дикие, трехэтажные названия портов и сигналов, полученные при конверсии имен. С такими названиями очень трудно писать констрейнты и дебажить нетлист, ведь постоянно придется сопоставлять, какой цепи и регистру в RTL соответствует цепь и регистр из нетлиста. Поэтому SV (и конструкции generate в обычном верилоге) не рекомендуют использовать в сложных проектах, а особенно — на верхнем уровне. SV — язык красивый и удобный, но только до этапа синтеза.
Sign up to leave a comment.

Articles