gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:36:50 24 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/

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