Я хотел бы реализовать регистр, который использует шаблон write_1_clears с настраиваемыми побочными эффектами, но он не работает.
Вот моя попытка:
bank regs{
register myReg @ 0x0 is (write_1_clears) {
method write_register(uint64 value, uint64 enabled_bytes, void *aux) {
default(value, enabled_bytes, aux);
update_something(); // This is a function defined somewhere else
}
}
}
Однако я получаю следующую ошибку компиляции: ошибка: попытка переопределить метод write_register, отличный от стандартного. /linux64/bin/dml/1.4/dml-builtins.dml:3481:5: конфликтующее определение
Не могли бы вы рассказать мне, как этого добиться?
Встроенный шаблон write_1_clears
выполняет две функции:
write_field
, который в случае регистров будет определять непереопределяемую реализацию write_register()
, выраженную в терминах метода write_field()
, который необходимо реализовать отдельно.write_1_clears
затем предоставляет эту реализацию write_field()
и делает эту реализацию также непереопределяемой.Короче говоря: вы не можете создать экземпляр встроенного шаблона write_1_clears
, а затем дополнительно настроить поведение регистра/поля. Определенный шаблон не предоставляет для этого никаких средств. Шаблоны, которые предлагает utility.dml
, в этом отношении очень негибкие, и команда DML рассматривает возможность их обновления, чтобы сделать предлагаемые функции более расширяемыми. Тем временем вам придется написать свой код, воспроизводящий поведение write_1_clears
. К счастью, это довольно просто:
register myReg @ 0x0 {
method write_register(uint64 value, uint64 enabled_bytes, void *aux) {
default(this.get() & ~value, enabled_bytes, aux);
// alternatively (closer to how utility.dml does it):
// default(~value, enabled_bytes & value, aux);
update_something();
}
}