我有一些用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 <= B必须在B <= 1之前发生,因为我希望C具有B的旧值。因此,我认为我将实质上以A的形式插入一个标志,以在C获得其值后对B进行更改。
我不知道该如何解决。如果它们必须100%不相关,那么我也根本不理解允许根本存在多个进程的意义(特别是因为仿真没有警告这是一个问题)。
我知道不能保证姿势D和姿势A不会同时发生,但我知道它们不会同时发生。有没有办法告诉编译器呢?
谢谢!
我知道不能保证姿势D和姿势A不会同时发生,但我知道它们不会同时发生。
是的,但是就像您说的那样,编译器不知道这一点,并且会抱怨。您必须确保您没有从多个Always块中驱动变量。
为此,请使用用例语句。例如:
always @(posedge clk) begin // or some common condition
case (reset)
0:
// do stuff, and use nested case statements
1:
// reset
...
end
而且,以防万一,您想使用case语句而不是if语句,因为编译器可以使用case语句更好地优化代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句