Question

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
Was it helpful?

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);   

OTHER TIPS

Your missing a reset condition, either synchronous or asynchronous. Your flops have an unknown value and never reach known state because the data input is dependent on the flop output. By adding a reset to can put the flops into a known state independent of its outputs (V/V_bar).

In this case adding a synchronous is be easier. Simply add some 2-to-1 muxes and a new reset pin.

Mux2to1 syncrst3(a_d,a,1'b0,reset);
// ...
D_Flip_Flop stage3b(a_d,clk,V[3],V_bar[3]);
// ...
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top