Specman E用参数表示零位数量:定义CUSTOM_BITS'd0编译报错求解决
解决Specman E中参数化零值的约束编译错误
错误原因
你遇到的GEN_NO_GENERATABLE_NOTIF错误,本质是Specman的约束求解器检测到当前约束块中没有需要随机生成的元素——比如你用keep把变量直接固定为CUSTOM_BITS'd0这种常量,没有给求解器提供任何可生成的取值空间。
解决方法
根据你的需求,分两种场景处理:
场景1:变量无需随机,固定为参数化零值
直接放弃keep约束,改用初始化或赋值的方式:
extend sys { CUSTOM_BITS: uint = 8; // 方式1:声明时直接初始化 some_var: uint(CUSTOM_BITS) = CUSTOM_BITS'd0; // 方式2:在方法中赋值 run() is also { another_var.set(CUSTOM_BITS'd0); }; };
场景2:变量需要随机,但零是可选值之一
确保约束中包含可生成的取值范围,比如:
extend sys { CUSTOM_BITS: uint = 8; some_var: uint(CUSTOM_BITS); // 允许变量取0到该位数最大值之间的任意值 keep some_var in [CUSTOM_BITS'd0 .. (2**CUSTOM_BITS - 1)]; // 或者指定零为其中一个可选值(搭配其他选项) // keep some_var == CUSTOM_BITS'd0 or some_var == CUSTOM_BITS'd10; };
参数化零值的替代写法
Specman E中也支持0[CUSTOM_BITS]的写法,和CUSTOM_BITS'd0等价,你可以根据习惯选择:
keep some_var == 0[CUSTOM_BITS];
内容的提问来源于stack exchange,提问作者Saikat Chatterjee
相关产品推荐
相关产品推荐

