如果语句中的 verilog 错误。(reg) 不是一个常量。<reg> 并发分配或输出端口连接的目标应为网络类型



我正在制作一个8位选择加法器和4位加法器。

当我试着测试这段代码时。

i got a 2 error.

第一个是"coutL不是常量">

第二个是"目标的并发分配或输出端口

连接应该是net类型。">

有人能帮我吗?

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);

在现代verilog中,独立的begin/end语句和if语句都代表一个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

相关内容

  • 没有找到相关文章

最新更新