?

Log in

No account? Create an account

Вериложество c плоскогорья Декан - Общество дровосеков Бердичева по изучению Мишны

Jul. 17th, 2015

02:30 pm - Вериложество c плоскогорья Декан

Previous Entry Share Next Entry



int array[0:7];

initial begin
    array[0] <= -1;
    for (int j = 1; j < 8; j++)
        array[j] <= 1 + array[j-1];
end


А-а-а-а-а-а!

Comments:

[User Picture]
From:archaicos
Date:July 17th, 2015 09:36 pm (UTC)
(Link)
Переведи для тайнописью не владеющих.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 17th, 2015 09:49 pm (UTC)
(Link)
Пусть пока побудет загадкой для владеющих, а ты спроси вокруг себя, если ты на работе.
(Reply) (Parent) (Thread)
[User Picture]
From:archaicos
Date:July 17th, 2015 10:48 pm (UTC)
(Link)
А, у тебя была опечатка.
(Reply) (Parent) (Thread)
[User Picture]
From:rkatsyv
Date:July 17th, 2015 10:11 pm (UTC)
(Link)
1. Да фигли тут понимать
2. Аааааааа!!

P.S. При этом же еще и работать не будет
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 17th, 2015 10:38 pm (UTC)
(Link)
Виноват, опечатка - цикл должен начинаться с единицы.
(Reply) (Parent) (Thread)
[User Picture]
From:ygam
Date:July 17th, 2015 10:19 pm (UTC)
(Link)
для j=0 array[j-1] не существует. В этом смысл?
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 17th, 2015 10:37 pm (UTC)
(Link)
Я же исправлял, почему-то не сохранилось. Цикл должен начинаться с единицы. Спасибо.
(Reply) (Parent) (Thread)
[User Picture]
From:rkatsyv
Date:July 17th, 2015 10:42 pm (UTC)
(Link)
Это просто ошибка.
А вот
array[j] <= 1 + array[j-1];
вместо
array[j] <= j;
вот это уже плоскогорье Деккан
(Reply) (Parent) (Thread)
[User Picture]
From:ygam
Date:July 17th, 2015 10:44 pm (UTC)
(Link)
Теперь понял.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 03:13 am (UTC)
(Link)
Верилоговская проблема в том, что у т.н. "неблокирующего" присваивания, обозначаемого <=, эффект наблюдается лишь в конце текущего цикла симуляции, поэтому все чтения array[j-1] возвращают мусор, т.к. присваивания в них еще не выполнены.
(Reply) (Parent) (Thread)
[User Picture]
From:ak_47
Date:July 19th, 2015 12:41 am (UTC)
(Link)
Это мощно. Я б не догадался. Но я не знаю верилога. Думал что там из-за ненужного доступа к памяти ломается какая-то оптимизация, или всё медленнее в 1000 раз чем могло бы быть, и т.п..

Чисто из любопытства. Как тогда происходит присваивание в данном случае? Значение j кешируется, а потом оно всё одномоментно забивается в array?
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 19th, 2015 01:03 am (UTC)
(Link)
Дополнительная хохма в том, что сломалось из-за сочетания использования неправильного присваивания и идиотского стиля программирования.

Да, все присваивания через <= заносятся в список, который отрабатывается в конце цикла симуляции перед инкрементом текущего времени симулятора. Таким образом можно писать, например,
always @(posedge clk) begin
    a <= b;
    b <= a;
end
, и значения регистров a и b будут меняться местами каждый такт сигнала. 
(Reply) (Parent) (Thread)
[User Picture]
From:ak_47
Date:July 19th, 2015 01:20 am (UTC)
(Link)
Понравилось. :) Хорошая гимнастика для ума писать так, зная что это всё подвешено в воздухе, а потом - раз, и сбросилось в переменные.

Лирическое отступление. На Ц/Ц++ меня обычно раздражает код вида:
bool CheckFlag(bool flag)
{
    if (flag == true)
        return true;

    return false;
}


Глупое животное! Золота Кода не может быть слишком много!
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 19th, 2015 01:31 am (UTC)
(Link)
Если бы С++ был преферансом, за такое надо было бы бить канделябром.
(Reply) (Parent) (Thread)
[User Picture]
From:ak_47
Date:July 19th, 2015 01:36 am (UTC)

(Link)
Однозначно!
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 17th, 2015 11:01 pm (UTC)
(Link)
Во-первых, j минус 1, а во-вторых, в чем, собственно, функциональная разница?
(Reply) (Parent) (Thread)
[User Picture]
From:rkatsyv
Date:July 18th, 2015 03:37 am (UTC)
(Link)
Yes, yes, mutatis mutandis
(Reply) (Parent) (Thread)
[User Picture]
From:rkatsyv
Date:July 18th, 2015 03:41 am (UTC)
(Link)
Опять же, это просто ошибка или плохое знание используемого языка.
Что, конечно, плохо, но бывает.
А вот сама идея написать array[j] <= 1 + array[j-1]; указывает на то, что человек думает жопой.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 03:48 am (UTC)
(Link)
Так всё одно к одному. Это не просто плохое знание языка, это полнейшее непонимание, что означают его конструкции, примерно как в С++ написать

