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

查看:18
本文介绍了IF语句中出现Verilog错误。(REG)不是常量。并发分配或输出端口连接的目标<reg>应为网络类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用4位加法器制作8位选择加法器。

当我尝试测试此代码时。

我收到%2错误。

第一个是";coutL不是常量

第二个是并发分配或输出端口的目标(&Q;)

连接应为网络类型。&Quot;

有人能帮我吗?

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计划与以前的始终挡路一起使用。因为分号的缘故,他们没有这样做。在任何情况下,在这样的挡路内实例化模块在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必须是常量,即aparameter。这是注册表,因此存在错误。

再次声明,您似乎打算将其作为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

这篇关于IF语句中出现Verilog错误。(REG)不是常量。并发分配或输出端口连接的目标<reg>应为网络类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