Verilog 中对 'fulladder' 的未解决引用

Unresolved reference to 'fulladder' in Verilog

我在尝试 运行 模拟时遇到了一些问题。我的第 3 个模块中的前 2 个模块的实例似乎有问题。代码编译正常,但是当我尝试 运行 模拟时,我 运行 遇到了麻烦。

我不确定问题出在我的代码还是我的测试平台上。

module fulladder
(
 input [15:0] x,
 input [15:0] y,
 output [15:0] O 
 );
 
assign O =   y + x;
 
endmodule

module shifter
(
 input [15:0] in,
 input [2:0] N,
 output [15:0] O 
 );
  reg [7:0] out_reg;
  assign O = out_reg;

  always @(N or in) begin
    case (N)
      7 : out_reg <= { in[7:0],7'b0};
      6 : out_reg <= { in[7:0],6'b0};
      5 : out_reg <= { in[7:0],5'b0};
      4 : out_reg <= { in[7:0],4'b0};
      3 : out_reg <= { in[7:0],3'b0};
      2 : out_reg <= { in[7:0],2'b0};
      1 : out_reg <= { in[7:0],1'b0};
      0 : out_reg <=         in[7:0];
    endcase
  end

endmodule

module my_multiplier(Rst, Ld, clk, A, B, O);
input clk;
input [7:0]A, B;
input Rst, Ld;
output [15:0] O;
reg Done;
reg [15:0] Otemp;
reg [15:0] O;
reg [7:0] Atemp;
reg [1:0] state;
reg [1:0] C;

parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;

always @(posedge clk or posedge Rst)
begin
   case(state)
    S0: begin
    Done <= 0;
    if (Ld == 1)
    begin
       C <= 0;
       Atemp <= A;
       state <= S1; 
    end
    else
       state <= S0; 
    end

    S1: if (B[C] == 1) 
    begin
       shifter ( A, C, Atemp);
       O <= Otemp;
       C <= C + 1;
       state <= S2; 
    end
    else 
    begin
       Atemp <= 0;
       O <= Otemp;
       C <= C + 1;
       state <= S2; 
    end
    S2: begin
    O <= Otemp;
    if (C == 3)
      state <= S3;
    else
      state <= S2;
    end
    S3:  begin
        Done <= 1;
    state <= S0;
    end
    default 
    state <= S0;

   endcase

   fulladder (Atemp, O, Otemp);

end   

endmodule


module my_multiplier_tb;

reg clk_tb;
reg [7:0]A_tb, B_tb;
reg  Rst_tb, Ld_tb;
wire [15:0] O_tb;

my_multiplier dut( Rst_tb, Ld_tb, clk_tb, A_tb, B_tb, O_tb );

always #5 clk_tb = ~clk_tb;

initial begin
  A_tb = 8'd8;  
  B_tb = 8'd7;

  #15 Ld_tb = 1; // set Load to begin multiplication
  #10 Ld_tb = 0; // wait 1 clock cycle
  #300   

  $monitor($time, "\t A=%d,\t B=%d,\t O=%d", A_tb, B_tb, O_tb);
    
  $finish;
end

endmodule   

问题出在 my_multiplier 模块中,您有多个语法错误。如果您在 edaplayground 上注册一个免费帐户并在 post 上输入您的代码,您可能会在那里看到更多有用的编译错误。

您不能将模块实例放在 always 块中。这两行必须移到 always:

之外
fulladder (Atemp, O, Otemp);
shifter ( A, C, Atemp);

完成后,您需要添加实例名称,例如下面的 i0i1

fulladder i0 (Atemp, O, Otemp);
shifter i1 ( A, C, Atemp);