If 语句中的 verilog 错误。 (reg) 不是常数。并发分配或输出端口连接的目标 <reg> 应该是网络类型
verilog Error in If statement. (reg) is not a constant. Target <reg> of concurrent assignment or output port connection should be a net type
我正在用 4 位加法器制作一个 8 位 select 加法器。
当我尝试测试这段代码时。
我遇到了 2 个错误。
第一个是“coutL 不是常数”
第二个是“并发赋值的目标或输出端口
连接应为网络类型。"
谁能帮帮我?
module selectAdd8(
input [7:0] a,
input [7:0] b,
input cin,
output reg [7:0] sum,
output reg cout
);
reg coutL, sumL, sum0, sum1, cout0, cout1;
always @ (*);
begin
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
if (coutL==1) begin
assign sum = {sum1, sumL};
assign cout = cout1;
end else begin
assign sum = {sum0, sumL};
assign cout = cout0;
end
end
endmodule
下面的语句后面有分号是没有意义的:
always @ (*);
我猜下面的 begin
.. end
是为了与前面的 always 块一起使用。他们没有因为分号。在任何情况下,在这样的块内实例化模块在 verilog 中都是非法的,它应该在块外和 begin/end:
之外完成
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
独立的 begin/end 和 if
语句都代表现代 verilog 中的 generate
块。因此,以下是生成块的一部分:
if (coutL==1) begin
assign sum = {sum1, sumL};
assign cout = cout1;
end else begin
assign sum = {sum0, sumL};
assign cout = cout0;
end
但是这样的块只能用常量操作。所以countL
一定是一个常量,即parameter
。这是一个reg,因此,有一个错误。
同样,您似乎打算将此作为 always 块的一部分。 assign
此类块中的语句是一种非常特殊的 verilog 结构,如果没有很好地理解它们的作用,则不应使用。
我的 猜测 是您打算如下所示:
module selectAdd8(
input [7:0] a,
input [7:0] b,
input cin,
output reg [7:0] sum,
output reg cout
);
reg coutL, sumL, sum0, sum1, cout0, cout1;
always @ (*)
begin
if (coutL==1) begin
sum = {sum1, sumL};
cout = cout1;
end else begin
sum = {sum0, sumL};
cout = cout0;
end
end
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
endmodule
我正在用 4 位加法器制作一个 8 位 select 加法器。
当我尝试测试这段代码时。
我遇到了 2 个错误。
第一个是“coutL 不是常数”
第二个是“并发赋值的目标或输出端口
连接应为网络类型。"
谁能帮帮我?
module selectAdd8(
input [7:0] a,
input [7:0] b,
input cin,
output reg [7:0] sum,
output reg cout
);
reg coutL, sumL, sum0, sum1, cout0, cout1;
always @ (*);
begin
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
if (coutL==1) begin
assign sum = {sum1, sumL};
assign cout = cout1;
end else begin
assign sum = {sum0, sumL};
assign cout = cout0;
end
end
endmodule
下面的语句后面有分号是没有意义的:
always @ (*);
我猜下面的 begin
.. end
是为了与前面的 always 块一起使用。他们没有因为分号。在任何情况下,在这样的块内实例化模块在 verilog 中都是非法的,它应该在块外和 begin/end:
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
独立的 begin/end 和 if
语句都代表现代 verilog 中的 generate
块。因此,以下是生成块的一部分:
if (coutL==1) begin
assign sum = {sum1, sumL};
assign cout = cout1;
end else begin
assign sum = {sum0, sumL};
assign cout = cout0;
end
但是这样的块只能用常量操作。所以countL
一定是一个常量,即parameter
。这是一个reg,因此,有一个错误。
同样,您似乎打算将此作为 always 块的一部分。 assign
此类块中的语句是一种非常特殊的 verilog 结构,如果没有很好地理解它们的作用,则不应使用。
我的 猜测 是您打算如下所示:
module selectAdd8(
input [7:0] a,
input [7:0] b,
input cin,
output reg [7:0] sum,
output reg cout
);
reg coutL, sumL, sum0, sum1, cout0, cout1;
always @ (*)
begin
if (coutL==1) begin
sum = {sum1, sumL};
cout = cout1;
end else begin
sum = {sum0, sumL};
cout = cout0;
end
end
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
endmodule