代码之家  ›  专栏  ›  技术社区  ›  Isaac Kim

不允许同时分配到非网络

  •  1
  • Isaac Kim  · 技术社区  · 7 年前

    我正在制作模块,使用4个32位加法器根据cmd生成结果。 如果cmd为0,则dout0=a0+b0,其他dout为零 如果cmd为1,则dout1=a1+b1,其他dout为零。 如果cmd也是2或3。 如果cmd为4 dout0,1,2,3,则得出先前的结果。

    错误消息为:

    错误-VRFC 10-529对非网络dout0的并发分配不是 允许的~/sim\u 1/new/adder\u阵列。v: 63岁

    为什么会发生此错误,如何解决此问题?

    以下是代码v.23~69。

    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 overflow = {ovf[3], ovf[2], ovf[1], ovf[0]};
    
    parameter size = 4;
    
    genvar i;
    generate for(i = 0 ; i < size - 1 ; i = i + 1)
    begin:adder
        if (i == 0) begin
         my_add adder(.ain(a[0]), .bin(b[0]), .dout(d[0]), .overflow(ovf[0]));
          end
        else if (i == size - 1 ) begin
          my_add adder(.ain(a[i]), .bin(b[i]), .dout(d[i]), .overflow(ovf[i]));
          end
        else begin
          my_add adder(.ain(a[i]), .bin(b[i]), .dout(d[i]), .overflow(ovf[i]));
          end
    end
    endgenerate
    
    assign dout0 = (cmd == 0 || cmd == 4) ? d[0] : 0;
    assign dout1 = (cmd == 1 || cmd == 4) ? d[1] : 0;
    assign dout2 = (cmd == 2 || cmd == 4) ? d[2] : 0;
    assign dout3 = (cmd == 3 || cmd == 4) ? d[3] : 0;
    
    endmodule
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   RaZ    7 年前

    如果要使用 assign 声明,make dout0 wire 键入而不是 reg

    我可以写下你为什么会遇到这样的错误,但克里夫·卡明斯已经给出了一个很好的答案: How to 'assign' a value to an output reg in Verilog?