N位数组中X *连续*位设置为1的概率是多少?

时间:2009-02-09 22:30:03

标签: statistics hardware verification

我正在尝试编写一个简单,足够精确的过滤器,用于验证RTL仿真中的硬件。我们通过将设计中的所有触发器随机初始化为0或1来模拟芯片触发器中固有的随机性。这相当于芯片的触发器在上电期间获得一些随机值。我们还将重置树中的触发器随机化(其中重置树没有反馈循环),这意味着您可以在重置行上出现错误的故障。

e.g。

                              |||
                              VVV                          Nth reset-tree flop
          +----+       +----+       +----+        /     /    +----+ 
reset_in  |    |  0    |    |  1    |    | 0     /     /     |    | reset_out
 -------->D    Q>----->D    Q>----->D    Q>---- / ... /   -->D    Q>----
          |    |       |    |       |    |      \     \      |    |
          |    |       |    |       |    |       \     \     |    |
          +^---+       +^---+       +^---+       /     /     +^---+
           |            |            |          /     /       |
clk  ------+------------+------------+---------/     /     ---+

你会看到一个0-> 1-> 0看起来像一个重置,但实际上是一个小故障。

我想构建一个过滤器,查找一定数量的连续 1值,以确定我刚刚看到的复位是来自复位控制器的复位还是虚假复位。

我知道这是统计数据,可能与泊松分布有关,但我如何确定一组N位中任何X个连续位为1的概率?

P.S。是。我知道4-val RTL仿真。我们也在这样做,但是一些Verilog构造在传播X和Z时没有足够的悲观。

5 个答案:

答案 0 :(得分:3)

编辑:下面没有回答这个问题,对不起......评论澄清说真正的问题是 x 连续1的概率 n 位,而不仅仅是我假设的简单事情。 快速浏览一下这个:http://www.mathhelpforum.com/math-help/probability-statistics/64519-probability-consecutive-wins.html这可能是你正在寻找的东西 - 它似乎是要解决一大堆成像的概率,因此听起来很相似。但它已经很晚了,我很累,所以我没有解码数学:)

已过时: 听起来你基本上处理的是二项式概率 - 见http://en.wikipedia.org/wiki/Binomial_probability

我不得不承认我大约20年没有做过计算,所以有点生锈......

基本上,二项式允许您将事件多次出现的概率“加在一起”,每次只有两种可能的结果。 在你的情况下,命令很重要,所以它应该像乘以概率一样简单;
对于1位,它是50%
对于2位,它是50%^ 2 = 25%
对于3位,它是50%^ 3 = 12.5%

以另一种方式看待它;
1位只有2种可能的组合,其中一种是1s = 50%
2位有4种可能的组合(10,01,11,00),其中只有一种是全1 - 所以25%
3位有2 ^ 3 = 8种可能的组合,其中只有一种是全1,所以1/8 = 12.5%

所以...... n位的概率都是1 = 1 /(2 ^ n)。

答案 1 :(得分:2)

好的,这是我发现的:

P = 1 - Q(X)

,其中

Q(X)= [1 - 1/2(Z)] / [(X + 1 - XZ)x 1/2 x Z ^(X + 1)]

,其中

Z = 1 +(1/2)(1/2)^ X +(X + 1)[(1/2)(1/2)^ X] ^ 2 + ...

这里有一些数学的链接:

Math Forum

答案 2 :(得分:2)

如果你想根据1的最长条纹进行快速测试以查看比特序列是否是随机的,你可以使用N比特中预期的最长条纹1是Θ(log(N))的事实。

此外,最长条纹超过r * log 2(N)位的概率最多为1 / N ^(r-1),类似地,最长条纹的概率小于log 2(N)/ r位最多为1 / N ^(r-1)。

这些结果来自Introduction to Algorithms

中“计数和概率”一章中的“条纹”一节

答案 3 :(得分:0)

你可以做一个递归程序(python):

prob(x,n)给出了您想要的结果


import math

def prob(x,n,i=0):
    if i == x: return 1
    if (x+i) > n: return 0
    t = .5 * prob(x,n-1,i+1) + .5 * prob(x,n-1,i)
    return t

答案 4 :(得分:0)

我的方法是定义接受正确类型的位模式的FSA,然后模拟每个位数的模式。即。

State state_map[] = {
    0 => { 0 -> 0; 1 -> 1; accepts = false },
    1 => { 0 -> 0; 1 -> 2; accepts = false },
    2 => { 0 -> 0; 1 -> 3; accepts = false },
    3 => { 0 -> 3; 1 -> 3; accepts = true }
};

state[t: 0, s: 0] = 1.0;
state[t: 0, s: 1] = 0.0;
state[t: 0, s: 2] = 0.0;
state[t: 0, s: 3] = 0.0;

for (t = 0; t < N; t++)
    for (s = 0; s<NUM_STATES; s++)
        state[t: t+1, s: state_map[s].0] += state[t, s] * .5
        state[t: t+1, s: state_map[s].1] += state[t, s] * .5

print "Probability: {0}", state[t: N, s: 3],