1

I am having some issues when attempting to run a simulation. It seems there is an issue with my instances of my first 2 modules inside of my 3rd module. The code is compiling okay, but I am running into trouble when I try to run a simulation.

I am not really sure if the problem is in my code or my test bench.

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   

1 Answer 1

0

The problem is in the my_multiplier module where you have multiple syntax errors. If you sign up for a free account on edaplayground and post your code there, you may see more helpful compile errors there.

You must not place a module instance inside an always block. These 2 lines must be moved outside the always:

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

Once you do that, you need to add instance names, like i0 and i1 below:

fulladder i0 (Atemp, O, Otemp);
shifter i1 ( A, C, Atemp);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.