gpt4 book ai didi

constraints - 为什么这个约束在不同的模拟器上表现不同?

转载 作者:行者123 更新时间:2023-12-02 21:33:58 26 4
gpt4 key购买 nike

我在测试台中遇到了以下约束。它的行为似乎根据所使用的模拟器而有所不同。

constraint wr_c {
if (!one_beat) { addr[5:0] == 0, len == 15 };
}

如所写,它实际上应该做什么?

一个例子:

import uvm_pkg::*;

class pkt extends uvm_object;

rand bit one_beat;
rand int len;
rand bit [31:0] addr;

`uvm_object_utils_begin(pkt)
`uvm_field_int(one_beat, UVM_DEFAULT)
`uvm_field_int(len, UVM_DEFAULT)
`uvm_field_int(addr, UVM_DEFAULT)
`uvm_object_utils_end

constraint wr_c {
if (!one_beat) { addr[5:0] == 0, len == 15 };
}

endclass

module test;

initial begin
for (int i = 0; i < 10; i++) begin
automatic pkt p = new();
p.randomize();
p.print();
end
end

endmodule

最佳答案

不同模拟器给出不同结果的原因可能与它的构成有关 true为求解器。使用以下示例:

rand bit [1:0] example;
rand bit one_beat;
constraint example_c { if(!one_beat) example; }

在本例中example具有与 { addr[5:0] == 0, len == 15 } 相同的随机化宽度。根据模拟器的不同,上述约束可以推断 example==2'b1example!=2'b0example>2'b0 (有符号和无符号的结果不同)。如果one_beat不是一位值,同样的问题也适用于需求计数,就像 if() 一样。声明。

如果想要使用 OR 选项,则编写约束的更好方法是:

if (!one_beat) ( addr[5:0] == 0  ||  len == 15 );

if (!one_beat) { addr[5:0] == 0, len == 15 } != 0; // or '>0', '>=1', etc

有一个很好的改变,约束的创建者希望当 if(!one_beat) 时两个约束都成立。 。在这种情况下,以下是更好的约束选项:

if (!one_beat) { addr[5:0] == 0; len == 15; } // note the semicolon positions

if (!one_beat) ( addr[5:0] == 0 && len == 15 );

另请注意,对于给定的 SSCCE,one_beat成为 1'b0 的概率非常低因为求解器试图找到 one_beat 的合法条件, addrlen并行且具有同等优先级。

  • 何时 addr[5:0]==0 <b>||</b> len==15它的概率是1/(1+2**6) + 1/(1+2**32)
  • 何时 addr[5:0]==0 <b>&&</b> len==15它的概率是1/(1+2**(6+32))

如果这不是我们想要的,则添加另一个约束,例如 one_beat dist { ... };sovle one_beat before addr,len;

关于constraints - 为什么这个约束在不同的模拟器上表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com