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

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

Те кто писали на Паскале и на Си, знают, что у Паскаля все переменные описываются в начале функции в специальном блоке 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 такую же фигню творит? Или он покруче?

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


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

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

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

 

p.s.

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

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

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


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

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

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

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

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


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

12 minutes ago, andrew_b said:

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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.

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


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

19 hours ago, flammmable said:

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

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

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

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


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

4 hours ago, des00 said:

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

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

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

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


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

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

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

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

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

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

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

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


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

В верилоге любой сигнал может быть объявлен в любом месте. Но! Использовать этот сигнал можно только после его объявления.

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


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

В 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' на вот такой код

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

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

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


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

On 4/23/2020 at 7:34 PM, RobFPGA said:

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

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

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

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


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

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

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


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

1 hour ago, demidrol said:

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

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

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

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


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

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

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

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

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

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

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

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

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

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