Design Interview Questions 2 :

Question 1 : How do you combine different states in an FSM?. Is there any benefit in combining States?.

FSM states can be combined if the State transitions from/to the States are same. By combining various FSM States we can save on following things:

1. Design Space for Verification: With fewer states we have lesser State transitions to verify hence Verification is easier and faster.

2. Power: With Lesser States less Flops can be needed saving more power. Specifically when we are using.

3. Area & Complexity : With lesser States complexity of combinational logic to calculate next-state logic is simpler and also lesser gates are needed saving area.

Question 2: Design a Fixed Priority Arbiter and Round-Robin Arbiter?

Fixed Priority Arbiter :
Round-Robin Arbiter :
logic [3:0] req;
logic [3:0] grnt;
logic [3:0] mask;
logic [3:0] mask_comb;
logic [3:0] mask_comb_q;
logic [3:0] last_grnt_ff;


//Round-Robin Arbiter version-1 (Masking based- Same cycle Grant)
always_comb begin
 if(|req[3:0]) begin
  casez(last_grnt_ff[3:0])
    4'b0001 : mask_comb = 4'b1110;
    4'b0010 : mask_comb = 4'b1100;
    4'b0100 : mask_comb = 4'b1000;
    4'b1000 : mask_comb = 4'b1111;
    default : mask_comb = 4'b1111;
  endcase
 end
end

assign mask_comb_q = (mask_comb == 4'h0) ? req : (req & mask_comb);

always_comb begin
  casez(mask_comb_q[3:0]) 
    4'b0001 : grnt = 4'b1110;
    4'b0010 : grnt = 4'b1101;
    4'b0100 : grnt = 4'b1011;
    4'b1000 : grnt = 4'b0111;
    default : grnt = 4'b0000;
  endcase
end

always_ff @(posedge clk or negedge rst) begin
 if(!rst)
   last_grnt_ff <= 4'h0;
 else if (|req)
   last_grnt_ff <= grnt;
 else
   last_grnt_ff <= grnt;
end

//Round-Robin Arbiter version-2 (FSM based- Next Cycle Grant)
always_ff @(posedge clk or negedge rst) begin
  if(!rst)
    grnt_pstate <= 4'h0;
  else
    grnt_pstate <= grnt_nstate;
end

always_comb begin
  casez (grnt_pstate)
    4'b0000 : begin
               casez(req)
               4'b???1 : grnt_nstate = 4'b0001;
               4'b??10 : grnt_nstate = 4'b0010;
               4'b?100 : grnt_nstate = 4'b0100;
               4'b1000 : grnt_nstate = 4'b1000;
               default : grnt_nstate = 4'b0000;
              endcase
              end
    4'b0001 : begin 
               casez(req)
                4'b??1? : grnt_nstate = 4'b0010;
                4'b?10? : grnt_nstate = 4'b0100;
                4'b100? : grnt_nstate = 4'b1000;
                4'b0001 : grnt_nstate = 4'b0001;
                default : grnt_nstate = 4'b0001;
               endcase 
              end
    4'b0010 : begin 
               casez(req)
               4'b?1?? : grnt_nstate = 4'b0100;
               4'b10?? : grnt_nstate = 4'b1000;
               4'b00?1 : grnt_nstate = 4'b0001;
               4'b0010 : grnt_nstate = 4'b0010;
               default : grnt_nstate = 4'b0010;
               endcase
              end
   4'b0100 : begin
              casez(req)
               4'b1??? : grnt_nstate = 4'b1000;
               4'b0??1 : grnt_nstate = 4'b0001;
               4'b0?10 : grnt_nstate = 4'b0010;
               4'b0100 : grnt_nstate = 4'b0100;
               default : grnt_nstate = 4'b0100;
              endcase
             end
   4'b1000 :  begin
               casez(req)
               4'b???1 : grnt_nstate = 4'b0001;
               4'b??10 : grnt_nstate = 4'b0010;
               4'b?100 : grnt_nstate = 4'b0100;
               4'b1000 : grnt_nstate = 4'b1000;
               default : grnt_nstate = 4'b1000;
              endcase
             end
    default : grnt_nstate = gnrt_pstate;
 endcase
end

//Fixed Priority Arbiter version-1 (Priority Mux)
always_comb begin
  grnt[3:0] = 4'b0;
  for (int i = 0; i < 4; i++) 
    if(req[i] == 1'b1) begin
      grnt[i] = 1'b1;
      break;
    end  
  end
end

//Fixed Priority Arbiter version-2 (Priority Mux- Synthesis Friendly)
always_comb begin
  grnt[3:0] = 4'b0;
  casez(req[3:0])
    4'b???1 : grnt = 4'b0001;
    4'b??10 : grnt = 4'b0010;
    4'b?100 : grnt = 4'b0100;
    4'b1000 : grnt = 4'b1000;
    default : grnt = 4'b0000;
  endcase
end

Question 3: What is advantages of using one-hot encoding for FSM ?

One hot Coding simplifies combinational logic and reduces multi-bit Transitions to 2.

For E.g in below State, in any State Transition, one bit goes 1->0 and other goes from 0->1 in a State change. This also reduces power required by the logic.

State0 : 4'b0001
State1 : 4'b0010
State2 : 4'b0100
State3 : 4'b1000

However, if the number of States are more for E.g =>8 then more logic is required and combinational logic and number of Flops can increase Area and Power & in that case binary or Gray coding is preferred.

In some cases, Synthesis Tool can actually optimize the encoding depending on the Trade-off specified in Tool.

Published by

tachyonyear

Silicon Design Enthusiast.