UVM & RTL/Verilog HDL

[21] Verilog HDL 조합회로 설계과제 (Decoder, Encoder)

Return 2022. 3. 5. 19:00

★ Active-low enable신호를 갖는 4 : 2 이진 인코더를 다음의 방법으로 모델링하고 시뮬레이션을 통해 검증한다. enable신호가 0이면 인코더의 출력도 0이 되도록 한다. 

case문을 사용하는 방법

if 조건문을 사용하는 방법

for 반복문을 사용하는 방법 

// 설계과제 10.6 
module en_encoder(en, a, y);
    input en;
    input [3:0] a;
    output reg [1:0] y;

    // 1. case문 사용.
    always@(*)begin 
        if(!en) y=2'b0;
        else begin
            case(a)
                4'b0001 : y = 2'b00;
                4'b0010 : y = 2'b01;
                4'b0100 : y = 2'b10;
                4'b1000 : y = 2'b11;
                default : y=2'bx;
            endcase
        end
    end

    // 2. if문 사용 
    always@(*)begin 
        if(!en) y =2'b0;
        else begin 
            if(a==4'b0001) y = 2'b00;
            else if(a==4'b0010) y = 2'b01;
            else if(a==4'b0100) y = 2'b10;
            else if(a==4'b1000) y = 2'b11;
            else y = 2'bx;
        end
    end

    // 3. for문 사용 
    integer i;
    reg [3:0] temp;
    always@(*)begin 
        if(!en) y=2'b0;
        else begin
            temp = 4'b0001;
            y = 2'bx;
            for(i=0;i<4;i=i+1)begin
                if(a==temp) y = i;
                temp = temp << 1;
            end
        end
    end
    
endmodule

▣ TESTBENCH

// 설계과제 10.6 testbench
module tb_en_encoder;
    reg en;
    reg [3:0] a;
    wire [1:0] y;
    integer i;

    en_encoder u0(en,a,y);

    initial begin 
        a = 4'b0001;
        en = 0;
        #40 en = 1;
        #40 en = 0;
        #40 en = 1;
    end

    initial begin 
        for(i=1;i<17;i=i+1)begin 
            #20 a = i;
        end
    end

endmodule

ACTIVE-LOW ENABLE 4:2 ENCODER

★ Active-low enable신호를 갖는 4 : 2 우선순위 인코더를 다음의 방법으로 모델링하고, 시뮬레이션을 통해 검증한다.  enable신호가 0이면 인코더의 출력도 0이 되도록 한다. 

case문을 사용하는 방법

if 조건문을 사용하는 방법

for 반복문을 사용하는 방법 

// 설계과제 10.7 
module pri_en_encoder(en,a,y,valid);
    input en;
    input [3:0] a;
    output reg [1:0] y;
    output reg valid;

    // 1. case문.
    always@(*)begin 
        valid =1;
        if(!en) y = 4'b0000;
        else begin 
            casex(a)
                4'b1xxx : y = 2'b11;
                4'b01xx : y = 2'b10;
                4'b001x : y = 2'b01;
                4'b0001 : y = 2'b00;
                default : begin 
                    valid = 0;
                    y = 2'bx;
            endcase
        end
    end

    // 2. if문 
        always@(*)begin 
            valid =1 ;
            if(!en) y =2'b0;
            else begin 
                if(a==4'b1xxx) y = 2'b11;
                else if(a==4'b01xx) y = 2'b10;
                else if(a==4'b001x) y = 2'b01;
                else if(a==4'b0001) y = 2'b00;
                else begin
                    y = 2'bx;
                    valid = 0;
            end
        end
    end

    // 3. for문 
    integer i;
    always@(*)begin : LOOP
        valid = 0;
        if(!en) y=2'b00;
        else begin
            y = 2'bx;
            for(i=3;i>=0;i=i-1)begin 
                if(a[i]) begin
                    valid = 1;
                    y = i;
                    diable LOOP;
                end
            end
        end
    end
endmodule

▣ TESTBENCH

// 설계과제 10.7 testbench 
module tb_en_encoder;
    reg en;
    reg [3:0] a;
    wire [1:0] y;
    wire valid
    integer i;

    en_encoder u0(en,a,y,valid);

    initial begin 
        a = 4'b0001;
        en = 0;
        #40 en = 1;
        #40 en = 0;
        #40 en = 1;
    end

    initial begin 
        for(i=1;i<17;i=i+1)begin 
            #20 a = i;
        end
    end
endmodule

★ Active-high enable 신호를 갖는 3 : 6 디코더를 다음의 방법으로 모델링하고, 시뮬레이션을 통해 검증한다. enable신호가 0이면 입력에 무관하게 디코더 출력은 0이된다. 

if 조건문을 사용하는 방법 

module dec_param(en,a,y);
    parameter in_width =3 , out_width =6;
    input en;
    input [in_width-1:0] a;
    output reg [out_width-1:0] y;
    integer n;

    always @(*) begin
        if(!en) y=0;
        else
            if(a>out_width-1)
                for(n=0;n<=out_width;n=n+1)
                    y[n] = 1'bx;
            else
                for(n=0;n<out_width;n=n+1)
                    if(a==n) y[n] = 1'b1;
                    else y[n] = 1'b0;
    end
endmodule

enable신호와 입력 a를 결합 연산자 { }로 묶어 case문의 조건으로 사용하는 방법 

module dec_param(en,a,y);
    input en;
    input [2:0] a;
    output reg [5:0] y;
    wire temp;
    
    assign temp = {en,a};

    always@(*)begin
        casex(temp)
            4'b0xxx : y = 6'b0;
            4'b1000 : y = 6'b000001;
            4'b1001 : y = 6'b000010;
            4'b1010 : y = 6'b000100;
            4'b1011 : y = 6'b001000;
            4'b1100 : y = 6'b010000;
            4'b1101 : y = 6'b100000;
            4'b1110 : y = 6'b000000;
            4'b1111 : y = 6'b000000;
            default : y=6'bx;
        endcase 
    end
endmodule

▣ TESTBENCH

module tb_dec_param;
    reg en;
    reg [2:0] a;
    wire [5:0] y;
    integer n;

    dec_param u0(en,a,y);

    always begin
        en=1;
        for(n=0;n<8;n=n+1)begin
            #20 a=n;
        end

        en=0;
        for(n=0;n<8;n=n+1)begin
            #20 a=n;
        end
    end
endmodule

결합연산자와 case문 사용한 SIMULATION