修复Verilog中的“多个驱动程序”错误

时间:2014-08-14 20:56:40

标签: verilog

我有一些用Verilog编写的代码,模拟效果很好,但当然合成(我期望的是什么?)却没有。我收到有关使用多个驱动程序的错误。以下是导致此错误的基本代码(不是真正的代码,因为此时约为300行):

always @(posedge reset) begin
   A <= 0;
   B <= 0;
   C <= 0;
   ...
end

always @(posedge D) begin
   case (E)
     0: do something
     1: do something else
     2: begin C <= B; A <= 1; end 
     default: ...
end

always @(posedge A) begin
   B <= 1;
   A <= 0;
end

所以这个想法是我想拥有基本上顺序的代码,但我不允许混合阻塞和非阻塞代码,所以我有非阻塞语句。 C&lt; = B需要在B <= 1之前发生,因为我希望C具有旧的B值。所以我想我基本上会以A的形式插入一个标志,以便在C获得它时对B进行更改值。

我不知道如何修复它。我也不太明白允许多个进程存在的重点(特别是因为模拟没有给出关于这个问题的警告),如果它们必须是100%不相关的。

我明白它不能保证构成D和posedge A不会同时发生,但我知道他们不会。有没有办法告诉编译器?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我明白它无法承诺构成D和posedge A意志   不是同时发生的,但我知道他们不会。

是的,但就像你说的那样,编译器并不知道,并会抱怨。您必须确保不是从多个始终块中驱动变量。

为此,请使用案例陈述。例如:

always @(posedge clk) begin // or some common condition
  case (reset)
    0:
    // do stuff, and use nested case statements
    1:
    // reset
    ...
end

如果您不知道,您希望使用case语句而不是if语句,因为编译器可以使用case语句更好地优化代码。