Jump to content

    
Sign in to follow this  
flammmable

VCS настолько же хреновый как ModelSim или нет?

Recommended Posts

Те кто писали на Паскале и на Си, знают, что у Паскаля все переменные описываются в начале функции в специальном блоке var. А в Си переменную можно объявить где угодно. С какого-то момента - даже внутри заголовка цикла for(int i=0, i <10, i++). Понятно, что на такое компилятор какого-нибудь MCU не способен. И всё же я слегка офигел, когда компилятор Си от Microchip начал выдавать неочевидную ошибку, по сути ругаясь на то, что в начале функции между объявлениями переменных у меня затесалось что-то типа a=b+c; . Т.е. это компилятор Си, и блока var нет. Но писать переменные надо всё равно только в начале функции и ничем их не разбавлять.

Но когда ModelSim говорит undefined variable: 'my_reg' на вот такой код

module my_module(output out_my_reg);
	assign out_my_reg = my_reg;
	reg my_reg;
endmodule

(если поменять строки reg и assign местами, то всё работает, причем синтезатору-то пофиг - он собирает и так и эдак) то я думаю, а зачем вообще декларировать хоть какую-то поддержку Верилога? Нет, серьезно. Позиционировали бы себя как надежный симулятор VHDL-а.

Поэтому вопрос. Дико платный, крайне закрытый и жутко элитарный VSD такую же фигню творит? Или он покруче?

Share this post


Link to post
Share on other sites

Тул отругался на некорректный код. Надо бы спасибо сказать, не?

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

 

p.s.

Если тул офицально поддерживает какую то спецификацию, то поддерживать он ее должен до последней строчки. Видать, в верилоге-95 так писать нельзя. Можете попробовать компильнуть под более свежий формат верилога- 2001. Хотя как по мне - глаза режет.

Edited by Aleх

Share this post


Link to post
Share on other sites
1 час назад, flammmable сказал:

(если поменять строки reg и assign местами, то всё работает, причем синтезатору-то пофиг - он собирает и так и эдак)

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

Share this post


Link to post
Share on other sites
12 minutes ago, andrew_b said:

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

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

Share this post


Link to post
Share on other sites
4 часа назад, flammmable сказал:

Код абсолютно корректен.

Ну да. Верилог позволяет не просто выстрелить себе в ногу, а сделать это из гранатомёта. А потом приходится, «поминая тихим матерным словом» изобретателей языка, выяснять, а хрена ли такой «абсолютно корректный код» абсолютно некорректно работает.

4 часа назад, flammmable сказал:

Продолжите вашу мысль про сюрприз

Сейчас не могу процитировать точно, но Вивадо, например, вместо необъявленного вектора делает однобитный сигнал. Разумеется, мы имеем только 0 или 1 там, где дожно быть, например, 245 или, -16.

Share this post


Link to post
Share on other sites

в sv при инстанциации в some_module inst_1(.*); практически все тулзы подразумевают 1 битовый неявный сигнал к порту, независимо от того что объявлено в some_module

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

----------------

это поганый квартус :) разрешает писать как придется, потом много удивления, когда другой тул

Share this post


Link to post
Share on other sites

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

5 hours ago, flammmable said:

Код абсолютно корректен. Оба его варианта синтаксически идентичны, что в однобитном, что в многобитном исполнении.

Корректный с вашей точки зрения? Или с точки зрения стандарта? Ссылку на соответствующий пункт не дадите? 

1 hour ago, andrew_b said:

Ну да. Верилог позволяет не просто выстрелить себе в ногу, а сделать это из гранатомёта.

Это если неграмотной обезьяне дать гранатомет. Но в таком случае  и на VHDL отстрелить себе что-то можно  (или застрелится :wacko2:) Да и на других языках аналогично.  

12 minutes ago, yes said:

в sv при инстанциации в some_module inst_1(.*); практически все тулзы подразумевают 1 битовый неявный сигнал к порту, независимо от того что объявлено в some_module

Quote

4.5 Implicit declarations
...
- If an identifier is used in the terminal list of a primitive instance or a module instance, and that
identifier has not been declared previously in the scope where the instantiation appears or in any
scope whose declarations can be directly referenced from the scope where the instantiation appears
(see 12.7), then an implicit scalar net of default net type shall be assumed.

Лечится все это просто - `default_nettype none

Удачи! Rob.

Share this post


Link to post
Share on other sites
19 hours ago, flammmable said:

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

Код не корректен. Если считаете что это не так, дайте ссылку на раздел стандарта, разрешающий присваивание, где в rhs стоит необъявленная переменная. Вот синтезатор работает не по стандарту, это да. 

ЗЫ. А если это еще и квартус, так он еще и wire с reg путает) 

Share this post


Link to post
Share on other sites
4 hours ago, des00 said:

Код не корректен. Если считаете что это не так, дайте ссылку на раздел стандарта, разрешающий присваивание, где в rhs стоит необъявленная переменная. Вот синтезатор работает не по стандарту, это да. 

ЗЫ. А если это еще и квартус, так он еще и wire с reg путает) 

Прошу прощения. Чего-то меня вчера заклинило. В Си, переменную можно объявить в любом месте (как и регистр в Верилоге), но это нужно сделать, разумеется, ДО её использования. Думаю, что Верилог вполне следует тому же принципу. И МоделСим разумно выставляет ошибку. Хотя в теории (да и на практике в Квартусе) нет объективных препятствий для создания синтезатора/симулятора, который бы реализовывал синтаксис с объявлением регистров хоть в самом конце модуля.

Share this post


Link to post
Share on other sites
12 минут назад, flammmable сказал:

Думаю, что Верилог вполне следует тому же принципу.

Без "думаю" это описано в стандарте.

13 минут назад, flammmable сказал:

нет объективных препятствий для создания синтезатора/симулятора, который бы реализовывал синтаксис с объявлением регистров хоть в самом конце модуля

Препятствие простое - не соответствие стандарту.

Share this post


Link to post
Share on other sites
В 23.04.2020 в 11:50, flammmable сказал:

Те кто писали на Паскале и на Си, знают, что у Паскаля все переменные описываются в начале функции в специальном блоке var. А в Си переменную можно объявить где угодно. С какого-то момента - даже внутри заголовка цикла for(int i=0, i <10, i++). Понятно, что на такое компилятор какого-нибудь MCU не способен. И всё же я слегка офигел, когда компилятор Си от Microchip начал выдавать неочевидную ошибку, по сути ругаясь на то, что в начале функции между объявлениями переменных у меня затесалось что-то типа a=b+c; . Т.е. это компилятор Си, и блока var нет. Но писать переменные надо всё равно только в начале функции и ничем их не разбавлять.

Строго говоря, пример C не вполне корректен. До стандарта С99 все переменные в C должны были быть определены в начале блока. Если компилятор работает не в в режиме C99 или еще новее, то он прав и ошибка вполне очевидная.

Другое дело, что до введения стандарта C99 многие компиляторы (главное - GNU C) де-факто поддерживали определение переменных в произвольном месте блока, но это было расширением языка.

В 23.04.2020 в 11:50, flammmable сказал:

Но когда ModelSim говорит undefined variable: 'my_reg' на вот такой код

И хорошо делает. Я был бы ему только благодарен за дополнительную заботу.

Скорее всего такое поведение регулируется какими-то настройками или ключами, но я бы его не отключал :)

Share this post


Link to post
Share on other sites
On 4/23/2020 at 7:34 PM, RobFPGA said:

Лечится все это просто - `default_nettype none

встречал такое в чужих исходниках..

всё не мог понять для чего же это

Share this post


Link to post
Share on other sites
1 hour ago, demidrol said:

чего только не выдумывают люди, лишь бы не использовать verilog-mode. AUTOREG/AUTOWIRE знатно помогают создавать такие вот декларативные блоки.

да, толковая была вещь.

но сейчас все пользуют синтезируемое подмножество SV (кто не пользует - советую), в нем смысла в verilog-mode очень мало

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this