verilog实例化和连接

verilog实例化和连接,verilog,Verilog,v 53,55,57上的错误报告 它说模块实例化应该有一个实例名 我怎样才能解决这个问题 我的加法器是32位加法器,它的溢出是1位。 但是加法器数组中的溢出是4位的。我怎样才能解决这个问题 module adder_array( cmd, ain0, ain1, ain2, ain3, bin0, bin1, bin2, bin3, dout0, dout1, dout2, dout3, overflow); input [2:0] c

v 53,55,57上的错误报告 它说模块实例化应该有一个实例名 我怎样才能解决这个问题

我的加法器是32位加法器,它的溢出是1位。 但是加法器数组中的溢出是4位的。我怎样才能解决这个问题

module adder_array(
     cmd,
     ain0, ain1, ain2, ain3,
     bin0, bin1, bin2, bin3,
     dout0, dout1, dout2, dout3,
     overflow);

    input [2:0] cmd;
    input [31:0] ain0, ain1, ain2, ain3;
    input [31:0] bin0, bin1, bin2, bin3;
    output reg [31:0] dout0, dout1, dout2, dout3;
    output [3:0] overflow;

    wire [31:0] a[3:0];
    wire [31:0] b[3:0];
    wire [31:0] d[3:0];
    wire ovf[3:0];

    assign {a[0],a[1],a[2],a[3]} = {ain0,ain1,ain2,ain3};
    assign {b[0],b[1],b[2],b[3]} = {bin0,bin1,bin2,bin3};
    assign {d[0],d[1],d[2],d[3]} = {dout0, dout1, dout2, dout3};


    parameter size = 4;

    genvar i;

    generate for(i = 0 ; i < size - 1 ; i = i + 1)
    begin: adder
        if (i == 0) begin
          my_add(.ain(a[0]), .bin(b[0]), .dout(d[0]), .overflow(ovf[0]));
          end
        else if (i == size - 1 ) begin
          my_add(.ain(a[i]), .bin(b[i]), .dout(d[i]), .overflow(ovf[i]));
          end
        else begin
          my_add(.ain(a[i]), .bin(b[i]), .dout(d[i]), .overflow(ovf[i]));
          end
    end
    endgenerate
    assign overflow = {ovf[3], ovf[2], ovf[1], ovf[0]};


    always @(cmd) begin
        case(cmd)
            3'b000 : begin dout0 = d[0]; dout1 = 0; dout2 = 0; dout3 = 0; end
            3'b001 : begin dout0 = 0; dout1 = d[1]; dout2 = 0; dout3 = 0; end
            3'b010 : begin dout0 = 0; dout1 = 0; dout2 = d[2]; dout3 = 0; end
            3'b011 : begin dout0 = 0; dout1 = 0; dout2 = 0; dout3 = d[3]; end
            3'b100 : begin dout0 = d[0]; dout1 = d[1]; dout2 = d[2]; dout3 = d[3]; end               
        endcase
    end

endmodule
模块加法器阵列(
cmd,
ain0,ain1,ain2,ain3,
bin0,bin1,bin2,bin3,
dout0,dout1,dout2,dout3,
溢出);
输入[2:0]cmd;
输入[31:0]ain0、ain1、ain2、ain3;
输入[31:0]bin0,bin1,bin2,bin3;
输出寄存器[31:0]dout0、dout1、dout2、dout3;
输出[3:0]溢出;
导线[31:0]a[3:0];
导线[31:0]b[3:0];
导线[31:0]d[3:0];
导线ovf[3:0];
分配{a[0],a[1],a[2],a[3]}={ain0,ain1,ain2,ain3};
赋值{b[0],b[1],b[2],b[3]}={bin0,bin1,bin2,bin3};
赋值{d[0],d[1],d[2],d[3]}={dout0,dout1,dout2,dout3};
参数大小=4;
genvar i;
为(i=0;i
错误信息非常清楚。诸如以下模块的实例:

my_add(.ain(a[0]), .bin(b[0]), .dout(d[0]), .overflow(ovf[0]));
需要实例名,例如

my_add my_add0 (.ain(a[0]), .bin(b[0]), .dout(d[0]), .overflow(ovf[0]));
       ^^^^^^^

Verilog中的模块实例必须始终具有实例名称。实例名称类似于电路图上的标签。在电路图上,你可以将IC标记为IC1、IC2等,将电容器标记为C1、C2等。你需要在Verilog中做同样的事情。而且,就像在电路图上一样,实例名称在特定范围内(即在模块内)必须是唯一的。电路图类比仍然成立:电路图上不会有两个IC1或两个C1s,是吗?

谢谢你的回答!但是我想通过使用generate for语句来实现4我的添加,而不是通过实现我的添加0,我的添加1,我的添加2。“我该怎么做呢?你还得给它起个名字。”正如奥尔德法特所说的,伊萨克姆。你还得给它起个名字。在我的示例中,实例的分层实例名称将以
.adder[i].my_add0
结尾,因为
adder
是出现
my_add0
的块的名称。你为什么反对给它命名?generate语句仅仅是生成(稍微)可变数量的并发事件的一种方法,例如实例、initial/always blocks/assign语句。试试看会发生什么。