๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐“ก๐“ธ๐“ธ๐“ถ5: ๐’ฆ๐‘œ๐“‡๐‘’๐’ถ ๐’ฐ๐“ƒ๐’พ๐“‹/๋…ผ๋ฆฌ์„ค๊ณ„ Digital Design(COSE221)

[๋…ผ๋ฆฌ์„ค๊ณ„] Verilog-HDL ์„ค๊ณ„

1. ๊ธฐ๋ณธ

 1) Module

 - top module

 - ํ•˜์œ„ module

 - test module

modul module_name(port_list);
	port ์„ ์–ธ
    reg ์„ ์–ธ
    wire ์„ ์–ธ
    parameter ์„ ์–ธ
    
    gate modeling
    data flow modeling
    behavioral modeling
    structural modeling
    ํ•˜์œ„๋ชจ๋“ˆ ํ˜ธ์ถœ
endmodule

 - Verilog HDL๋กœ ํ‘œํ˜„๋˜๋Š” ๋…ผ๋ฆฌํšŒ๋กœ๋Š” "module~endmodule" ์•ˆ์— ์žˆ์–ด์•ผ ํ•จ

 - ๋ชจ๋“  ๋ฌธ์žฅ์€ ; ๋กœ ๋๋‚˜๊ณ , "end~"๋กœ ์‹œ์ž‘ํ•˜๋Š” ์˜ˆ์•ฝ์–ด์—๋Š” ; ์—†์Œ

 - ์ด๋ฆ„ ๋˜๋Š” ์‹๋ณ„์ž๋Š” ์†Œ๋ฌธ์ž์™€ ๋Œ€๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„

 - ์˜ˆ์•ฝ์–ด๋Š” ๋ฐ˜๋“œ์‹œ ์†Œ๋ฌธ์ž์ž„

 - module ์ด๋ฆ„์€ ์˜๋ฌธ์ž์™€ ์–ธ๋”๋ฐ”๋กœ ์‹œ์ž‘ ๊ฐ€๋Šฅ

 - ์ฃผ์„์€ // ๋˜๋Š” /* */

 

 2) Port 

 : port ๋ฐฉํ–ฅ [n-1:0] ์ด๋ฆ„

 

 -input, output, inout

 -input[7:0] ina, inb // 8bit์งœ๋ฆฌ

 

 3) Data types

  - Net data type : ํ•˜๋“œ์›จ์–ด ์„ 

    :wire (wire[15:0] mult // 16bit) , tri, supply0, supply1

 

  - Variable Data type : ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ

  - reg : always ๋ฌธ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง€๋Š” ์‹ ํ˜ธ, ๊ฐ’์„ ๊ธฐ์–ตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ณ€์ˆ˜์™€ ์œ ์‚ฌํ•œ ์—ญํ• 

  - integer : signed 32-bit variable

 

 4) ์ง€์›ํ•˜๋Š” ์‹ ํ˜ธ : 1, 0, Z(High-impedance), X(Unknown value)

 5) ๋ฒกํ„ฐ์ƒ์ˆ˜ ํ‘œํ˜„๋ฐฉ๋ฒ• [์‹ ํ˜ธ์˜ ๊ธธ์ด]['][์ง„์ˆ˜][์‹ ํ˜ธ์˜ ๊ฐ’]

  : h(16์ง„์ˆ˜), o(8์ง„์ˆ˜), d(10์ง„์ˆ˜), b(2์ง„์ˆ˜), sh(signed 16์ง„์ˆ˜) ...

 

  - 4'b1010 : 2์ง„์ˆ˜ 1010

  - 'ha : 16์ง„์ˆ˜ a

 

 6) parameter 

  - ์ƒ์ˆ˜ ์ •์˜ 

   : parameter [๋ฒ”์œ„] ์ด๋ฆ„ = ์‹;

  ex) parameter size = 8; 

 

 

 7) Instance : ๋‹ค๋ฅธ module์ด๋‚˜ gate primitive๋ฅผ ์–ด๋–ค module์—์„œ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ instance๋ผ๊ณ  ํ•จ

     

   - Port ์ด๋ฆ„์— ์˜ํ•œ ์—ฐ๊ฒฐ : ์ƒํ•˜์œ„ ๊ณ„์ธต ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผ ํ•จ.

   - Port list ์ˆœ์„œ์— ์˜ํ•œ ์—ฐ๊ฒฐ  : positional mapping(๊ธฐ์ˆ  ์ˆœ์„œ๋Œ€๋กœ mapping)

//OR Gate
module or2(a, b, o);
  input a, b;
  output o;

endmodule
//Half Adder
module hadder(x, y, s, c);
  input x, y;
  output s, c;
  
