我是第一次接触verilog,并对以下代码中的竞态条件有疑问,这些代码取自Pong P. Chu的Veriloog Examples的FPGA原型。代码是:
always @(posedge clk)
a = b;
always @(posedge clk)
b = a;这将根据哪个always块最先执行来推断竞争。但是块总是应该并行执行的。如果我错了,请纠正我。我知道有阻塞赋值,但它如何影响块的第一个语句,即always语句?使用非阻塞赋值的第二个代码是:
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块并行执行?
发布于 2015-09-03 15:22:30
由于Verilog“分层事件队列”具有不同的区域,因此所使用的赋值操作符的类型会影响代码的执行方式。详细信息可以在IEEE Verilog标准的第5节中找到,但就您的问题而言,它大致可以归结为:
always块被激活时。由于这两个块是并行的,因此它们的激活顺序未定义。因此,当遇到clk上升沿时,在第一个示例中,模拟器将
always块中的一个,always块,并执行相同的操作,此时第一个变量的值已经更改。在您的第二个示例中,模拟器将
always块=符号的右侧,并将在那里找到的值作为非阻塞赋值更新事件分配给=.always块,并执行相同的操作。请注意,这两个变量仍具有上升clk沿之前的值。https://stackoverflow.com/questions/32368879
复制相似问题