首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Testbench中使用非阻塞分配: Verilog

在Testbench中使用非阻塞分配: Verilog
EN

Stack Overflow用户
提问于 2015-11-05 03:30:10
回答 2查看 2.6K关注 0票数 1

关于在testbench中使用非阻塞赋值,我有两个问题。

  1. 我们是否可以在“总是@(高级clk) w.r.ttestbench”中使用阻塞赋值?我认为我们可以使用,因为我们不必担心硬件。但我需要确认。
  2. 我在我的测试平台中使用了下面的代码,但是它并不像预期的那样工作。

代码语言:javascript
复制
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 

如果我使用非阻塞赋值,xl就不会增加。但是如果我使用阻塞分配,它就会像预期的那样工作。我需要帮助来分析它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的值。下面的图像将给您一个清晰的概念。

有关事件区域的详细信息,请参阅事件论文。

票数 1
EN

Stack Overflow用户

发布于 2015-11-05 04:05:32

您可以而且应该在您的测试平台中使用非阻塞分配。模拟器不知道您设计的是什么和您的测试平台之间的区别。您需要以一种防止竞争条件的方式对这两种情况进行编码。

从您显示的代码中,我看不出为什么会有任何不同,除非在其他地方有其他分配给xl,而您没有显示。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33536177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档