Verilog 32位加法器-减法器模型编译错误:非法左值

Verilog 32位加法器-减法器模型编译错误:非法左值,verilog,fpga,xilinx,Verilog,Fpga,Xilinx,我正在使用以下规范设计一个32加法器/减法器 输入通过同步复位和启用信号连接到FFs。这些寄存器的输出连接到加法/减法运算。加法/减法运算的输出进入另一组FFs,其输出连接到输出端口。现在,当输入被提供给模块时,输出在2个时钟周期后生成 这是我的设计 module adder(A,B,Add_Sub,Out); input [31:0]A; input [31:0]B; input Add_Sub; output [32:0]Out;

我正在使用以下规范设计一个32加法器/减法器

输入通过同步复位和启用信号连接到FFs。这些寄存器的输出连接到加法/减法运算。加法/减法运算的输出进入另一组FFs,其输出连接到输出端口。现在,当输入被提供给模块时,输出在2个时钟周期后生成

这是我的设计


    module adder(A,B,Add_Sub,Out);
      input [31:0]A;
      input [31:0]B;
      input Add_Sub;
      output [32:0]Out;
      reg [32:0]Out;
      always @( A or B or Add_Sub)
        begin
          if(Add_Sub == 1)
            Out = A + B;
          else
            Out = A -B;
        end
    endmodule
    
    module DFF(D,clk,reset,enable, Q);
      input[31:0] D; // Data input
      input clk,reset,enable;
      output[31:0] Q; // output Q
      reg[31:0] Q;
    always @(posedge clk or posedge reset)
    begin
        if(reset)
            Q <= 32'b0;
        else if (enable)
            Q <= D;
    end
    endmodule
      
    module register_adder(A,B,CLK,RST,ADD_SUB,EN,OUT,OUT_READY);
      input [31:0]A,B;
      input CLK,RST,ADD_SUB,EN;
      output [32:0]OUT;
      reg [32:0]OUT;
      wire [31:0]Q1,Q2;
      wire[32:0]Q3;
      output OUT_READY;
      always @(posedge CLK or A or B or ADD_SUB)
        begin
          DFF F1(A,CLK,RST,EN,Q1);
          DFF F2(B,CLK,RST,EN,Q2);
          adder A1(Q1,Q2,ADD_SUB,Q3);
          DFF F3(Q3,CLK,RST,EN,OUT);
          OUT_READY <=1'b1;
        end
    endmodule


我在分析中找不到问题。

您的模块实例不应位于
始终
块中

OUT\u READY
也不应该在
始终
中,它应该使用
assign
关键字和阻塞赋值运算符(
=

以下代码不再出现编译错误:

module register_adder(A,B,CLK,RST,ADD_SUB,EN,OUT,OUT_READY);
  input [31:0]A,B;
  input CLK,RST,ADD_SUB,EN;
  output [32:0]OUT;
  reg [32:0]OUT;
  wire [31:0]Q1,Q2;
  wire[32:0]Q3;
  output OUT_READY;

  DFF F1(A,CLK,RST,EN,Q1);
  DFF F2(B,CLK,RST,EN,Q2);
  adder A1(Q1,Q2,ADD_SUB,Q3);
  DFF F3(Q3,CLK,RST,EN,OUT);

  assign OUT_READY = 1'b1;
endmodule
下面是上的固定代码(如果您还没有帐户,则需要创建一个帐户——它是免费的)


该代码在某些模拟器上生成警告消息。例如,通过Cadence,我看到:

      DFF F3(Q3,CLK,RST,EN,OUT);
              |
xmelab: *W,CUVMPW (./testbench.sv,42|14): port sizes differ in port connection(33/32) for the instance(register_adder) .
您需要决定是真正需要32位还是33位

      DFF F3(Q3,CLK,RST,EN,OUT);
              |
xmelab: *W,CUVMPW (./testbench.sv,42|14): port sizes differ in port connection(33/32) for the instance(register_adder) .