首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过阻塞赋值和竞争推断的寄存器

通过阻塞赋值和竞争推断的寄存器
EN

Stack Overflow用户
提问于 2015-09-03 14:56:25
回答 1查看 182关注 0票数 0

我是第一次接触verilog,并对以下代码中的竞态条件有疑问,这些代码取自Pong P. Chu的Veriloog Examples的FPGA原型。代码是:

代码语言:javascript
复制
always @(posedge clk)
a = b;
always @(posedge clk)
b = a;

这将根据哪个always块最先执行来推断竞争。但是块总是应该并行执行的。如果我错了,请纠正我。我知道有阻塞赋值,但它如何影响块的第一个语句,即always语句?使用非阻塞赋值的第二个代码是:

代码语言:javascript
复制
always @(posedge clk)
begin //b(entry) = b
a <= b; //a(exit) = b(entry)
end //a = a(exit)

always @(posedge clk)
begin //a(entry) = a
b <= a; //b(exit) = a(entry)
end //b = b(exit)

根据书上的说法,这将会工作得很好,但我不明白为什么?在这种情况下,是否是因为非阻塞赋值而使always块并行执行?

EN

回答 1

Stack Overflow用户

发布于 2015-09-03 15:22:30

由于Verilog“分层事件队列”具有不同的区域,因此所使用的赋值操作符的类型会影响代码的执行方式。详细信息可以在IEEE Verilog标准的第5节中找到,但就您的问题而言,它大致可以归结为:

  • 阻塞赋值(在你的第一个例子中)被立即计算,即当它们所在的always块被激活时。由于这两个块是并行的,因此它们的激活顺序未定义。
  • 非阻塞分配不会立即执行,而是计划在同一时间步长的所有块完成执行后执行。

因此,当遇到clk上升沿时,在第一个示例中,模拟器将

  1. 随机挑选always块中的一个,
  2. 发现赋值是阻塞的,并立即执行它,因此更改了该assignment.
  3. Pick中的左侧变量
  4. always块,并执行相同的操作,此时第一个变量的值已经更改。

在您的第二个示例中,模拟器将

  1. 随机挑选一个always
  2. 发现赋值是非阻塞的,因此
  3. 评估=符号的右侧,并将在那里找到的值作为非阻塞赋值更新事件分配给=.
  4. Pick的左侧变量另一个always块,并执行相同的操作。请注意,这两个变量仍具有上升clk沿之前的值。
  5. 由于所有块都已完成执行,请更新为非阻塞分配更新事件计划的所有变量,从而有效地交换它们的值。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32368879

复制
相关文章

相似问题

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