1

I am implementing Code converter with a mode switch such that mode 0 implies binary to grey code and mode 1 implies grey to binary conversion. My design and testbench is as shown below.

Design


    module bin2gray(input [3:0] bin, output [3:0] G );
    
    assign G[3] = bin[3];
    assign G[2] = bin[3] ^ bin[2];
    assign G[1] = bin[2] ^ bin[1];
    assign G[0] = bin[1] ^ bin[0];
    
    endmodule
    
    module gray2bin (input [3:0] G, output [3:0] bin );
    
    assign bin[3] = G[3];
    assign bin[2] = G[3] ^ G[2];
    assign bin[1] = G[3] ^ G[2] ^ G[1];
    assign bin[0] = G[3] ^ G[2] ^ G[1] ^ G[0];
    
    endmodule
    
    module code_converter(in,mode_switch,out);
    input [3:0]in;
    input mode_switch;
    output [3:0] out;
    always @(in or mode_switch);
    if(mode_switch == 1'b1)
        gray2bin m2(in,out);
    else
        bin2gray m1(in,out);
    endmodule

TestBench


    module tb();
    
        reg [3:0] in;
        reg mode_switch;
        wire [3:0] out;
     
    code_converter uut(.in(in),.mode_switch(mode_switch),.out(out));
        
       // stimulus
       initial  begin
    
        mode_switch <=0;       
            in <= 0; #10;
            in <= 1;   #10;
            in <= 2;   #10;
            in <= 3;   #10;
            in <= 4;   #10;
            in <= 5;   #10;
            in <= 6;   #10;
            in <= 7;   #10;
            in <= 8;   #10;
            in <= 9;   #10;
            in <= 10;  #10;
            in <= 11;  #10;
            in <= 12;  #10;
            in <= 13;  #10;
            in <= 14;  #10;
            in <= 15;  #10;
            #100;   
    
        mode_switch <=1;
            in <= 0; #10;
            in <= 1;   #10;
            in <= 2;   #10;
            in <= 3;   #10;
            in <= 4;   #10;
            in <= 5;   #10;
            in <= 6;   #10;
            in <= 7;   #10;
            in <= 8;   #10;
            in <= 9;   #10;
            in <= 10;  #10;
            in <= 11;  #10;
            in <= 12;  #10;
            in <= 13;  #10;
            in <= 14;  #10;
            in <= 15;  #10;
            #100;
          $stop;
       end
    initial begin
    $dumpvars;
    $dumpfile("sth.vcd");
    end
    endmodule

I am getting the following syntax error while compiling the code.

Logs


    vu2swz@PPDP01:~$ iverilog codeconverter.v 
    codeconverter.v:24: error: Unable to bind parameter `mode_switch' in `tb.uut'
    codeconverter.v:24: error: Cannot evaluate genvar conditional expression: (mode_switch)==(1'd1)
    codeconverter.v:24: error: Unable to bind parameter `mode_switch' in `tb.uut'
    codeconverter.v:24: error: Cannot evaluate genvar conditional expression: (mode_switch)==(1'd1)

4 error(s) during elaboration.

Is there any problem with the design and syntax?

1 Answer 1

4

The problem is that you can not instantiate modules conditionally based on a signal value at runtime.

You can add both instances, then choose the desired instance output based on the switch signal.

module code_converter(in,mode_switch,out);
    input [3:0]in;
    input mode_switch;
    output [3:0] out;
    wire [3:0] out_b2g;
    wire [3:0] out_g2b;

    assign out = (mode_switch) ? out_g2b : out_b2g;
    gray2bin m2 (in, out_g2b);
    bin2gray m1 (in, out_b2g);
endmodule
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.