Search code examples
verilogflip-flopmux

Shift Register Design using Structural Verilog outputs X


I am designing a shift register using hierarchical structural Verilog. I have designed a D flip flop and an 8 to 1 mux that uses 3 select inputs. I am trying to put them together to get the full shift register, but my output only gives "XXXX" regardless of the select inputs.

Flip Flop Code

module D_Flip_Flop(
input D,
input clk,
output Q, Q_bar
);
 
 wire a,b,c,d;
 
 nand(a,D,b);
 nand(b,a,clk,d);
 nand(c,a,d);
 nand(d,c,clk);
 nand(Q,d,Q_bar);
 nand(Q_bar,b,Q);   

endmodule

8 to 1 Mux

module Mux8to1(
input [2:0]S,
 input A,B,C,D,E,F,G,H,
output Out
);
 
 wire a,b,c,d,e,f,g,h;
 
 and(a, A,~S[2],~S[1],~S[0]);
 and(b, B,~S[2],~S[1],S[0]);
 and(c, C,~S[2],S[1],~S[0]);
 and(d, D,~S[2],S[1],S[0]);
 and(e, E,S[2],~S[1],~S[0]);
 and(f, F,S[2],~S[1],S[0]);
 and(g, G,S[2],S[1],~S[0]);
 and(h, H,S[2],S[1],S[0]);
 
 or(Out, a,b,c,d,e,f,g,h);


endmodule

Hierarchical Combination of the Two

module shiftRegister_struct(
input clk,
input [2:0]S,
input [3:0]L,
output reg [3:0]V
);
 
 wire a,b,c,d;
 wire V_bar[3:0];
 
 Mux8to1 stage3(S[2:0],V[3],V[0],V[2],1'b0,V[2],V[3],V[2],L[3],a);
 Mux8to1 stage2(S[2:0],V[2],V[3],V[1],V[3],V[1],V[3],V[1],L[2],b);
 Mux8to1 stage1(S[2:0],V[1],V[2],V[0],V[2],V[1],V[2],V[1],L[1],c);
 Mux8to1 stage0(S[2:0],V[0],V[1],V[3],V[1],1'b0,V[1],1'b0,L[0],d);
 
 D_Flip_Flop stage3b(a,clk,V[3],V_bar[3]);
 D_Flip_Flop stage2b(b,clk,V[2],V_bar[2]);
 D_Flip_Flop stage1b(c,clk,V[1],V_bar[1]);
 D_Flip_Flop stage0b(d,clk,V[0],V_bar[0]);

end module

Any thoughts on what might be screwing up my output? The output is V[3:0].

I should also include my test bench code:

module Shift_Test_Bench;

// Inputs
reg [2:0] S;
reg [3:0] L;
reg clk;

integer i;
integer j;

// Outputs
wire [3:0] V;

// Instantiate the Unit Under Test (UUT)
shiftRegister_struct uut (
    .clk(clk),
    .S(S), 
    .L(L),
    .V(V)
);

initial begin
    // Initialize Inputs
    S = 7;
    L = 3;
    clk = 1;
    

    // Wait 100 ns for global reset to finish
    #100;
    
    // Add stimulus here
    
    for(i = 0; i < 16; i = i+1)
    begin
        S = i;
        
        for(j = 0; j < 2; j = j+1)
            begin
            clk = !clk;
            #5;
            end
            
    end
            
        
    

end
  
endmodule

Solution

  • You have a wiring bug in your D_Flip_Flop module. When I simulated your testbench, I got compiler warnings:

      Implicit wire 'f' does not have any driver, please make sure this is 
      intended.
    
      Implicit wire 'e' does not have any driver, please make sure this is 
      intended.
    

    Here are the lines:

     nand(Q,d,f);
     nand(Q_bar,b,e);