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

SystemVerilog для не-начинающих

Приветствую!

5 hours ago, nice_vladi said:

Больше двух выражений в условных операторах if-else - нечитабельно;

Вполне читабельно,  а если еще и форматировать в несколько строк  

if (   (var1==aaa)
    && (var2>=bbb)
    ....
   ) begin
   ....
end
2 hours ago, yaghtn said:

Лично мне не нравится, что эти две if-конструкции выполняются параллельно, когда желательно чтобы они были взаимоисключающими.

Они лишь так выглядят,  на самом деле приоритет у нижнего if выше. Очень удобно бывает чтобы не писать развесистые if ... else if ... else конструкции.

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

Удачи! Rob.

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


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

45 minutes ago, yaghtn said:

Я бы переписал логику первого блока, если не трогать именование, например так:

Ну так попробуйте синтезировать эти два варианта и сравните. Как по мне, так не стоит тащить методики из гвидопыха, который настолько медленный, что в нём не имеет смысла бороться за производительность, в RTL, где коммутатор вставленный вместо пары AND-OR'ов прекрасно улучшит читаемость за счёт времени пропагации.

Изменено пользователем one_eight_seven

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


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

2 hours ago, one_eight_seven said:

коммутатор вставленный вместо пары AND-OR'ов прекрасно улучшит читаемость за счёт времени пропагации

Хм. Видимо, мне нужно подготовить что-то более весомое, чем анекдот "преждевременная оптимизация - корень всех зол".

Вы настолько явно кладёте на разные чаши весов читаемость и быстродействие, что спасибо за науку

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


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

17 hours ago, yaghtn said:

Лично мне не нравится, что эти две if-конструкции выполняются параллельно, когда желательно чтобы они были взаимоисключающими.

Как уже отметил RobFPGA тут все однозначно и по другому быть не может. В стандарте все это разобрано по полочкам.

17 hours ago, yaghtn said:

И ещё, блок кода 12-22 делает предположения о списке возможных состояний переменной state. Если сглючит, и state влетит в состояние отличное от sA sB, то блок перестанет работать вплоть до пересброса. Короче, я уверен что после всех case-условий нужно добавлять default..

Ну раз вы уверены, то делайте так как вам удобнее. И повторюсь. Код абсолютно читаем, вся логика на поверхности, синтезируемость однозначная. Вы говнокода не видели.

 

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


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

13 hours ago, yaghtn said:

Хм. Видимо, мне нужно подготовить что-то более весомое, чем анекдот "преждевременная оптимизация - корень всех зол".

Вложенные if'ы - это тоже сущность плодящая ошибки и ухудшающая читаемость. Выше уже не один раз написали, что в примере код читаемый.

Изменено пользователем one_eight_seven

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


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

On 9/3/2019 at 9:24 AM, Mad_kvmg said:

Вот Юрий Панчул рекомендует. 

https://habr.com/ru/post/465969/ 

Купил я это "счастье". В самой первой главе уже ошибки в коде! И некоторые неточности в пояснении работы. С пояснениями понятно - возможно перевод хромает (например сущность в SV wire - это провод! хоть бы сигналом назвали каким...). Но копипаст примеров кода! В котором ошибки! Это конечно полный атас!

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


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

29 minutes ago, Nick_K said:

Купил я это "счастье". В самой первой главе уже ошибки в коде! И некоторые неточности в пояснении работы. С пояснениями понятно - возможно перевод хромает (например сущность в SV wire - это провод! хоть бы сигналом назвали каким...). Но копипаст примеров кода! В котором ошибки! Это конечно полный атас!

эммм, мои телепатические способности слабы, можно скриншот про wire?

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


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

1 hour ago, des00 said:

эммм, мои телепатические способности слабы, можно скриншот про wire?

Вечером буду в пределах досягаемости книги - скину.

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


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

Скриншот про wire:

IMG_20191015_222829.jpg

И дополнительно скриншот с ошибкой в коде примера:

IMG_20191015_222930.jpg

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


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

11 hours ago, Nick_K said:

Скриншот про wire:

Прочитал, мне не понятно что вас удивляет. Речь идет про моделирование на вентильном уровне, и да, там действительно для соединения использовались провода с разными характеристиками: wire/wand/wor/tri/triand/trior/tri0/tri1 и длительное присваивание assign. Изначальное заложенное в верилог вентильное моделирование никуда не делось из стандарта. Просто смысла особого сейчас нет этим заниматься, когда есть поведенческое моделирование, но тем не менее, тут мне не понятно что вас так удивило.

11 hours ago, Nick_K said:

 

И дополнительно скриншот с ошибкой в коде примера:

Как бы ошибки в SV тут нет, есть не соответствие комментариев коду. Подозреваю что при верстке, пример был урезан. исчезло выше assign a = count[2] и b = count[1]. И была экономия на рецензорах, но тем не менее, опечатки они есть много где. Раньше, на корешке даже вклейки были, с указанием номера страницы и опечатки на ней)

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


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

16 minutes ago, des00 said:

