关于在testbench中使用非阻塞赋值,我有两个问题。
always @(posedge clk)
begin
while((state==2'd3) && (x!=OUT_MAX_SIZE_32) && (count_done==4'd4))
begin
$display("a[%d] :%h, %d",l,a[l],x);
a[l] <= {b[x][31], b[x][30], b[x][29], b[x][28], b[x][27], b[x][26], b[x][25], b[x][24]};
a[l+1] <= {b[x][23], b[x][22], b[x][21], b[x][20], b[x][19], b[x][18], b[x][17], b[x][16]};
a[l+2] <= {b[x][15], b[x][14], b[x][13], b[x][12], b[x][11], b[x][10], b[x][9], b[x][8]};
a[l+3] <= {b[x][7], b[x][6], b[x][5], b[x][4], b[x][3], b[x][2], b[x][1], b[x][0]} ;
x <= x+1;
l <= l+4;
end
end 如果我使用非阻塞赋值,x和l就不会增加。但是如果我使用阻塞分配,它就会像预期的那样工作。我需要帮助来分析它。
发布于 2015-11-05 04:13:53
非阻塞分配总是可以在测试平台代码中使用。通过使用非阻塞赋值,这将成为一个无限循环。
提及SystemVerilog LRM 1800-2012年第10.4.2节,
非阻塞过程分配允许在不阻塞过程流的情况下进行分配调度。
提及第4.9.4节,
非阻塞分配语句(见10.4.2)总是计算更新后的值,并将更新调度为NBA更新事件,如果延迟为零,则在当前时间步骤中将更新安排为更新事件,如果延迟为非零,则将其调度为未来事件。
在这里,在时钟的前缘,让我们说是x=0,所以它假设while循环被执行。非阻塞分配的RHS在活动区域进行评估,而实际任务则在NBA区域进行。
因此,在NBA地区的相同的时间戳中,x到1的增量是计划的.另外,由于它是一个非阻塞语句,所以会在活动区域再次检查while循环的条件,而不阻塞任何东西(再次获得x=0 )。同样,x被安排在NBA区域增加,这个循环将在永久上进行。因此,您无法增加x。类似的评论也适用于l。
而使用阻塞赋值时,值是立即将分配给表达式的LHS,因此x/l增加。
另外,$display是在Active idea 中执行的,因此您将无法获得x作为1的值。下面的图像将给您一个清晰的概念。

有关事件区域的详细信息,请参阅事件论文。
发布于 2015-11-05 04:05:32
您可以而且应该在您的测试平台中使用非阻塞分配。模拟器不知道您设计的是什么和您的测试平台之间的区别。您需要以一种防止竞争条件的方式对这两种情况进行编码。
从您显示的代码中,我看不出为什么会有任何不同,除非在其他地方有其他分配给x和l,而您没有显示。
https://stackoverflow.com/questions/33536177
复制相似问题