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

Verilog, пространство имён

Разглядываю IEEE Std 1364-2001. На стр. 38 есть глава 3.12 Name spaces.

Цитата

3.12 Name spaces
In Verilog HDL, there are seven name spaces; two are global and five are local. The global name spaces are
definitions and text macros. The definitions name space unifies all the module (see 12.1), macromodule
(see 12.1), and primitive (see 8.1) definitions. Once a name is used to define a module, macromodule, or
primitive, the name shall not be used again to declare another module, macromodule, or primitive.
The text macro name space is global. Since text macro names are introduced and used with a leading ‘ character,
they remain unambiguous with any other name space (see 19.3). The text macro names are defined in
the linear order of appearance in the set of input files that make up the description of the design unit. Subsequent
definitions of the same name override the previous definitions for the balance of the input files.
There are five local name spaces: block, module, port, specify block, and attribute. Once a name is defined
within one of the five name spaces, it shall not be defined again in that space (with the same or a different
type).
The block name space is introduced by the named block (see 9.8), function (see 10.3), and task (see 10.2)
constructs. It unifies the definitions of the named blocks, functions, tasks, parameters, named events and the
variable type of declaration (see 3.2.2). The variable type of declaration includes the reg, integer, time,
real, and realtime declarations.
The module name space is introduced by the module, macromodule, and primitive constructs. It unifies
the definition of functions, tasks, named blocks, instance names, parameters, named events, net type of declaration,
and variable type of declaration. The net type of declaration includes wire, wor, wand, tri, trior,
triand, tri0, tri1, trireg, supply0, and supply1 (see 3.7).

The port name space is introduced by the module, macromodule, primitive, function, and task constructs.
It provides a means of structurally defining connections between two objects that are in two different name
spaces. The connection can be unidirectional (either input or output) or bidirectional (inout). The port
name space overlaps the module and the block name spaces. Essentially, the port name space specifies the
type of connection between names in different name spaces. The port type of declarations include input,
output, and inout (see 12.3). A port name introduced in the port name space may be reintroduced in the
module name space by declaring a variable or a wire with the same name as the port name.
The specify block name space is introduced by the specify construct (see 14.2).
The attribute name space is enclosed by the (* and *) constructs attached to a language element (see 2.8). An
attribute name can be defined and used only in the attribute name space. Any other type of name cannot be
defined in this name space.

И что-то её смысл от меня ускользает.

Я так понимаю имеется в виду то что могут совподать имену у разных "сущностей". Например, у переменной и модуля может быть одно имя.

Но если так, то почему и в обзаце о пространстве имен блоков и в абзаце про пространство имен модулей пишут о типах переменных. Т.е. переменные существуют в обоих этих пространствах? Или я что-то тут не понял? Английским в совершенстве не владею, возможно упускаю какие-то тонкости формулировок.

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


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

2 hours ago, Jackov said:

Т.е. переменные существуют в обоих этих пространствах?

В модули вложены именованные блоки, а в них вложенны переменные. Так что да, они видны сразу в 2х пространствах.

Пространства имён в Verilog не являются независимыми сущностями - они могут быть вложенны друг в друга, так что то, что живёт в них оказываются сразу в нескольких пространствах

 

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


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

18 минут назад, xvr сказал:

В модули вложены именованные блоки, а в них вложенны переменные. Так что да, они видны сразу в 2х пространствах.

Пространства имён в Verilog не являются независимыми сущностями - они могут быть вложенны друг в друга, так что то, что живёт в них оказываются сразу в нескольких пространствах

 

То что переменные созданные в одном блоке не видны в другом это область видимости.

Пространство имён, если я правильно понимаю, это то, что в пределах одной области видимости мы можем дать одинаковые имена разным сущностям, например типу модуля, инстанции модуля, переменной, атрибуту (* *), т.е.:

(*name1*) reg name1;

name1 name1();

 

3 часа назад, Jackov сказал:

в обзаце о пространстве имен блоков и в абзаце про пространство имен модулей пишут о типах переменных

Кстати, про задачи и функции тоже пишут и там и там.

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


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

56 minutes ago, Jackov said:

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

А так же то, что не можете дать одинаковые имена сущностям одного типа. И то, что именованные сущности ищутся в иерархии областей видимости.

Так что понятие областей видимости и пространств имён в некотором роде пересекаются - области видимости работают внутри пространств имён и то и другое образуют иерархии.

 

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


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

20 часов назад, xvr сказал:

А так же то, что не можете дать одинаковые имена сущностям одного типа. И то, что именованные сущности ищутся в иерархии областей видимости.

Так что понятие областей видимости и пространств имён в некотором роде пересекаются - области видимости работают внутри пространств имён и то и другое образуют иерархии.

 

Это понятно. Непонятно прочему пространство имён блоков и пространство имён модулей разделены если и там и там одно и тоже?

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


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

On 7/24/2023 at 7:23 PM, Jackov said:

Непонятно прочему пространство имён блоков и пространство имён модулей разделены если и там и там одно и тоже?

Они вводятся разными конструкциями и не совсем одинаковые - в модулях есть net type of declaration, чего нет в блоках.

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


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

5 часов назад, xvr сказал:

Они вводятся разными конструкциями и не совсем одинаковые - в модулях есть net type of declaration, чего нет в блоках.

Да, я тоже обратил внимание. И вообще, я немного не под тем углом прочитал всё это, теперь более менее прояснилось.

Осталось непонятным почему вообще есть пространство портов, ведь при создании порта в модуле автоматически создаётся wire/reg? Т.е. порты существуют в пространстве модуля, не получится написать так:

Цитата

module M M1(..., input In, ...);

...

wire In;

...

endmodule

 

Читаю соответствующий абзац и вообще смысла его не понимаю:

Цитата

The port name space is introduced by the module, macromodule, primitive, function, and task constructs.
It provides a means of structurally defining connections between two objects that are in two different name
spaces. The connection can be unidirectional (either input or output) or bidirectional (inout). The port
name space overlaps the module and the block name spaces. Essentially, the port name space specifies the
type of connection between names in different name spaces. The port type of declarations include input,
output, and inout (see 12.3). A port name introduced in the port name space may be reintroduced in the
module name space by declaring a variable or a wire with the same name as the port name.

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

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


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

32 minutes ago, Jackov said:

Т.е. порты существуют в пространстве модуля, не получится написать так: ...

Но вы вы может написать так 

module tst(aa,bb,cc);
  input  aa;
  inout  bb;
  output cc;

  wire aa;
  tri  bb;
  reg  cc;
  ...
endmodule

 

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


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

19 часов назад, RobFPGA сказал:

Но вы вы может написать так 

Хм... Я никогда не был фанатом старого синтаксиса и думал, что согласно ему надо писать так

module tst(aa,bb,cc);
  input  aa;
  inout  bb;
  output reg cc;
  ...
endmodule

Оказывается можно и этак.

Но всё равно,

aa,

input  aa;

wire aa;

описывают одну и ту же сущность. Зачем они ввели отдельное пространство имён для портов?

Я то думал, что смысл пространств имён в том что мы можем давать одинаковые имена разнородным сущностям/элементам/объектам.

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


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

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

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

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

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

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

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

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

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

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