【问题标题】:Field that relies on a value of a different field in the same register in DML 1.4依赖于 DML 1.4 中同一寄存器中不同字段值的字段
【发布时间】:2023-01-23 22:46:45
【问题描述】:

我有一部分寄存器看起来像这样

register CC {
    field CSS @ [6:4] is write {
        method write(uint64 value) {
            if (CC.EN.val == 0b1) {
                log spec_viol: "Command set selection should not " +
                "occur when controller has been enabled.";
                return;
            }
            default(value);
        }
    }
    field EN @ [0];
}

如何通过设置寄存器CC的值来确保CC.EN被设置为1(第一次)时,CC.CSS中的spec-viol不会发生?

我第一次尝试写入寄存器并触发了 spec-viol

【问题讨论】:

  • 根据文档,“[read_register] 的实现按从最低到最高有效位的顺序调用所有子字段 [..] 的 read_field 方法”,所以假设 little-endian bitorder 我认为 EN应该写在CSS.write之前?
  • 哦,没关系,从我身边草率阅读。您想要的语义是 EN 值来自写入应适用于当前写入的 CSS。所以在你的代码中,字段顺序意味着 EN 在 CSS 读取它之前被覆盖,这不是你想要的。

标签: dml-lang


【解决方案1】:

DML 中寄存器中的字段按最低有效位递增的顺序访问。这意味着在您的示例中,EN 字段将被写入CCS 字段。所以要实现这个我们必须通过EN的状态写入寄存器。我们通过使用 write_registerwrite_field 模板中的 void *aux 参数来做到这一点:

register CC {
    method write_register(uint64 value, uint64 enabled_bytes, void *aux) {
        local bool was_enabled = EN.val;
        default(value, enabled_bytes, &was_enabled);
    }

    field CSS @ [6:4] is write_field {
        method write_field(uint64 value, uint64 enabled_bits, void *aux) {
            if ((this.val & enabled_bits) == (value & enabled_bits))
                return;  // no change, ignore
            if (*cast(aux, *bool)) {
                log spec_viol: "Command set selection should not " +
                "occur when controller has been enabled.";
                return;
            }
            this.val = (this.val & ~enabled_bits) | (value & enabled_bits);
        }
    }

    field EN @ [0];
}

【讨论】:

  • 当我尝试这样做时,它会出现编译错误,因为 write_field 没有默认实现。
  • 以及它是如何更新的,以便它工作。
【解决方案2】:

另一个不依赖顺序的选项:

register CC {
    method write_register(uint64 value, uint64 enabled_bytes, void *aux) {
        if (this.val[EN.msb] && value[EN.msb]) {
            if ((CSS.val & (enabled_bytes[CSS.msb:CSS.lsb])) != (value[CSS.msb : CSS.lsb])) {
                log spec_viol: "%s Command set selection should not " +
                "occur when controller has been enabled.", this.qname;
                value[CSS.msb : CSS.lsb] = CSS.val;
            }

        }
        default(value, enabled_bytes, aux);
    }

    field CSS @ [6:4];
    field EN @ [0] is (write) {
        method write(uint64 value) {
            // Do something...
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2014-12-01
    相关资源
    最近更新 更多