我正在尝试编写一个简单,足够精确的过滤器,用于验证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时没有足够的悲观。
答案 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 + ...
这里有一些数学的链接:
答案 2 :(得分:2)
如果你想根据1的最长条纹进行快速测试以查看比特序列是否是随机的,你可以使用N比特中预期的最长条纹1是Θ(log(N))的事实。
此外,最长条纹超过r * log 2(N)位的概率最多为1 / N ^(r-1),类似地,最长条纹的概率小于log 2(N)/ r位最多为1 / N ^(r-1)。
中“计数和概率”一章中的“条纹”一节答案 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],