今天有位同事遇到了一个关于软硬约束的问题,具体如下:
例1:
结果:val被约束到为【2..3】
例2:
结果:val被约束为【12..14】
在e语言当中,硬约束可以覆盖软约束,硬约束执行的时候按代码顺序从上到下执行,而软约束是从下住上执行的。
所以 例1是可以解释的,先硬约束为【2..14】,然后软约束从下住上,约束为【2..3】,再遇到 >11的软约束,因为冲突,忽略掉了。
而例2百思不得其解。
后来把post_generate()当中的大于号改成了小于号,结果变成了【2..3】,更加百思不得其解了。因为post_generate()永远是在最后面执行的呀。
后来觉得问题是出在了post_generate()当中的gen上。就是说,在post_generate()之前,已经生成了一个值,但是又遇到了一个gen, 所以就需要考虑所以的约束条件。这样解释就非常的通了。 先硬约束到【2..14】,然后根据post_generate()当中的条件,约束到【10..14】,遇到 <4 的软约束,冲突忽略,遇到 > 11的约束,进一步得到【12..14】.
同样解释post_generate()改成<9也是可行的。
PS:做为一名IC验证工程师,在此地感觉有点孤独。代码连e语言和sv 都不支持。