2016-09-25 105 views
1

我正在尝试使用Verilog HDL制作流水线处理器。我意识到在我的代码中可能存在某些竞争条件。所以我打算写一须藤代码,想请教各位,如果有内的竞争条件,以及如何避免它:Verilog:以下代码是否会造成竞争状况?

module A(input wire reset, input wire clock, output reg a_reg_o); 
    always @(posedge clock) 
    begin 
     if(reset == 1'h1) 
     begin 
     a_reg_o = 1'h0; 
     end 
     else 
     begin 
     a_reg_o = 1'h1; 
     end 
    end 
endmodule 

module B(input wire reset, input wire clock, input a_i); 
    reg b; 

    always @(posedge clock) 
    begin 
     if(reset == 1'h1) 
     begin 
     b = 1'h0; 
     end 
     else 
     begin 
     if(a_i == 1'h1) 
     begin 
      b = 1'h1; 
     end 
     else 
     begin 
      b = 1'h0; 
     end 
     end 
    end 
endmodule 

module Main(input wire reset, input wire clock); 
    wire a_o; 
    A a(reset, clock, a_o); 
    B b(reset, clock, a_o) 
endmodule 

所以,想象一下我触发复位信号。在时钟的第一个上升沿之后,寄存器a_reg_o将变为0,模块B的寄存器b也将变为0(没有竞争条件)。现在我释放重置按钮,并将其设置为负值。在时钟的下一个上升沿,寄存器a_reg_o将为1,但是从模块B寄存器b怎么样?它会是: 1.零,因为它没有看到a_i的变化呢。 2.它取决于模块(A和B)的总延迟(即竞态条件)。

谢谢。

回答

1

这就是为什么Verilog中有非阻塞(NBA)任务的原因。编码规则是每当有多个进程(在这种情况下,多个always块)访问与同一事件(@posdege clock)同步的同一信号(a_o),其中一个进程写入并且另一个进程读取时,您需要使用和NBA <=分配写信号。

+0

非常感谢您的回复。还有两个问题:1.我应该只用NBA写作块? 2.竞赛状态只是一个模拟问题,还是一个物理实现(综合后)问题?我的意思是说,在综合之后,由于不同路径的延迟可能会有不同的行为? –

+0

根据我刚才给出的规则,你应该使用NBA的,否则使用正常的任务。在RTL中,转换为使用NBAs来输出时序逻辑。不幸的是,你可以在你的RTL中进行竞争,这在物理实现中不存在,并且在RTL中不存在物理实现中的竞争。 –

1

是的,可能会出现竞态条件,因为您不知道网络a_o是先由模块A驱动然后由模块B捕获,反之亦然。

因此,您应该使用Non Blocking Assignment,因为这样可以确保无论哪个模块被执行,模块B将始终具有以前的网络值a_o

您可以通过以下链接找到更多关于此非阻塞作业的信息。 http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf