UVM & RTL/Verilog HDL

[19] Verilog HDL 조합회로 설계과제1 (NAND, NOR, BOOL, TRUTH TABLE, MUX)

Return 2022. 3. 5. 18:55

★ 3입력 NOR 게이트를 다음과 같은 3가지 방식으로 모델링하고, 테스트벤치를 작성하여 기능을 검증한다.

비트 연산자를 사용하는 방법 

축약 연산자를 사용하는 방법 

if 조건문을 사용하는 방법 

// 설계과제 10.1
module nor_test (a,y);
  input [2:0] a;
  output y;

  // 1. 비트 연산자 활용
  assign y = ~(a[0]|a[1]|a[2]);

  // 2. 축약연산자 활용
  assign y = ~|a;

  // 3. if 조건문 활용
  reg y;
  always @ ( * ) begin
    if(a = 3'b111) y = 0;
    else y =1;
  end

endmodule // nor_testa,y

▣ TESTBENCH

// 설계과제 10.1 testbench
module tb_nor_test;
  reg [2:0] a;
  wire y;
  integer i;

  nor_test u0(a,y);

  always begin
    a=0;
    for(i=1;i<9;i=i+1)begin
      #20 a = i;
      end
  end
endmodule

3입력 NOR GATE TESTBENCH SIMULATION

 

★ 4비트 2입력 XOR게이트를 다음과 같은 2가지 방식으로 모델링하고, 테스트벤치를 작성하여 기능을 검증한다.

비트 연산자를 사용하는 방법 

for반복문을 사용하는 방법 

// 설계과제 10.2
module xor_test(a,b,y);
  input [3:0] a,b;
  output [3:0] y;

  // 1. 비트 연산자 활용
  assign y = a^b;

  // 2. for반복문
  integer i;
  reg [3:0] y;
  always @(*) begin
  for(i=0;i<4;i=i+1)begin
    y[i] = a[i]^b[i];
     end
  end
endmodule

▣ TESTBENCH

module tb_xor_test;
  reg [3:0] a,b;
  wire [3:0] y;

  xor_test u0(a,b,y);

  initial begin
    a=4'b0000; b=4'b0000;
    #10 a=4'b1010; b=4'b0101;
    #10 a=4'b1100; b=4'b1100;
    #10 a=4'b1111; b=4'b0110;
    #10 a=4'b0110; b=4'b1101;
  end
endmodule

4BIT 2INPUT XOR GATE TESTBENCH SIMULATION

★ 다음의 부울 식으로 표현되는 회로를 Verilog로 모델링하고, 테스트벤치를 작성하여 기능을 검증한다. 

module bool_test(a,b,c,d,e,y);
    input a,b,c,d,e;
    output y;

    assign y = ~((a&b)|c|(d&e));
endmodule

▣ TESTBENCH

module tb_bool_test;
    reg a,b,c,d,e;
    wire y;

    bool_test u0(a,b,c,d,e);
    
    initial begin
        a=0;b=1;c=0;d=1;e=0;
        #20 a=1;b=0;c=1;d=0;e=1;
        #20;
    end
endmodule

BOOL TESTBENCH SIMULATION

★ 다음 표는 변형된 Booth인코딩의 진리표이며, 3비트의 입력을 받아 출력 yz, y2, neg, add를 출력한다. 진리표를 Verilog로 모델링하고, 테스트벤치를 작성하여 기능을 검증한다. 

xin[2:0] yz y2 neg add
000  0 1 0 1
001 1 0 0 0
010 1 0 0 0
011 1 1 0 0
100 1 1 1 1
101 1 0 1 1
110 1 0 1 1
111 0 1 1 1

 

// 설계과제 10.4
module booth_test(xin,yz,y2,neg,add);
    input [2:0] xin;
    output yz,y2,neg,add;

    reg [3:0] tmp ;

    assign add = tmp[0];
    assign neg = tmp[1];
    assign y2 = tmp[2];
    assign yz = tmp[3];

    always@(*)begin 
        case(xin)
            0 : tmp = 4'b0101;
            1,2 : tmp = 4'b1000;
            3 : tmp = 4'b1100;
            4 : tmp = 4'b1111;
            5,6 : tmp = 4'b1011;
            7 : tmp = 4'b0111;
        endcase
    end
endmodule

▣ TESTBENCH

// 설계과제 10.4 testbench
module tb_bool_test;
    reg [2:0] xin;
    wire yz,y2,neg,add;

    booth_test u0(xin,yz,y2,neg,add);

    integer i;
    always begin 
        xin = 0;
        for(i=1;i<9;i=i+1)begin
            #20 xin = i;
        end
    end
endmodule

TRUTH TABLE TESTBENCH SIMULATION

★ 8비트 입력 in_word[7:0] 중 1비트를 선택하여 출력 out_bit로 보내는 8:1 멀티플렉서를 case문으로 모델링하고, 시뮬레이션을 통해 검증한다. 

// 설계과제 10.5
module mux_test(sel,in_word,y);
    input [2:0] sel;
    input [7:0] in_word;
    output reg y;

    always@(*)begin 
        case(sel)
            0 : y = in_word[0];
            1 : y = in_word[1];
            2 : y = in_word[2];
            3 : y = in_word[3];
            4 : y = in_word[4];
            5 : y = in_word[5];
            6 : y = in_word[6];
            7 : y = in_word[7];
            default : y=1'bx;
        endcase
    end
endmodule

▣ TESTBENCH

// 설계과제 10.5 testbench 
module tb_mux_test;
    reg [2:0] sel;
    reg [7:0] in_word;
    wire y;
    integer i;

    mux_test u0(sel,in_word,y);

    initial begin 
        for(i=0;i<8;i=i+1)begin 
            in_word[i] = i;
        end
    end

    initial
        sel = 3'b000;
    
    always
        #20 sel = sel+1;

endmodule

8 :1 MUX TESTBENCH SIMULATION