【问题标题】:DML Conditional top level "in each" statementsDML 条件顶级 \"in each\" 语句
【发布时间】:2023-01-26 21:48:18
【问题描述】:

当尝试在如下每个语句中使用时,我得到一个未知的标识符错误。

dml 1.4;
param MACRO = true;
#if (MACRO){
    in each bank {
        in each register {
            param something = 1;
        }
    }
}

在编译时,此错误会出现以下消息:

/modules/test-device/test-device.dml:179:6: error: unknown identifier: 'MACRO'

尽管在同一个文件中定义了 MACRO 值。

我知道 DML 不允许每个语句中的条件,甚至还有一个特定的错误:"conditional 'in each' is not allowed [ECONDINEACH]"

但是我得到了一个不同的错误,下面的 sn-p 没有问题:

dml 1.4;
#if (dml_1_2){
    in each bank {
        in each register {
            param something = 1;
        }
    }
}

那么为什么我会收到不同的错误,有没有办法解决这个问题?

【问题讨论】:

    标签: dml-lang


    【解决方案1】:

    正如您所提到的,in each 之类的某些语句,以及typedeftemplateimport 等其他语句通常直接在#if 中是不允许的。有一个长期存在的 DML 功能请求来软化此限制;特别是,在 DML 1.2 到 DML 1.4 的迁移过程中,这是迫切需要的。通过添加允许带有禁止语句的顶级 #if 语句的 hack,只要条件仅引用一些已知常量(truefalsedml_1_2),该限制就被部分软化了。

    从技术上讲,此解决方法是通过将顶级 #if 语句视为完全独立的构造来实现的,具体取决于正文是否包含禁止语句。如果是,则在仅包含三个符号 truefalsedml_1_2 的特殊变量范围内评估条件。这解释了为什么错误消息从conditional 'in each' is not allowed 变为unknown identifier

    在您具体的#if (MACRO)示例中,我不知道表达该内容的有效方式;然而,在类似的情况下,您通常可以通过确保 in each 语句出现在 #if 语句的子对象中来解决问题;例如,如果您有:

    bank regs {
        #if (MACRO) {
            // compile error: 'in each' directly inside '#if'
            in each register {
                param something = 1;
            }
        }
    }
    

    那么您可以将其更改为:

    #if (MACRO) {
        bank regs {
            // ok: 'in each' in a subobject of the '#if'
            in each register {
                param something = 1;
            }
        }
    }
    

    另一种有时适用的方法是,MACRO 参数是否与银行骨架的代码生成器的选择有关;例如,如果您使用两个不同的框架从 IPXACT 生成银行骨架的 DML 代码,比如 X 和 Y,并且 MACRO 确定使用了这些框架中的哪一个,那么这些框架中的每一个都有可能实例化一个通用模板,比如 x_register vs y_register,在所有生成的寄存器上,或通用模板x_banky_bank在所有银行上。如果你能识别出这样的模板,那么你可以这样写:

    in each (x_register, register) {
      // applied to all registers generated by the X framework
      param something = 1;
    }
    

    或者:

    in each x_bank {
      in each register {
        param something = 1;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多