Статические поля/ методы в e

#e

#specman #e

Вопрос:

Есть ли какая-либо техническая причина, по которой я пропускаю, по которой у e нет статических полей / методов?

Я просмотрел LRM, и там нет упоминания ни о чем подобном. Есть обходной путь (например, этот:http://www.specman-verification.com/index.php?entry=entry060612-105347), но я не нахожу это особенно чистым подходом, поскольку он не очень хорошо инкапсулирован.

Ответ №1:

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

Однако мне это не кажется очень критичным, потому что статическое поле — это, по сути, не более чем глобальное поле (или метод, или любой другой элемент структуры), который принадлежит пространству имен данной структуры. Итак, даже без наличия статических элементов, простым обходным путем является добавление такого элемента в global (или to sys ) и убедитесь, что его имя имеет префикс, который ясно указывает на «принадлежность» к данной структуре.

Однако есть важный момент, который делает статические элементы чем-то большим, чем просто членом global . В e, как и в C , существуют template типы. Статический член a template был бы чем-то, что, с одной стороны, является общим для всех объектов экземпляра данного типа экземпляра шаблона, но, с другой стороны, существовало бы отдельно для каждого экземпляра шаблона (каждый из которых является отдельной структурой).

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

Комментарии:

1. Хотя я согласен с тем, что использование global является лучшим способом выполнения (и более чистым), у него все еще есть проблема с плохой инкапсуляцией. Существует (хотя и очень небольшая) вероятность того, что поле, которое мы хотим определить, может конфликтовать с другим полем из какого-то другого импортируемого нами кода.

Ответ №2:

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

В e, как и в C , существуют template типы. Статическим членом a template было бы то, что, с одной стороны, является общим для всех объектов экземпляра данного типа экземпляра шаблона, но, с другой стороны, будет существовать отдельно для каждого экземпляра шаблона (каждый из которых является отдельной структурой).

Комментарии:

1. Привет, Юрий! Вы как раз тот человек, который, как я надеялся, ответит на этот вопрос. Я скопирую текст из этого ответа в предыдущий и приму его как полный ответ, если вы не возражаете.

Ответ №3:

Кстати, статические элементы структуры были добавлены в язык в Specman версии 15.2. Они удобны, особенно в структурах конфигурации, которые являются статическими:

 extend packet_s {
  static max_address : uint = 0x1000;
};

-- Change max_address for all instances
on xxx { packet_s::max_address = 0x2000; };
  

Статическое поле не может быть сгенерировано, физическое (%) или использовано в подтипах when. Вот несколько комментариев из блога teamspecman : Статические элементы в e

Ответ №4:

Я думаю, что основная причина, по которой e еще не имеет статических структурных элементов, заключается в том, что у вас всегда есть глобальные и системные синглтоны, а также верхний блок вашего конкретного модуля (что означает лучшую инкапсуляцию), где может быть размещена «статическая» информация. Для этого нет особой технической причины, кроме некоторой сложности в определении точной семантики.

В качестве синтаксического сахара для доступа к модулю вы всегда можете обернуть его очень простым макросом из одного слова — это не будет полностью бесшовным, потому что это волшебное слово всегда будет требоваться по сравнению с изначально видимыми статическими элементами структуры ‘me’, но все равно очень простым в использовании.

Комментарии:

1. Привет, Родион, что ты подразумеваешь под верхним блоком конкретного модуля?

2. Я имел в виду, что если вы работаете над каким-то конкретным компонентом, связанным с определенной целью (например, монитором) или определенной частью ИУ (например, usb-контроллером), у вас, вероятно, есть какой-то верхний модуль, который используется для создания экземпляра этого компонента, и он всегда показывает, когда этот код должен выполняться. Конечно, если ваш код очень общий, вы можете полагаться только на global или sys.

3. Я использовал слово «модуль» в общем смысле, а не как термин «e».