#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».