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