The Designer's Guide Community Forum
https://designers-guide.org/forum/YaBB.pl
Design Languages >> Verilog-AMS >> Can't Figure Out Issue
https://designers-guide.org/forum/YaBB.pl?num=1317528304

Message started by Chippo on Oct 1st, 2011, 9:05pm

Title: Can't Figure Out Issue
Post by Chippo on Oct 1st, 2011, 9:05pm

Hi, so i am trying to convert a 4x4 bit unsigned multiplier into a 5x5 signed multiplier. The way we are to be doing it is that we just have to check the sign bits and 2's complement any number that is most significant bit 1 and 2's complement end products if necessary. My issue is that I can't seem to call the 4x4 bit multiplier in my 5x5 signed multiplier. This is the error:

Error (10170): Verilog HDL syntax error at s_mult5x5.v(19) near text "u";  expecting "<=", or "="

Here is the code of my 5x5 multiplier:

module s_mult5x5(clk, st, mplier, mcand, prod, done);
     input clk;
     input st;
     input [4:0] mplier, mcand;
     output [8:0] prod;
     output done;
     wire x, y;
     
     reg done;
     reg [8:0] prod;

     always @(posedge clk or posedge st)
     begin
     if (mplier[4])
           x = ~mplier[3:0] + 1;
     if (mcand[4])
           y = ~mcand[3:0] + 1;

     mult4x4 u (clk, st, mplier, mcand, prod, done);

     if(mplier[4]^mcand[4])
                 product = ~product + 1;
     end
endmodule
           
           

Title: Re: Can't Figure Out Issue
Post by Ken Kundert on Oct 2nd, 2011, 7:44am

You should move the instantiation of the 4-bit multiplier outside of the always block.

-Ken

Title: Re: Can't Figure Out Issue
Post by Chippo on Oct 2nd, 2011, 8:48am

Hey Ken, thx for responding. After moving it out of the always block it let's me call the function, but now i am getting other errors on my last if block.

Error (10170): Verilog HDL syntax error at s_mult5x5.v(20) near text "begin";  expecting "endmodule"
Error (10170): Verilog HDL syntax error at s_mult5x5.v(21) near text "^";  expecting ".", or an identifier

Here's the new code:
module s_mult5x5(clk, st, mplier, mcand, prod, done);
     input clk;
     input st;
     input [4:0] mplier, mcand;
     output [8:0] prod;
     output done;
     
     reg done;
     reg [8:0] prod;

     always @(posedge clk or posedge st)
     begin
     if (mplier[4])
           mplier[3:0] = ~mplier[3:0] + 1;
     if (mcand[4])
           mcand[3:0] = ~mcand[3:0] + 1;
     end
     
     mult4x4 u (clk, st, mplier[3:0], mcand[3:0], prod, done);

     if(mplier[4]^mcand[4])
                 prod = ~prod + 1;

endmodule

Title: Re: Can't Figure Out Issue
Post by Ken Kundert on Oct 2nd, 2011, 10:31am

The if statement has to be within the always block.

I think you do not understand a basic concept of Verilog. A Verilog module can contain behavioral code (in initial and always blocks) and structural code (instantiations). The instantiations are evaluated once before the simulation begins, where the code in the always blocks is evaluated repeatedly through out the simulation. As a result, you cannot mix these two types of statements. Hence, instance statement cannot go inside initial and always blocks, and if statements cannot go outside.

-Ken

Title: Re: Can't Figure Out Issue
Post by Chippo on Oct 2nd, 2011, 2:41pm

Hey Ken,

I apologize for asking basic questions while I am missing some basic concepts of verilog since I never really learned it. But I do understand what you said, thank you for the clarification. I will be able to figure it out keeping that in mind when writing hte code. Perhaps you can help me with a code that my teacher wrote. I wrote a testbench to test the code, but am only get xxxxxxxx for the output. I tried tracing through the code to see what the signals are and can't find any errors, but then again I am not an expert in it. Here is the code:

module mult4x4(clk, st, mplier, mcand, prod, done);
     input clk;
     input st;
     input [3:0] mplier, mcand;
     output [8:0] prod; //added
     output done;

     reg done;
     reg [3:0] pstate,nstate;
     reg [8:0] prod;
     
     parameter s0=4'b0000, s1=4'b0001, s2=4'b0010, s3=4'b0011;
     parameter s4=4'b0100, s5=4'b0101, s6=4'b0110, s7=4'b0111;
     parameter s8=4'b1000, s9=4'b1001;

     reg [8:0] ACC; //accumulator
     //reg M=ACC[0]; //M is bit 0 of ACC; could use 'define
     wire M;

     assign M = ACC[0];

     always @(posedge clk or posedge st)
           if (st) pstate = s0;
           else pstate = nstate;

     always @(pstate) //state transition
           case (pstate)
           s0: if(st) nstate = s1;
           s1: if (M) nstate = s2; else nstate = s3;
           s2: nstate = s3;
           s3: if (M) nstate = s4; else nstate = s5;
           s4: nstate = s5;
           s5: if (M) nstate = s6; else nstate = s7;
           s6: nstate = s7;
           s7: if (M) nstate = s8; else nstate = s8;
           s8: nstate = s9;
           s9: nstate = s0;
           endcase
           
     always @(pstate) //Output (Action)
           case (pstate)
           s0: begin
                 ACC[8:4] = 5'b00000;
                 ACC[3:0] = mplier;
                 end
           s1: ACC[8:4] = {1'b0, ACC[7:4]} + {1'b0, mcand};
           s2: ACC = {1'b0, ACC[8:1]};
           s3: ACC[8:4] = {1'b0, ACC[7:4]} + {1'b0, mcand};
           s4: ACC = {1'b0, ACC[8:1]};
           s5: ACC[8:4] = {1'b0, ACC[7:4]} + {1'b0, mcand};
           s6: ACC = {1'b0, ACC[8:1]};
           s7: ACC[8:4] = {1'b0, ACC[7:4]} + {1'b0, mcand};
           s8: ACC = {1'b0, ACC[8:1]};
           s9: begin
                 done = 1'b1;
                 prod = ACC;
                 end
           endcase
endmodule
                 


Title: Re: Can't Figure Out Issue
Post by Ken Kundert on Oct 2nd, 2011, 3:31pm

Debugging is an important skill that is learned from practice.

-Ken

The Designer's Guide Community Forum » Powered by YaBB 2.2.2!
YaBB © 2000-2008. All Rights Reserved.