Верилоговская проблема в том, что у т.н. "неблокирующего" присваивания, обозначаемого <=, эффект наблюдается лишь в конце текущего цикла симуляции, поэтому все чтения array[j-1] возвращают мусор, т.к. присваивания в них еще не выполнены.
Это мощно. Я б не догадался. Но я не знаю верилога. Думал что там из-за ненужного доступа к памяти ломается какая-то оптимизация, или всё медленнее в 1000 раз чем могло бы быть, и т.п..
Чисто из любопытства. Как тогда происходит присваивание в данном случае? Значение j кешируется, а потом оно всё одномоментно забивается в array?
Дополнительная хохма в том, что сломалось из-за сочетания использования неправильного присваивания и идиотского стиля программирования.
Да, все присваивания через <= заносятся в список, который отрабатывается в конце цикла симуляции перед инкрементом текущего времени симулятора. Таким образом можно писать, например,
always @(posedge clk) begin
a <= b;
b <= a;
end
, и значения регистров a и b будут меняться местами каждый такт сигнала.
Опять же, это просто ошибка или плохое знание используемого языка. Что, конечно, плохо, но бывает. А вот сама идея написать array[j] <= 1 + array[j-1]; указывает на то, что человек думает жопой.
Все-таки это демонстрация скорее кривизны парадигмы языка, нежели прокладки между клавиатурой и экраном.
Вот почему бы все содержимое блока initial не вычислить до дна на ранней стадии (а если циклится, то вывалиться с ошибкой)? Нет, это конечно корявое решение, надо что-то в консерватории менять.
Это как раз не очень понятно. Вроде бы слово initial означает, что всё должно произойти за конечное время.
Вообще идея закопать и сделать неявными парадигматически значимые понятия (такие как тактовый сигнал и асинхронный ресет) в языке чревата тем, что регулярно будет появляться код, приведенный в посте.
Слово "initial" обозначает всего лишь, что данная активность запускается один раз при старте системы. С тем же успехом можно было бы его в язык не вводить, а взамен завести системный сигнал, который дергается один раз в самом начале работы: "initial" = "always @($PowerOn)".
А вообще для понимания этого языка полезно уметь написать для него design compiler, пусть даже совсем прямолинейный. Там разница между "=" и "<=" становится очевидна.
no subject
Date: 2015-07-17 09:36 pm (UTC)no subject
Date: 2015-07-17 09:49 pm (UTC)no subject
Date: 2015-07-17 10:48 pm (UTC)no subject
Date: 2015-07-17 10:11 pm (UTC)2. Аааааааа!!
P.S. При этом же еще и работать не будет
no subject
Date: 2015-07-17 10:38 pm (UTC)no subject
Date: 2015-07-17 10:19 pm (UTC)no subject
Date: 2015-07-17 10:37 pm (UTC)no subject
Date: 2015-07-17 10:42 pm (UTC)А вот
array[j] <= 1 + array[j-1];
вместо
array[j] <= j;
вот это уже плоскогорье Деккан
no subject
Date: 2015-07-17 10:44 pm (UTC)no subject
Date: 2015-07-18 03:13 am (UTC)no subject
Date: 2015-07-19 12:41 am (UTC)Чисто из любопытства. Как тогда происходит присваивание в данном случае? Значение j кешируется, а потом оно всё одномоментно забивается в array?
no subject
Date: 2015-07-19 01:03 am (UTC)Да, все присваивания через <= заносятся в список, который отрабатывается в конце цикла симуляции перед инкрементом текущего времени симулятора. Таким образом можно писать, например,
always @(posedge clk) begin a <= b; b <= a; endno subject
Date: 2015-07-19 01:20 am (UTC)Лирическое отступление. На Ц/Ц++ меня обычно раздражает код вида:
bool CheckFlag(bool flag) { if (flag == true) return true; return false; }Глупое животное!
ЗолотаКода не может быть слишком много!no subject
Date: 2015-07-19 01:31 am (UTC)no subject
no subject
Date: 2015-07-17 11:01 pm (UTC)no subject
Date: 2015-07-18 03:37 am (UTC)no subject
Date: 2015-07-18 03:13 am (UTC)no subject
Date: 2015-07-18 03:41 am (UTC)Что, конечно, плохо, но бывает.
А вот сама идея написать array[j] <= 1 + array[j-1]; указывает на то, что человек думает жопой.
no subject
Date: 2015-07-18 03:48 am (UTC)int i = (int) new int(12345);
no subject
Date: 2015-07-18 01:48 am (UTC)индусы писали небось? :)
no subject
Date: 2015-07-18 01:50 am (UTC)int array[0:7];
initial begin
for (int j = 0; j < 8; j++)
array[j] <= j-1;
end
no subject
Date: 2015-07-18 01:53 am (UTC)no subject
Date: 2015-07-18 02:31 am (UTC)no subject
Date: 2015-07-18 02:46 am (UTC)no subject
Date: 2015-07-18 01:53 am (UTC)no subject
Date: 2015-07-18 02:24 am (UTC)no subject
Date: 2015-07-18 02:44 am (UTC)В правой части присваивания для array[1:7] оказывается неопределенное значение.
no subject
Date: 2015-07-18 02:47 am (UTC)no subject
Date: 2015-07-18 02:52 am (UTC)no subject
Date: 2015-07-18 03:10 am (UTC)no subject
Date: 2015-07-18 03:37 am (UTC)Если без явной задержки.
no subject
Date: 2015-07-18 03:50 am (UTC)no subject
Date: 2015-07-18 10:35 am (UTC)Вот почему бы все содержимое блока initial не вычислить до дна на ранней стадии (а если циклится, то вывалиться с ошибкой)? Нет, это конечно корявое решение, надо что-то в консерватории менять.
no subject
Date: 2015-07-18 03:52 pm (UTC)no subject
Date: 2015-07-20 06:10 pm (UTC)no subject
Date: 2015-07-20 07:49 pm (UTC)Вообще идея закопать и сделать неявными парадигматически значимые понятия (такие как тактовый сигнал и асинхронный ресет) в языке чревата тем, что регулярно будет появляться код, приведенный в посте.
no subject
Date: 2015-07-20 09:14 pm (UTC)А вообще для понимания этого языка полезно уметь написать для него design compiler, пусть даже совсем прямолинейный. Там разница между "=" и "<=" становится очевидна.
no subject
Date: 2015-07-20 09:53 pm (UTC)К сожалению, в курс подготовки application engineer это не входит. :(