int i = (int) new int(12345);

(Reply) (Parent) (Thread)
[User Picture]
From:igorek
Date:July 18th, 2015 01:48 am (UTC)
(Link)
А-а-а-а-а-а - в смысле зачем?
индусы писали небось? :)
(Reply) (Thread)
[User Picture]
From:igorek
Date:July 18th, 2015 01:50 am (UTC)
(Link)
Так будет лучше? ;)

int array[0:7];

initial begin
for (int j = 0; j < 8; j++)
array[j] <= j-1;
end
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 01:53 am (UTC)
(Link)
Так будет лучше. Вопрос, почему именно, остается открытым. :)

(Reply) (Parent) (Thread)
[User Picture]
From:igorek
Date:July 18th, 2015 02:31 am (UTC)
(Link)
ссылка на память против константы - кто побеждает?
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 02:46 am (UTC)
(Link)
Это ерунда, поскольку выполняется всего один раз ("initial"). Проблема чисто верилоговская.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 01:53 am (UTC)
(Link)
Плоскогорье Декан, упомянутое в сабжекте, у нас где?
(Reply) (Parent) (Thread)
[User Picture]
From:igorek
Date:July 18th, 2015 02:24 am (UTC)
(Link)
Не уловил, знание географии слабое
(Reply) (Parent) (Thread)
[User Picture]
From:ramlamyammambam
Date:July 18th, 2015 02:44 am (UTC)
(Link)
Неблокирующее присваивание тут смешно смотрится.
В правой части присваивания для array[1:7] оказывается неопределенное значение.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 02:47 am (UTC)
(Link)
Вот именно. А при беглом чтении не заметно.
(Reply) (Parent) (Thread)
[User Picture]
From:archaicos
Date:July 18th, 2015 02:52 am (UTC)
(Link)
Жуткая семантика. :)
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 03:10 am (UTC)
(Link)
Она отражает алгоритм симуляции, и в общем случае необходима. В каждой песочнице свои погремушки.
(Reply) (Parent) (Thread)
[User Picture]
From:ramlamyammambam
Date:July 18th, 2015 03:37 am (UTC)
(Link)
Запретить бы неблокирующие присваивания в блоке initial.
Если без явной задержки.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 03:50 am (UTC)
(Link)
Или если не запретить, то хотя бы чтобы компилятор предупреждал.
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:July 18th, 2015 10:35 am (UTC)
(Link)
Все-таки это демонстрация скорее кривизны парадигмы языка, нежели прокладки между клавиатурой и экраном.

Вот почему бы все содержимое блока initial не вычислить до дна на ранней стадии (а если циклится, то вывалиться с ошибкой)? Нет, это конечно корявое решение, надо что-то в консерватории менять.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 18th, 2015 03:52 pm (UTC)
(Link)
Например, потому, что в этом блоке может происходить взаимодействие с внешним миром.
(Reply) (Parent) (Thread)
[User Picture]
From:kcmamu
Date:July 20th, 2015 06:10 pm (UTC)
(Link)
Не всегда это можно. Там бывает бесконечный по времени цикл с разумными целями (например, генератор тактовых импульсов).
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:July 20th, 2015 07:49 pm (UTC)
(Link)
Это как раз не очень понятно. Вроде бы слово initial означает, что всё должно произойти за конечное время.

Вообще идея закопать и сделать неявными парадигматически значимые понятия (такие как тактовый сигнал и асинхронный ресет) в языке чревата тем, что регулярно будет появляться код, приведенный в посте.
(Reply) (Parent) (Thread)
[User Picture]
From:kcmamu
Date:July 20th, 2015 09:14 pm (UTC)
(Link)
Слово "initial" обозначает всего лишь, что данная активность запускается один раз при старте системы. С тем же успехом можно было бы его в язык не вводить, а взамен завести системный сигнал, который дергается один раз в самом начале работы: "initial" = "always @($PowerOn)".

А вообще для понимания этого языка полезно уметь написать для него design compiler, пусть даже совсем прямолинейный. Там разница между "=" и "<=" становится очевидна.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:July 20th, 2015 09:53 pm (UTC)
(Link)
А вообще для понимания этого языка полезно уметь написать для него design compiler

К сожалению, в курс подготовки application engineer это не входит. :(
(Reply) (Parent) (Thread)