1. BMC PSL中的do...until循环解析
在BMC PSL(Property Specification Language)中,do...until是一种后测试循环结构,它确保循环体至少执行一次,这与常见的while或for循环有着本质区别。作为一名在验证领域工作多年的工程师,我发现这种结构在硬件描述和形式验证中有着独特的应用价值。
do...until的基本语法结构如下:
psl复制do {
{BLOCK}
} until (expression);
它的执行流程可以这样理解:先无条件执行一次循环体内的代码块(BLOCK),然后评估until后面的表达式(expression)。如果表达式结果为假(false),则继续执行循环体;如果为真(true),则退出循环。这种"先执行后判断"的特性,使得它在某些场景下比传统循环更加适用。
注意:在PSL中,until后的表达式必须用括号包裹,这与某些编程语言中的可选括号不同,是严格的语法要求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. do...until与while循环的关键区别
2.1 执行顺序的差异
while循环是先判断条件再决定是否执行循环体,这意味着如果初始条件就不满足,循环体可能一次都不执行。而do...until则是先执行循环体再判断条件,确保至少执行一次。
考虑以下两个等价的例子:
psl复制// while实现
counter = 0;
while (counter < 1) {
// 循环体
counter = counter + 1;
}
// do...until实现
counter = 0;
do {
// 循环体
counter = counter + 1;
} until (counter >= 1);
虽然两者都能实现相同功能,但语义上有明显区别。在验证场景中,这种区别可能导致不同的覆盖率结果。
2.2 条件表达式的逻辑反转
另一个容易被忽视的细节是:until的条件与while条件是逻辑相反的。while在条件为真时继续循环,而do...until是在条件为真时退出循环。这在实际编码中容易导致错误,需要特别注意。