endmodule;
module full_adder(fco, fsum, cin, a, b);
  output fco, fsum;
  imput cin, a, b;
  
  wire c1, s1, c2;
  
  half_adder u1(c1, s1, a, b); 
  half_adder u2(.a(s1), .b(cin), sum(fsum), .co(c2); //๋‘˜ ๋‹ค ํฌํŠธ ์ˆœ์„œ ์ค‘์š”. ๋‘˜ ๋‹ค ๊ฐ€๋Šฅ
  or u3(fco, c1, c2);
  
endmodule

 

 

2. Gate Level Modeling 

 : Gate ์›์‹œ ํ•จ์ˆ˜ ์ œ๊ณต

//And Gate
module and2(a, b, o);
  input a, b;
  output o;
  
  //1. GateLevel M
  and and2(o,a,b); // ์ˆœ์„œ ์ค‘์š”!! ์ถœ๋ ฅ, ์ž…๋ ฅ, ์ž…๋ ฅ์ž„
  
endmodule

 

 

3. Register Transfer Lever (RTL)

 : assign ๋ฌธ์œผ๋กœ ์‹ ํ˜ธ ์—ฐ๊ฒฐ

//Half Adder
module hadder(x, y, s, c);
  input x, y;
  output s, c;
  
  assign c = x&y;
  assign s = x ^ y;
endmodule;

 - ์™ผ์ชฝ์—๋Š” ์ถœ๋ ฅํ•˜๋Š” ๋ฒกํ„ฐ๋‚˜ ๊ฒฐํ•ฉ๋ฒกํ„ฐ (์ถœ๋ ฅ , wire(net))

 - ์˜ค๋ฅธ์ชฝ์—๋Š” ๋ ˆ์ง€์Šคํ„ฐ, ๋„ท, ํ•จ์ˆ˜ํ˜ธ์ถœ ๋“ฑ ์ถœ๋ ฅ ๋นผ๊ณ  ์ „๋ถ€ ๊ฐ€๋Šฅ 

 - ์˜ค๋ฅธ์ชฝ ๊ฐ’์ด ๋ณ€ํ•˜๋ฉด ์™ผ์ชฝ๊ฐ’๋„ ๋ฐ”๋กœ ๋ณ€ํ•จ

//And Gate
module and2(a, b, o);
  input a, b;
  output o;
  
  //1. GateLevel M
  and and2(o,a,b); // ์ˆœ์„œ ์ค‘์š”!! ์ถœ๋ ฅ, ์ž…๋ ฅ, ์ž…๋ ฅ์ž„
  
  //2. RTL M
  assign o = a&b;
  
endmodule

 

4. Behavioral Modeling

 : ๊ฐ€์žฅ ๋†’์€ ์ถ”์ƒํ™” ๋‹จ๊ณ„์˜ ํ•˜๋“œ์›จ์–ด ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ•

  - initial, always@, if-else, case, ๋ฐ˜๋ณต๋ฌธ

 

  1) initial ๋ฌธ

    - verilog HDL์€ ๋ชจ๋“  ๊ตฌ๋ฌธ์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋จ

    - initial๋ฌธ์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์ž‘๊ณผ ํ•จ๊ป˜ ์‹œ์ž‘ํ•˜์—ฌ ๋”ฑ ํ•œ ๋ฒˆ ์ˆ˜ํ–‰๋œ๋‹ค

    - ๊ฐ ๋ธ”๋Ÿญ๋“ค์€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ๋™์‹œ์— ์‹œ์ž‘ํ•œ๋‹ค

    - ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •์‹œ, ๊ทธ๋ฆฌ๊ณ  testbench์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

    - ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋™์ž‘์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, ์‹œ์ž‘๊ณผ ๋์— begin๊ณผ end๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    - initial ์—์„œ ํ• ๋‹น๋˜๋Š” ์‹ ํ˜ธ๋Š” reg๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

