阻塞和非阻塞分配错误的混合
Mix of blocking and non-blocking assignments error
我在有关阻塞和非阻塞分配的代码中遇到此错误。我最初在初始化时完成了一些阻塞分配,但将它们移到了 initial
部分。我仍然遇到这个问题,不知道还有什么要改变的。任何解决它的帮助将不胜感激。
这是我第一次在个人项目中使用 Verilog,所以如果您看到任何初学者错误,我很乐意学习。
错误:
第 89 行:混合对变量的阻塞和非阻塞赋值不是推荐的编码做法。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 13:21:27 09/10/2021
// Design Name:
// Module Name: avg_small
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mux8(
data0,
data1,
data2,
data3,
data4,
data5,
data6,
data7,
select,
data_output
);
parameter WIDTH = 8;
input [WIDTH-1:0] data0;
input [WIDTH-1:0] data1;
input [WIDTH-1:0] data2;
input [WIDTH-1:0] data3;
input [WIDTH-1:0] data4;
input [WIDTH-1:0] data5;
input [WIDTH-1:0] data6;
input [WIDTH-1:0] data7;
input [2:0] select;
output [WIDTH-1:0] data_output;
reg [WIDTH-1:0] data_bus ;
always @ (*) begin
case (select)
0: data_bus <= data0 ;
1: data_bus <= data1 ;
2: data_bus <= data2 ;
3: data_bus <= data3 ;
4: data_bus <= data4 ;
5: data_bus <= data5 ;
6: data_bus <= data6 ;
7: data_bus <= data7 ;
endcase
end
assign data_output = data_bus ;
endmodule
module add_8_10_10(ctrl,a,b,out);
input [2:0] ctrl;
input [7:0] a;
input [10:0] b;
output [10:0] out;
reg [10:0] out_hold; // can this just be out as a reg/ can out be a reg?
always @(ctrl) begin
out_hold <= a+b;
end
assign out = out_hold;
endmodule
module avg_small(
input clk,
input rs,
output [7:0] ave8,
input [7:0] num_in
);
reg [7:0] registers [7:0] ;
reg [2:0] state;
reg [2:0] next_state;
reg [10:0] temp_sum;
reg [7:0] output_register;
wire [7:0] a;
wire [10:0] b;
wire [10:0] c;
wire [10:0] add_wire;
mux8 muxy(
.data0(registers[0]),
.data1(registers[1]),
.data2(registers[2]),
.data3(registers[3]),
.data4(registers[4]),
.data5(registers[5]),
.data6(registers[6]),
.data7(num_in),
.select(state),
.data_output(a)
);
add_8_10_10 add(
.ctrl(state),
.a(a),
.b(temp_sum),
.out(add_wire)
);
initial begin
next_state <= 3'd0;
temp_sum <= 11'd0;
output_register <= 7'd0;
registers[0] <= 0;
registers[1] <= 0;
registers[2] <= 0;
registers[3] <= 0;
registers[4] <= 0;
registers[5] <= 0;
registers[6] <= 0;
registers[7] <= 0;
state=0;
end
always@(posedge clk) begin
if(rs) begin
state <= 0;
//TODO -- clear registers
end else begin
case(state)
0:begin
registers[0] <= registers[1];
state = #50 1;
end
1:begin
registers[1] <= registers[2];
#50;
state <= 2;
end
2:begin
registers[2] <= registers[3];
#50;
state = 3;
end
3:begin
registers[3] <= registers[4];
#50;
state = 4;
end
4:begin
registers[4] <= registers[5];
#50;
state = 5;
end
5:begin
registers[5] <= registers[6];
#50;
state = 6;
end
6:begin
registers[6] <= registers[7];
#50;
state = 7;
end
7:begin
registers[7] <= num_in;
output_register <= add_wire;
#50;
state = 0;
end
endcase
end
end
assign ave8 = output_register;
endmodule
这是第 89 行:
reg [2:0] state;
该消息告诉您您正在对 state
信号进行两种类型的分配。
第 140 行是 非阻塞 赋值,因为它使用 <=
:
state <= 0;
第 147 行是一个 阻塞 赋值,因为它使用 =
:
state = #50 1;
推荐的编码做法是二选一。在这种情况下,由于 state
是在顺序逻辑 always
块内分配的,因此您应该对 all 分配使用非阻塞 state
。它是顺序的,因为它对时钟信号的边沿敏感:
always@(posedge clk) begin
您也应避免向 state
添加延迟。所以,这一行应该从:
state = #50 1;
至:
state <= 1;
您应该从 initial
块中删除对 state
的分配。推荐的编码做法是在单个块内对信号进行所有分配。
所有这些建议也适用于您的其他 reg
信号,例如 registers
。最好将它们保留在 always
块中,这听起来就像您最初所做的那样。
对于其余代码,您应该使用分块赋值,因为您没有其他顺序 always
块。
为了将来对您的代码进行严格审查,您可以 post 在 Code Review。但是,您的代码必须是有效且没有错误消息的代码。
我在有关阻塞和非阻塞分配的代码中遇到此错误。我最初在初始化时完成了一些阻塞分配,但将它们移到了 initial
部分。我仍然遇到这个问题,不知道还有什么要改变的。任何解决它的帮助将不胜感激。
这是我第一次在个人项目中使用 Verilog,所以如果您看到任何初学者错误,我很乐意学习。
错误:
第 89 行:混合对变量的阻塞和非阻塞赋值不是推荐的编码做法。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 13:21:27 09/10/2021
// Design Name:
// Module Name: avg_small
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mux8(
data0,
data1,
data2,
data3,
data4,
data5,
data6,
data7,
select,
data_output
);
parameter WIDTH = 8;
input [WIDTH-1:0] data0;
input [WIDTH-1:0] data1;
input [WIDTH-1:0] data2;
input [WIDTH-1:0] data3;
input [WIDTH-1:0] data4;
input [WIDTH-1:0] data5;
input [WIDTH-1:0] data6;
input [WIDTH-1:0] data7;
input [2:0] select;
output [WIDTH-1:0] data_output;
reg [WIDTH-1:0] data_bus ;
always @ (*) begin
case (select)
0: data_bus <= data0 ;
1: data_bus <= data1 ;
2: data_bus <= data2 ;
3: data_bus <= data3 ;
4: data_bus <= data4 ;
5: data_bus <= data5 ;
6: data_bus <= data6 ;
7: data_bus <= data7 ;
endcase
end
assign data_output = data_bus ;
endmodule
module add_8_10_10(ctrl,a,b,out);
input [2:0] ctrl;
input [7:0] a;
input [10:0] b;
output [10:0] out;
reg [10:0] out_hold; // can this just be out as a reg/ can out be a reg?
always @(ctrl) begin
out_hold <= a+b;
end
assign out = out_hold;
endmodule
module avg_small(
input clk,
input rs,
output [7:0] ave8,
input [7:0] num_in
);
reg [7:0] registers [7:0] ;
reg [2:0] state;
reg [2:0] next_state;
reg [10:0] temp_sum;
reg [7:0] output_register;
wire [7:0] a;
wire [10:0] b;
wire [10:0] c;
wire [10:0] add_wire;
mux8 muxy(
.data0(registers[0]),
.data1(registers[1]),
.data2(registers[2]),
.data3(registers[3]),
.data4(registers[4]),
.data5(registers[5]),
.data6(registers[6]),
.data7(num_in),
.select(state),
.data_output(a)
);
add_8_10_10 add(
.ctrl(state),
.a(a),
.b(temp_sum),
.out(add_wire)
);
initial begin
next_state <= 3'd0;
temp_sum <= 11'd0;
output_register <= 7'd0;
registers[0] <= 0;
registers[1] <= 0;
registers[2] <= 0;
registers[3] <= 0;
registers[4] <= 0;
registers[5] <= 0;
registers[6] <= 0;
registers[7] <= 0;
state=0;
end
always@(posedge clk) begin
if(rs) begin
state <= 0;
//TODO -- clear registers
end else begin
case(state)
0:begin
registers[0] <= registers[1];
state = #50 1;
end
1:begin
registers[1] <= registers[2];
#50;
state <= 2;
end
2:begin
registers[2] <= registers[3];
#50;
state = 3;
end
3:begin
registers[3] <= registers[4];
#50;
state = 4;
end
4:begin
registers[4] <= registers[5];
#50;
state = 5;
end
5:begin
registers[5] <= registers[6];
#50;
state = 6;
end
6:begin
registers[6] <= registers[7];
#50;
state = 7;
end
7:begin
registers[7] <= num_in;
output_register <= add_wire;
#50;
state = 0;
end
endcase
end
end
assign ave8 = output_register;
endmodule
这是第 89 行:
reg [2:0] state;
该消息告诉您您正在对 state
信号进行两种类型的分配。
第 140 行是 非阻塞 赋值,因为它使用 <=
:
state <= 0;
第 147 行是一个 阻塞 赋值,因为它使用 =
:
state = #50 1;
推荐的编码做法是二选一。在这种情况下,由于 state
是在顺序逻辑 always
块内分配的,因此您应该对 all 分配使用非阻塞 state
。它是顺序的,因为它对时钟信号的边沿敏感:
always@(posedge clk) begin
您也应避免向 state
添加延迟。所以,这一行应该从:
state = #50 1;
至:
state <= 1;
您应该从 initial
块中删除对 state
的分配。推荐的编码做法是在单个块内对信号进行所有分配。
所有这些建议也适用于您的其他 reg
信号,例如 registers
。最好将它们保留在 always
块中,这听起来就像您最初所做的那样。
对于其余代码,您应该使用分块赋值,因为您没有其他顺序 always
块。
为了将来对您的代码进行严格审查,您可以 post 在 Code Review。但是,您的代码必须是有效且没有错误消息的代码。