?

Log in

No account? Create an account
Bug или feature? - Юрий Панчул [entries|archive|friends|userinfo]
Money can buy bandwidth. Latency requires bribing God.

[ website | My Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Bug или feature? [Oct. 14th, 2014|05:48 pm]
Yuri Panchul
Сегодня обнаружил. Напускаем Synopsys VCS на вот такой код на Verilog-е:

`define a(d) $display ("%d", d)

module m;

    initial
    begin
        `a (1);
        $finish;
    end

endmodule


Получаем:

Error-[IFSFDT] Illegal format specifier for $display
t.v, 7
"%1"
  '%1' is not a valid format specification for display task.
  See the Verilog LRM, section 17.1.1.2.



Замечу, что в C это не так:

#include "stdio.h"

#define a(d) printf ("%d", d)

int main ()
{
    a (1);
    return 0;
}


- эта программа (очевидно) печатает ожидаемую единицу, не пытаясь подставлять внутри строки.


Что бы это значило?

Программист, который писал препроцессор верилога в Синопсисе был неопытен или криворук
6(28.6%)
Гениальная feature! Позволяет вставлять значения внутри строк в макросах
3(14.3%)
В этом месте программист в Синопсисе мыслил не как С-программист, а как Перловец
2(9.5%)
Я хочу пост про папоротники в каньоне в Мендосино
9(42.9%)
Из-за бугра плюете?
1(4.8%)


UPD: А, совсем забыл! У кого-нибудь есть под рукой стандарт Verilog-а IEEE 1364-2005, IEEE 1364-2001 или исконный IEEE 1364-1995? IEEE 1800-2005 (SystemVerilog) говорит вот что:


В SystemVerilog это все-таки баг:


23.2 ‘define macros

In Verilog, the ‘define macro text can include a backslash ( \ ) at the end of a line to show continuation on the next line.

In SystemVerilog, the macro text can also include `", `\`", and ``. An `" overrides the usual lexical meaning of " and indicates that the expansion should include an actual quotation mark. This allows string literals to be constructed from macro arguments. A `\`" indicates that the expansion should include the escape sequence \". For example:


`define msg(x,y) `"x: `\`"y`\`"`"


This expands


$display(`msg(left side,right side));


to


$display("left side: \"right side\"");


LinkReply

Comments:
[User Picture]From: bankworm
2014-10-15 02:44 am (UTC)
Какой непоследовательный программист компилятор делал. Замену параметра макроса внутри строки пропустил, а строгую проверку формата - нет. А ведь мог просто проигнорировать неизвестный символ, и программа выводила бы %1 -> 1. Хотя, скорее всего, это были два разных человека. Все претензии должны быть к третьему, который должен был компилятор тестировать.
(Reply) (Thread)
[User Picture]From: panchul
2014-10-15 03:01 am (UTC)
Я работал в команде, которая делала Synopsys VCS в 2001-2003 годах. Этот продукт имеет забавную историю. В частности в некоторый момент (в 1990-е) вся изначальная команда уволилась и подала на бывшего работодателя в суд. Однако гнусный Synopsys суд выиграл, а вместо изначальной команды нанял пару сотен новых программистов, целью которых было, чтобы regression pass. Они наложили кучу заплат, потом скрестили Verilog c Superlog, потом скрестили его с Vera, потом присоединили к нему симулятор VHDL - короче там образовался совершенно невероятный хаос, на котором они делают пару сотен миллионов долларов в год (только на этом продукте, а общее ревенью - $2B), доя крупные электронные компании на дорогие лицензии.

При этом (как мы видим выше) в продукте есть ошибки на уровне школьника.
(Reply) (Parent) (Thread)
[User Picture]From: bankworm
2014-10-15 03:23 am (UTC)
При такой истории продукта, его, наверное, уже боятся лишний раз трогать. Да и макросы с параметрами - не очень хороший стиль, вряд ли широко используются.
(Reply) (Parent) (Thread)
[User Picture]From: panchul
2014-10-15 03:34 am (UTC)
Его боятся трогать уже лет 15, но последние несколько лет им пришлось поддерживать хрень под названием Universal Verification Methodology (UVM), такая библиотека классов, в которой активно используются макросы в самом опасном стиле (т.е. они за спиной заводят саморегистрирующиеся структуры данных, использующие имена параметров в строках). (А до этого были VMM, OVM).

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

Может послать им пару таких багов в их customer support - там меня до сих пор помнят, я с ними ходил в 2002 году на ланчи и допрашивал о любовной жизни в Индии.
(Reply) (Parent) (Thread)
[User Picture]From: bankworm
2014-10-15 04:00 am (UTC)
У них есть, наверное, Known Bugs List, надо сначала с ним свериться :-)) Думаю, о столь очевидных проблемах они и сами знают.
(Reply) (Parent) (Thread)
[User Picture]From: spamsink
2014-10-15 04:18 am (UTC)
Прежде чем ругаться, попробуй vcs -sverilog.
(Reply) (Thread)
[User Picture]From: panchul
2014-10-15 04:32 am (UTC)
Ха, я не знал, что ты меня _так_ недооцениваешь. Конечно я это попробовал в первую очередь. Такая же фигня.
(Reply) (Parent) (Thread)
[User Picture]From: spamsink
2014-10-15 04:59 am (UTC)
Значит, можно файлить баг. Первоначальное поведение соответствует поведению сишного препроцессора времен Кернигана-Ричи, а при вкореживании SVerilog внимательно прочитать LRM поленились.
(Reply) (Parent) (Thread)
[User Picture]From: panchul
2014-10-15 05:12 am (UTC)
Насколько я помню, уже в версии CPP времене создания Джонсоновского PCC (1977 год?) символы в строках не расширялись.

Кстати, а ты в синопсисовскую столовую ходишь? Как она на твой вкус?
(Reply) (Parent) (Thread)
[User Picture]From: spamsink
2014-10-15 05:18 am (UTC)
Расширять параметры макроса в строках, содержащихся в теле макроса (в отличие от расширения макросов в строках, содержащихся в основном тексте), попросту удобно. Если это не нужно, то переименовать параметр очень легко.
В синопсисовскую столовую я хожу редко, но не жалуюсь (в еде я не привередлив), обычно беру из дома, а что?
(Reply) (Parent) (Thread)
[User Picture]From: panchul
2014-10-15 05:50 am (UTC)
Все что ты говоришь - звучит хорошо, пока не нужна портабильность кода с Cadence и Mentor.

В синопсисовской столовой я в свое время пристрастился есть тофу. Набирал его целую гору и ел.
(Reply) (Parent) (Thread)
[User Picture]From: spamsink
2014-10-15 06:00 am (UTC)
Кстати о портабельности Мичурин хорошо сказал. Мы не можем ждать портабельности от вендоров, писать портабельный код - наша задача.

Зафайлишь - скажи номер, я прослежу.
(Reply) (Parent) (Thread)
From: realurix
2014-10-15 04:42 am (UTC)
Я неоднократно сталкивался с тем, что т.н. "программисты", а правильнее сказать "кодировщики", ничего не знают про BNF-нотацию. Самый древний пример, ещё с середины 90-х годов прошлого века, - это "реализация" протокола SMTP из RFC-822 пИсателями от Некрософт. Они там зачем-то вставили пробел между символом-разделителем имени поля и его значения ':'. В результате во всех нормальных реализациях SMTP появляется параметр Necrosoft_compatible = yes/no;

В этом случае, как я понял, точно такая же бодяга - пИсатель ничего не знает о BNF-нотации и интерпретирует её как бык поссал.

Edited at 2014-10-15 04:44 am (UTC)
(Reply) (Thread)
[User Picture]From: panchul
2014-10-15 05:06 am (UTC)
Программисты в Синопсисе как раз BNF notation знают более чем хорошо - из них половина PhD. Но препрцессор как правило работает до основного парсера и может быть написанным ad hoc. Фишка в том, что этот эд хок нужно делать аккуратно.
(Reply) (Parent) (Thread)
From: realurix
2014-10-15 06:11 am (UTC)
> из них половина PhD
На саре написано ***, а там дрова. Вернее, в документе написано одно, а насколько это соответствует действительности только практикой и можно проверить. Я как-то столкнулся с одним PhD (доктором медицины) - не могла взять кровь из вены, всю руку истыкала, хотя медсестра потом сделала это моментально.
(Reply) (Parent) (Thread)
[User Picture]From: b0p0h0k
2014-10-15 07:21 am (UTC)
Близко знаю одну PhD Chem., которая не очень хорошо паяет стекло.
(Reply) (Parent) (Thread)
[User Picture]From: svinsp
2014-10-15 08:36 am (UTC)
+100500 ))
(Reply) (Parent) (Thread)
[User Picture]From: roland
2014-10-15 09:34 am (UTC)
Вот скажите мне - на кой черт доктору медицины уметь брать кровь из вены? o_O

Edited at 2014-10-15 09:34 am (UTC)
(Reply) (Parent) (Thread)
From: realurix
2014-10-15 11:12 am (UTC)
> Вот скажите мне - на кой черт доктору медицины уметь брать кровь из вены?
Вот скажите мне - на кой черт PhD знать BNF-нотацию?
(Reply) (Parent) (Thread)
From: irodenko
2014-10-17 06:12 am (UTC)
совсем не в тему но может быть интересно http://mysku.ru/blog/china-stores/26421.html ядро там ваше стоит
(Reply) (Thread)
[User Picture]From: panchul
2014-10-17 06:24 am (UTC)
О, спасибо!
(Reply) (Parent) (Thread)