`timescale 1ns/ 1ps // 1000์œผ๋กœ ์ชผ๊ฐœ์ž
module test1;
  reg x, y, a, b, m;
  initial m= 1'b0;
  initial 
  	begin
    	#5 a=1'b1;//5ns
        #25 b=1'bo; //30ns
    end
  initial 
  	begin
    	#10 x=1'b0; //10ns
        #25 y=1'b1; //35ns
    end
  initial #50 $finish //50ns
endmodule

 

  2) always๋ฌธ

 

always@(์ด๋ฒคํŠธ)
  begin
     ๋™์ž‘
  end
  

  - always๋ฌธ ๋ธ”๋ก์—๋Š” ๋ฐ˜๋“œ์‹œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

  - always๋ฌธ ๋‚ด์—์„œ ํ• ๋‹น๋˜๋Š” ์‹ ํ˜ธ๋“ค์€ reg๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

  - always ๊ตฌ๋ฌธ์ด ์—ฌ๋Ÿฌ๊ฐœ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ฐ๊ฐ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด์•ผํ•จ. ๋‹ค๋ฅธ always์—์„œ ๊ฐ™์€ ๊ฒƒ ๊ฑด๋“œ๋ฆฌ๋ฉด ์•ˆ๋จ

  - ์ด๋ฒคํŠธ ์‹œ๊ทธ๋„์ด ๋ณ€ํ•˜๋ฉด ๋™์ž‘ํ•จ

  - ์กฐํ•ฉํšŒ๋กœ์—์„œ ๊ณต๊ธ‰๋˜๋Š” ๋ชจ๋“  ์‹ ํ˜ธ๋“ค์€ @event signal์— ์กด์žฌํ•ด์•ผ ํ•จ

  - ์กฐํ•ฉํšŒ๋กœ์—์„œ always๋ฌธ ์•ˆ์—์„œ๋Š” non-blocking ๋Œ€์ž…๋ฌธ(<=)์„ ์‚ฌ์šฉ.

 

//4bit ๊ฐ€์‚ฐ๊ธฐ

module ADD_4bit(out, in1, in2);
   input[3:0] in1, in2;
   output[4:0] out;
   
   reg[4:0] out;
   
   always@(in1, in2)
    begin
       out = in1 + in2
    end
 endmodule

  - ๋งŒ์•ฝ behavior modeling์‹œ ์กฐ๊ฑด์ด ์—†์œผ๋ฉด ๋ฌดํ•œ๋ฃจํ”„์ž„

module clock_test;
  reg clock;
  
  initial clock = 1'b0;
  always #10 clock = ~clock;
  initial #50 $finish;
  
endmodule

 - blocking ๋ฌธ : ๋ธ”๋ก ๋‚ด์—์„œ ์ˆœ์ฐจ์ ์ธ ์ง„ํ–‰, ํ•˜๋‚˜์˜ ๋Œ€์ž…์ด ๋๋‚˜๊ณ  ๋‚˜์„œ ๋‹ค์Œ ๋Œ€์ž…์„ ํ•œ๋‹ค. ์กฐํ•ฉํšŒ๋กœ์— ์ ํ•ฉ

 - nonblocking ๋ฌธ : ๋ณ‘๋ ฌ์ ์ธ ์ง„ํ–‰, ์˜ค๋ฅธ์ชฝ ์ฒ˜๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ๋๋‚˜๊ณ  ๋‚˜๋ฉด ์ผ์ œํžˆ ์™ผ์ชฝ์— ๋Œ€์ž…, ์ˆœ์ฐจํšŒ๋กœ์— ์ ํ•ฉ

 

 3) if ๋ฌธ

  : if(์กฐ๊ฑด) ๋ฌธ์žฅ;

  

   if(์กฐ๊ฑด) ๋ฌธ์žฅ;

   else if (์กฐ๊ฑด) ๋ฌธ์žฅ;

   else ๋ฌธ์žฅ;

 

   if(์กฐ๊ฑด)

    begin

       ๋ฌธ์žฅ1;

       ๋ฌธ์žฅ2;

    end

 

..

 

  4) case ๋ฌธ

 

  case(์ˆ˜์‹)

   ์กฐ๊ฑด1:

     begin

       ๋ฌธ์žฅ1;

       ๋ฌธ์žฅ2;

      end

    ์กฐ๊ฑด2:

       ๋ฌธ์žฅ;

    default: ๋ฌธ์žฅ;

  endcase;

//And Gate
module and2(a, b, o);
  input a, b;
  output o;
  
  //1. GateLevel M
  and and2(o,a,b); // ์ˆœ์„œ ์ค‘์š”!! ์ถœ๋ ฅ, ์ž…๋ ฅ, ์ž…๋ ฅ์ž„
  
  //2. RTL M
  assign o = a&b;
  
  //3. Behavioral M
  always@(a or b)
  begin
    if(a==1'b1 && b==1'b1)
      o = 1'b1;
    else
      o = 1'b0;
    end
    
endmodule

 

  5) Function ๋ฌธ

   : ๋„คํŠธ = function ์ด๋ฆ„ (์ธ์ˆ˜ ์ด๋ฆ„, ..., ์ธ์ˆ˜์ด๋ฆ„) ์œผ๋กœ ํ˜ธ์ถœ

 

 

 

5. Test Bench : Verilog-HDL์„ ์„ค๊ณ„ํ•œ ํšŒ๋กœ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ Simulation Pattern์„ ์„œ์ˆ ํ•˜๋Š” ๋ฌธ์žฅ

 : $stop (์ผ์‹œ์ •์ง€), $finish(์™„์ „ ์ข…๋ฃŒ), $monitor, $strobe, time