*** Предупреждение: WARN_GEN_CFA_UNSUPPORTED: в specman, почему я получаю его и что это значит?
У меня есть этот код:
<'
type type_t:[GOOD,BAD];
struct packet {
t:type_t;
!header:uint(bits:3);
};
extend sys {
!pkt:packet;
keep read_only(pkt.t==GOOD) => pkt.header==6;
run() is also {
gen pkt;
gen pkt.header;
print pkt;
};
};
'>
И когда я запускаю его, я получаю это странное предупреждение, когда пытаюсь сгенерировать pkt.header:
*** Warning: WARN_GEN_CFA_UNSUPPORTED:
The following constraint-from-above includes input(s) which cannot be sampled
during the allocation of packet-@1.
keep read_only(pkt.t == GOOD) => pkt.header == 6 at line 9 in @gen
Enforcing the constraint through later sampling of these inputs is not
supported yet, and therefore it will not be enforced in the following
gen-action.
at line 12 in @gen
gen pkt.header;
Это странное сообщение об ошибке, так как, когда я выпускаю 'gen pkt.header', pkt уже генерируется (выделяется), как и 't'.
Я был бы признателен, если бы кто-нибудь объяснил мне это.
Спасибо,
4 ответа
Поведение в тестовом сценарии действительно является ошибкой. Предупреждение не должно быть выдано в этом сценарии. Существует исправление для проблемы, которое можно получить от поддержки Cadence.
Для получения общих сведений об ограничениях сверху и, в частности, об этом предупреждении вы можете обратиться к документации Specman (раздел 1.10 в Руководстве пользователя Specman Generation).
Это действительно выглядит странно. Особенно, если вы включите генерацию трассировки. Среди прочего, журнал показывает это:
-> 0 #GEN> решение связанного набора полей № 12 gen-action #3: (в sys-@1.pkt.header)
pkt.header
-> 0 #GEN> сокращение:
pkt.header -> [6]
due to constraints:
keep read_only(pkt.t == GOOD) => pkt.header == 6 at line 10 in @cfa_depr
**with the input state:**
read_only(pkt.t == GOOD): TRUE
-> 0 #GEN> законченное решение для связанных полей: (в sys-@1.pkt.header)
pkt.header: 6
constrained by:
keep read_only(pkt.t == GOOD) => pkt.header == 6 at line 10 in @cfa_depr
Это может быть ошибка, я уточню у разработчиков.
Во-первых, поле заголовка обозначено как!
', которое является полем "не генерировать", удаляя его, и предупреждение исчезнет. Если pkt не был сгенерирован до того, как сгенерирован pkt.header, вы, вероятно, столкнетесь с ошибкой OS11 при попытке получить доступ к нераспределенной области памяти. Во-вторых, строка:
keep read_only(pkt.t==GOOD) => pkt.header==6;
Должен, вероятно, находиться внутри самой структуры (либо сsoft
или без него).
Я опробовал ваш код после прочтения больше о CFA, и кажется, что в Specman происходит что-то подозрительное. Как сказал Ханнес, это, вероятно, ошибка.