我有一些用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不会同时发生,但我知道他们不会。有没有办法告诉编译器?
谢谢!
答案 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语句更好地优化代码。