Как бы ошибки в SV тут нет, есть не соответствие комментариев коду. Подозреваю что при верстке, пример был урезан. исчезло выше assign a = count[2] и b = count[1]. И была экономия на рецензорах, но тем не менее, опечатки они есть много где. Раньше, на корешке даже вклейки были, с указанием номера страницы и опечатки на ней)

Если с проводами я и сказал, что непонятка - возможно там и вправду особый скрытый смысл. То вот с SV кодом - там точно ошибка. И если сделать пример, то постоянно будет выдаваться ошибка по условию muxOut != a (или muxOut != count[2]). Можете ради спортивного интереса написать пример. Самое главное, что в тексте оформлено всё правильно и первый if всегда будет проверять только наличие единицы на входе sel мультиплексора.

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


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

22 minutes ago, Nick_K said:

Если с проводами я и сказал, что непонятка - возможно там и вправду особый скрытый смысл. То вот с SV кодом - там точно ошибка. И если сделать пример, то постоянно будет выдаваться ошибка по условию muxOut != a (или muxOut != count[2]). Можете ради спортивного интереса написать пример. Самое главное, что в тексте оформлено всё правильно и первый if всегда будет проверять только наличие единицы на входе sel мультиплексора.

для этого мне нужен пример 1.5:)

В том же Морелос Сарагоса "Искусство помехоустойчивого кодирования" куча ошибок в численных примерах кодирования/декодирования но это не мешает этой книге быть одной из базовых для быстрого вхождения в тему)

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


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

39 minutes ago, des00 said:

для этого мне нужен пример 1.5:)

Да там просто перебор всех значений в цикле тестбенча. Тут сам смысл кода неправильный ибо нужно в begin...end заключить)

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

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


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

1 hour ago, Nick_K said:

Да там просто перебор всех значений в цикле тестбенча. Тут сам смысл кода неправильный ибо нужно в begin...end заключить)

Да вроде корректно все.

module test ;

  bit [2 : 0] count;

  bit muxOut;

  bit [3 : 0] cnt;

  initial begin
    forever begin
      #20s;
      cnt <= cnt + 1'b1;
    end
  end

  assign muxOut = cnt[2];

  initial begin
    for (count = 0; count != 3'b111; count++) begin
      #10ns;
      if (count[0])
        if (muxOut != count[1])
          $display("pipa %b -> %b :: %b", cnt, muxOut, count);
        else if (muxOut != count[2])
          $display("popa %b -> %b :: %b", cnt, muxOut, count);
    end
    $display("done");
  end

endmodule
Quote

# Refreshing D:/work_des00/prj_verilog/prj_coding/prj/work.test
# Loading sv_std.std
# Loading work.test
# pipa 0001 -> 0 :: 011
# popa 0010 -> 0 :: 101
# done

Все корректно. по сути проверка наличия значений 011 и x01 в переменной count.  Ну либо контекст книги не соответствует примеру, но мы его не видим)

UPD. Более корректно даже так, проверка значений {1'bx. !muxOut, 1'b1} и {!muxOut, muxOut, 1'b1} в последовательности чисел. Просто записано не обычно и begin end тут не нужен. т.к. после if должен быть одиночный операнд, а if else if else как раз таким и является. Но с точки зрения читаемости, вы правы, begin end тут не помешает. Даже три

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


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

58 minutes ago, des00 said:

Да вроде корректно все.

Я извиняюсь. Не указанный исходный весь код приводит к вот таким непоняткам.

Там входной модуль + мой тестбенч имеет вот такой вид:

Spoiler

`timescale 1ns / 1ps

// Code from book
module mux_test(
		input	a,
		input	b,
		input	sel,
		output	muxOut);
	
	logic c;
	
	always_comb
		if (sel)
			c = b;
		else
			c = a;
	assign muxOut = c;
endmodule
// End code from book

// synthesis translate_off
module tb_mux;

	logic [2 : 0] count = '0;
	logic muxOut;

	mux_test dut(
		.a		(count[2]),
		.b		(count[1]),
		.sel	(count[0]),
		.muxOut	(muxOut));

	initial forever #20ns count <= count + 1;

	initial begin
		for (count = 0; count != 3'b111; count++) begin
			#10ns;
			if (count[0])
				if (muxOut != count[1])
					$display("b isn't equal out: %b /= %b; \t select = %b", count[1], muxOut, count[0]);
				else if (muxOut != count[2])
					$display("a isn't equal out: %b /= %b; \t select = %b", count[2], muxOut, count[0]);
		end
		$display("done");
		$finish;
	end
endmodule
// synthesis translate_on

 

Выход консоли следующий:

a isn't equal out: 0 /= 1; 	 select = 1
a isn't equal out: 1 /= 0; 	 select = 1

Но если исправить условия в тестбенче чикла, то всё становится на свои места:

...
		for (count = 0; count != 3'b111; count++) begin
			#10ns;
			if (count[0]) begin
				if (muxOut != count[1])
					$display("b isn't equal out: %b /= %b; \t select = %b", count[1], muxOut, count[0]);
				end else if (muxOut != count[2])
					$display("a isn't equal out: %b /= %b; \t select = %b", count[2], muxOut, count[0]);
		end
...

 

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


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

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

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

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

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

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

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

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

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

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