两个总是阻塞在同一个模块中。如果以下技术有误,有人会建议我另一种方法
Two always block in the same module. If the following technique is wrong someone suggest me an alternative way
我在同一模块中使用两个 always 块。它会导致可综合代码出错吗?源代码是用下面给出的 Verilog 编写的
module Mux (input wire[7:0] iterate, input wire deterministicEnable, input wire bistMode, input wire enable, input wire clk, input wire rst, output reg[127:0] valueO);
reg [9:0] seedVal[0:2];
reg[31:0] generatePattern [0:3],temp;
integer i;
always begin
@(deterministicEnable)begin
if(deterministicEnable==1)begin
temp<={22'b000000000000,seedVal[iterate]};
end
end
end
always@(posedge clk)begin
if(rst)begin
temp<=32'b11111111111111111111111111111111;
seedVal[0]<=10'b1001100101;
seedVal[1]<=10'b1111111111;
seedVal[2]<=10'b0000011111;
generatePattern[0]<=32'b00000000000000000000000000000000;
generatePattern[1]<=32'b00000000000000000000000000000000;
generatePattern[2]<=32'b00000000000000000000000000000000;
generatePattern[3]<=32'b00000000000000000000000000000000;
end
else begin
if((bistMode==1) && (enable==1))begin
for(i=0;i<4;i=i+1)begin
temp = {(temp[31] ^ temp[25] ^ temp[22] ^ temp[21] ^ temp[15] ^ temp[11] ^ temp[10] ^ temp[9] ^ temp[7] ^ temp[6] ^ temp[4] ^ temp[3] ^ temp[1] ^ temp[0]), temp[31:1]};
generatePattern[i] = temp;
end
valueO = {generatePattern[3],generatePattern[2],generatePattern[1],generatePattern[0]};
end
end
end
endmodule
不,这是不可综合的,always 块为其中分配的所有信号创建一个驱动程序,并且每个信号必须始终只有一个驱动程序(忽略此处不相关的三态的一些例外)。
always begin
@(deterministicEnable)begin
据我所知也是不可合成的。如果您想要组合(不计时),请使用 always @* begin
.
正如 David 所建议的,这是不可综合的,因为您从 2 个不同的 always 块中驱动 temp
。要使其正常工作,您需要将它们合并为一个。
第一个总是一团糟,由于灵敏度列表被截断,它在模拟中表现为一团糟。即使综合工具会对模块做一些事情,结果也不会与仿真相匹配。
第二个块可能是可综合的,但由于对相同变量混合使用 blocking/non-blocking 分配,它在硬件中的行为可能与在模拟中的行为不同。
那么,怎么办。
- 您需要从其中的 2 个中创建一个 always 块。很难看出你的意图是什么,但一般来说它可能看起来像:
always @(posedge clk) begin
if (rst) ...
else if (deterministicEnable) ...
else if if((bistMode==1) && (enable==1)) ..
end
看来temp
和generatePattern
都是内部变量,不需要重新设置。因此,将它们从 if (rst)
子句中删除。我认为您的代码中根本不需要 temp
。您可以将其完全删除。 seedVal
也没有用,所以我根本不明白为什么要初始化它们。
您使用阻塞赋值 (=) 来赋值给 temp
和 generatePattern
是正确的,因为它们是内部变量。但是 value0
不是内部的,您应该使用 nba (<=) 来分配。因此,value0
变量应该用 rst
信号初始化,但事实并非如此。
我在同一模块中使用两个 always 块。它会导致可综合代码出错吗?源代码是用下面给出的 Verilog 编写的
module Mux (input wire[7:0] iterate, input wire deterministicEnable, input wire bistMode, input wire enable, input wire clk, input wire rst, output reg[127:0] valueO);
reg [9:0] seedVal[0:2];
reg[31:0] generatePattern [0:3],temp;
integer i;
always begin
@(deterministicEnable)begin
if(deterministicEnable==1)begin
temp<={22'b000000000000,seedVal[iterate]};
end
end
end
always@(posedge clk)begin
if(rst)begin
temp<=32'b11111111111111111111111111111111;
seedVal[0]<=10'b1001100101;
seedVal[1]<=10'b1111111111;
seedVal[2]<=10'b0000011111;
generatePattern[0]<=32'b00000000000000000000000000000000;
generatePattern[1]<=32'b00000000000000000000000000000000;
generatePattern[2]<=32'b00000000000000000000000000000000;
generatePattern[3]<=32'b00000000000000000000000000000000;
end
else begin
if((bistMode==1) && (enable==1))begin
for(i=0;i<4;i=i+1)begin
temp = {(temp[31] ^ temp[25] ^ temp[22] ^ temp[21] ^ temp[15] ^ temp[11] ^ temp[10] ^ temp[9] ^ temp[7] ^ temp[6] ^ temp[4] ^ temp[3] ^ temp[1] ^ temp[0]), temp[31:1]};
generatePattern[i] = temp;
end
valueO = {generatePattern[3],generatePattern[2],generatePattern[1],generatePattern[0]};
end
end
end
endmodule
不,这是不可综合的,always 块为其中分配的所有信号创建一个驱动程序,并且每个信号必须始终只有一个驱动程序(忽略此处不相关的三态的一些例外)。
always begin
@(deterministicEnable)begin
据我所知也是不可合成的。如果您想要组合(不计时),请使用 always @* begin
.
正如 David 所建议的,这是不可综合的,因为您从 2 个不同的 always 块中驱动
temp
。要使其正常工作,您需要将它们合并为一个。第一个总是一团糟,由于灵敏度列表被截断,它在模拟中表现为一团糟。即使综合工具会对模块做一些事情,结果也不会与仿真相匹配。
第二个块可能是可综合的,但由于对相同变量混合使用 blocking/non-blocking 分配,它在硬件中的行为可能与在模拟中的行为不同。
那么,怎么办。
- 您需要从其中的 2 个中创建一个 always 块。很难看出你的意图是什么,但一般来说它可能看起来像:
always @(posedge clk) begin
if (rst) ...
else if (deterministicEnable) ...
else if if((bistMode==1) && (enable==1)) ..
end
看来
temp
和generatePattern
都是内部变量,不需要重新设置。因此,将它们从if (rst)
子句中删除。我认为您的代码中根本不需要temp
。您可以将其完全删除。seedVal
也没有用,所以我根本不明白为什么要初始化它们。您使用阻塞赋值 (=) 来赋值给
temp
和generatePattern
是正确的,因为它们是内部变量。但是value0
不是内部的,您应该使用 nba (<=) 来分配。因此,value0
变量应该用rst
信号初始化,但事实并非如此。