03 Basic Concepts
๐Ÿ”ฎ

03 Basic Concepts

Description
Date
Sep 18, 2023
URL
์ƒํƒœ
Done
Tags
Digital Design

์–ดํœ˜ ๊ด€๋ก€

๊ณต๋ฐฑ

  • ๊ณต๋ฐฑ (\b), ํƒญ (\t), ์ค„ ๋ฐ”๊ฟˆ (\n)์œผ๋กœ ๊ณต๋ฐฑ์ด ๊ตฌ์„ฑ๋จ
  • Verilog์—์„œ ํ† ํฐ์„ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ž์—ด ์•ˆ์— ์žˆ์„ ๋•Œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ฌด์‹œ๋จ
  • ์ฃผ์„
    • ํ•œ ์ค„ ์ฃผ์„์€ โ€œ//โ€๋กœ ์‹œ์ž‘ํ•จ
    • ์—ฌ๋Ÿฌ ์ค„ ์ฃผ์„์€ โ€œ/*โ€๋กœ ์‹œ์ž‘ํ•˜์—ฌ โ€œ*/โ€๋กœ ๋๋‚จ
      • a = b && c; // ์ด๊ฒƒ์€ ํ•œ ์ค„ ์ฃผ์„์ž„ /* ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์นœ ์ฃผ์„์ž„ */ /* ์ด๊ฒƒ์€ /* ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” */ ์ฃผ์„์ž„ */ /* ์ด๊ฒƒ์€ //ํ—ˆ์šฉ๋˜๋Š” ์ฃผ์„์ž„ */
ย 

์—ฐ์‚ฐ์ž

  • ๋‹จํ•ญ, ์ดํ•ญ, ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Œ
    • a = ~b; // ~๋Š” ๋‹จํ•ญ ์—ฐ์‚ฐ์ž์ž„. b๋Š” ํ”ผ์—ฐ์‚ฐ์ž a = b && c; // &&๋Š” ์ดํ•ญ ์—ฐ์‚ฐ์ž์ž„. b์™€ c๋Š” ํ”ผ์—ฐ์‚ฐ์ž a = b ? c : d; // ?:๋Š” ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์ž„. b, c, d๋Š” ํ”ผ์—ฐ์‚ฐ์ž
ย 

์ˆซ์ž ํ‘œ๊ธฐ๋ฒ•

  • ํฌ๊ธฐ๊ฐ€ ์žˆ๋Š” ์ˆซ์ž: <ํฌ๊ธฐ>โ€™<๊ธฐ์ˆ˜ ํ˜•์‹><์ˆซ์ž> (โ€™d/โ€™D, โ€™h/โ€™H โ€™b/B โ€™o/โ€™O)
    • 4'b1111 // 4๋น„ํŠธ ์ด์ง„์ˆ˜ 12'habc // 12๋น„ํŠธ 16์ง„์ˆ˜ 16'd255 // 16๋น„ํŠธ 10์ง„์ˆ˜
  • ํฌ๊ธฐ๊ฐ€ ์—†๋Š” ์ˆซ์ž: <ํฌ๊ธฐ>๊ฐ€ ์—†์œผ๋ฉฐ 10์ง„์ˆ˜์˜ ๊ฒฝ์šฐ <๊ธฐ์ˆ˜ ํ˜•์‹>์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ
    • 23456 // 32๋น„ํŠธ 10์ง„์ˆ˜ (๊ธฐ๋ณธ๊ฐ’) 'hc3 // 32๋น„ํŠธ 16์ง„์ˆ˜ 'o21 // 32๋น„ํŠธ 8์ง„์ˆ˜
  • X ๋˜๋Š” Z ๊ฐ’: X๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’, Z๋Š” ํ•˜์ด ์ž„ํ”ผ๋˜์Šค ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ„
    • 12'h13x // 12๋น„ํŠธ 16์ง„์ˆ˜์ด๋ฉฐ, 4๊ฐœ์˜ ๊ฐ€์žฅ ํ•˜์œ„ ๋น„ํŠธ๋Š” ์•Œ ์ˆ˜ ์—†์Œ 6'hx // 6๋น„ํŠธ 16์ง„์ˆ˜ 32'bz // 32๋น„ํŠธ ํ•˜์ด ์ž„ํ”ผ๋˜์Šค(high impedance) ์ˆซ์ž
  • ์Œ์ˆ˜
    • -6'd3 // 3์˜ 2์˜ ๋ณด์ˆ˜๋กœ ์ €์žฅ๋œ 6๋น„ํŠธ ์Œ์ˆ˜ -6'sd3 // ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ 4'd-2 // ์ž˜๋ชป๋œ ๋ช…์„ธ
  • ๋ฐ‘์ค„๊ณผ ๋ฌผ์Œํ‘œ: ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ
    • 12'b1111_0000_1010 // ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ๋ฐ‘์ค„ ๋ฌธ์ž ์‚ฌ์šฉ 4'b10?? // 4'b10zz์™€ ๋™์ผํ•จ
ย 

๋ฌธ์ž์—ด

  • ๋ฌธ์ž์—ด์€ ์Œ๋”ฐ์˜ดํ‘œ (โ€œโ€)๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋ฌธ์ž์˜ ๋‚˜์—ด์ž„
  • ๋ฌธ์ž์—ด์€ ํ•œ ์ค„์— ํฌํ•จ๋˜์–ด์•ผ ํ•จ
    • "Hello Verilog World" // ๋ฌธ์ž์—ด "a / b" // ๋ฌธ์ž์—ด
ย 

์‹๋ณ„์ž์™€ ํ‚ค์›Œ๋“œ

  • ํ‚ค์›Œ๋“œ๋Š” ์–ธ์–ด ๊ตฌ์„ฑ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์•ฝ๋œ ํŠน๋ณ„ํ•œ ์‹๋ณ„์ž์ž„
  • ์‹๋ณ„์ž๋Š” ๋””์ž์ธ ๋‚ด์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ์ฒด์— ์ฃผ์–ด์ง„ ์ด๋ฆ„์ž„
    • ์˜์ˆซ์ž, ๋ฐ‘์ค„ (_), ๋˜๋Š” ๋‹ฌ๋Ÿฌ ๊ธฐํ˜ธ ($)๋กœ ๊ตฌ์„ฑ๋จ
    • ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•จ
      • reg value; // reg๋Š” ํ‚ค์›Œ๋“œ, value๋Š” ์‹๋ณ„์ž input clk; // input์€ ํ‚ค์›Œ๋“œ, clk๋Š” ์‹๋ณ„์ž
ย 

๋ฐ์ดํ„ฐ ํƒ€์ž…

๊ฐ’ ์ง‘ํ•ฉ

notion image
ย 

์ŠคํŠธ๋ ์Šค ๋ ˆ๋ฒจ

  • ๋””์ง€ํ„ธ ํšŒ๋กœ์—์„œ ๋‹ค๋ฅธ ๊ฐ•๋„์˜ ๋“œ๋ผ์ด๋ฒ„ ๊ฐ„์˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ
  • ๊ฐ’ ๋ ˆ๋ฒจ 0๊ณผ 1์€ ์ŠคํŠธ๋ ์Šค ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ (์˜ˆ: supply0, supply1)
    • notion image
ย 

Nets

  • Nets๋Š” ํ•˜๋“œ์›จ์–ด ์š”์†Œ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋ƒ„
  • Nets๋Š” ์ฃผ๋กœ wire ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋จ
    • notion image
      wire a; // ์œ„์˜ ํšŒ๋กœ๋ฅผ ์œ„ํ•ด wire a๋ฅผ ์„ ์–ธ wire b, c; // ์œ„์˜ ํšŒ๋กœ๋ฅผ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ wire b, c๋ฅผ ์„ ์–ธ wire d = 1'b0; // wire d๋Š” ์„ ์–ธ ์‹œ ๋…ผ๋ฆฌ ๊ฐ’ 0์œผ๋กœ ๊ณ ์ •
ย 

๋ ˆ์ง€์Šคํ„ฐ

  • ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๊ฐ’์„ ์œ ์ง€
  • ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์ฃผ๋กœ reg ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋จ
  • Verilog์˜ ๋ ˆ์ง€์Šคํ„ฐ ์šฉ์–ด์™€ ํ•˜๋“œ์›จ์–ด ๋ ˆ์ง€์Šคํ„ฐ (FFs)๋ฅผ ํ˜ผ๋™ํ•˜๋ฉด ์•ˆ๋จ
    • reg reset; // reset๋ผ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•จ initial // ์ด ๊ตฌ์กฐ๋Š” ๋‚˜์ค‘์— ๋…ผ์˜๋  ์˜ˆ์ • begin reset = 1'b1; // reset์„ 1๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋””์ง€ํ„ธ ํšŒ๋กœ๋ฅผ ๋ฆฌ์…‹ํ•จ #100 reset = 1'b0; // 100 ์‹œ๊ฐ„ ๋‹จ์œ„ ํ›„์— reset์€ ํ•ด์ œ๋จ end
  • ๋ถ€ํ˜ธ ๋ ˆ์ง€์Šคํ„ฐ
    • reg signed [63:0] m; // 64๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ๊ฐ’ integer i; // 32๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ๊ฐ’
ย 

๋ฒกํ„ฐ

  • Nets ๋˜๋Š” reg ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ฒกํ„ฐ๋กœ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Œ (๋‹ค์ค‘ ๋น„ํŠธ ๋„ˆ๋น„)
  • ๋ฒกํ„ฐ๋Š” [high#:low#] ๋˜๋Š” [low#:high#]๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์™ผ์ชฝ ๋ฒˆํ˜ธ๋Š” ํ•ญ์ƒ ๋ฒกํ„ฐ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋น„ํŠธ (MSB)์ž„
    • wire a; // ์Šค์นผ๋ผ net ๋ณ€์ˆ˜, ๊ธฐ๋ณธ๊ฐ’ wire [7:0] bus; // 8๋น„ํŠธ ๋ฒ„์Šค wire [31:0] busA, busB, busC; // 32๋น„ํŠธ ๋„ˆ๋น„์˜ 3๊ฐœ์˜ ๋ฒ„์Šค reg clock; // ์Šค์นผ๋ผ ๋ ˆ์ง€์Šคํ„ฐ, ๊ธฐ๋ณธ๊ฐ’ reg [0:40] virtual_addr; // ๋ฒกํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ, ๊ฐ€์ƒ ์ฃผ์†Œ๋Š” 41๋น„ํŠธ ๋„ˆ๋น„
  • ๋ฒกํ„ฐ ๋ถ€๋ถ„ ์„ ํƒ
    • busA[7] // ๋ฒกํ„ฐ busA์˜ 7๋ฒˆ์งธ ๋น„ํŠธ bus[2:0] // ๋ฒกํ„ฐ bus์˜ ๊ฐ€์žฅ ํ•˜์œ„ 3๋น„ํŠธ // bus[0:2] ์‚ฌ์šฉ์€ ๋ถˆ๊ฐ€๋Šฅํ•จ // ๋ฒ”์œ„ ์ง€์ • ์‹œ ๊ฐ€์žฅ ์ƒ์œ„ ๋น„ํŠธ๋Š” ํ•ญ์ƒ ์™ผ์ชฝ์— ์žˆ์–ด์•ผ ํ•จ virtual_addr[0:1] // ๋ฒกํ„ฐ virtual_addr์˜ ๊ฐ€์žฅ ์ƒ์œ„ 2๋น„ํŠธ
  • ๊ฐ€๋ณ€ ๋ฒกํ„ฐ ๋ถ€๋ถ„ ์„ ํƒ
    • [<starting_bit>+:width] โ†’ starting bit๋ถ€ํ„ฐ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์„ ํƒ
    • [<starting_bit>-:width] โ†’ starting bit๋ถ€ํ„ฐ ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์„ ํƒ
      • reg [255:0] datal; // ๋ฆฌํ‹€ ์—”๋””์–ธ ํ‘œ๊ธฐ๋ฒ• reg [0:255] data2; // ๋น… ์—”๋””์–ธ ํ‘œ๊ธฐ๋ฒ• reg [7:0] byte; // ๊ฐ€๋ณ€ ํŒŒํŠธ ์„ ํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ถ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ byte = datal[31-:8]; // ์‹œ์ž‘ ๋น„ํŠธ = 31, ๋„ˆ๋น„ = 8 => data[31:24] byte = datal[24+:8]; // ์‹œ์ž‘ ๋น„ํŠธ = 24, ๋„ˆ๋น„ = 8 => data[31:24] byte = data2[31-:8]; // ์‹œ์ž‘ ๋น„ํŠธ = 31, ๋„ˆ๋น„ = 8 => data[24:31] byte = data2[24+:8]; // ์‹œ์ž‘ ๋น„ํŠธ = 24, ๋„ˆ๋น„ = 8 => data[24:31] // ์‹œ์ž‘ ๋น„ํŠธ๋„ ๋ณ€์ˆ˜์ผ ์ˆ˜ ์žˆ์Œ. ๋„ˆ๋น„๋Š” ์ƒ์ˆ˜์—ฌ์•ผ ํ•จ // ๋”ฐ๋ผ์„œ ๋ฃจํ”„ ๋‚ด์—์„œ ๋ณ€์ˆ˜ ํŒŒํŠธ ์„ ํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒกํ„ฐ์˜ ๋ชจ๋“  ๋ฐ”์ดํŠธ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ for (i=0; i<=31; i=i+1) byte = datal[(i*8)+:8]; // ์ˆœ์„œ๋Š” [7:0], [15:8]... [255:248]์ž„ // ๋ฒกํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ datal[(byteNum*8)+:8] = 8'b0; // byteNum = 1์ผ ๊ฒฝ์šฐ, 8๋น„ํŠธ [15:8]๋ฅผ ํด๋ฆฌ์–ดํ•จ
ย 

์ •์ˆ˜

  • ์ •์ˆ˜๋Š” ์–‘์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ๋ชฉ์ ์˜ ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ฉฐ ํ‚ค์›Œ๋“œ integer๋กœ ์„ ์–ธ๋จ
    • integer counter; // ์นด์šดํ„ฐ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜ ๋ชฉ์ ์˜ ๋ณ€์ˆ˜ initial counter = -1; // ์นด์šดํ„ฐ์— ์Œ์˜ ๊ฐ’ 1์ด ์ €์žฅ
ย 

์‹ค์ˆ˜

  • ์‹ค์ œ ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ real ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋จ
    • real delta; // delta๋ผ๋Š” ์‹ค์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ initial begin delta = 4.10e0; // delta์— ๊ณผํ•™์  ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๊ฐ’์„ ํ• ๋‹น delta = 2.13; // delta์— 2.13์ด๋ผ๋Š” ๊ฐ’์„ ํ• ๋‹น end integer i; // i๋ผ๋Š” ์ •์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ initial i = delta; // i๋Š” 2.13์˜ ๋ฐ˜์˜ฌ๋ฆผ๋œ ๊ฐ’์ธ 2๋ฅผ ์–ป์Œ
ย 

์‹œ๊ฐ„

  • ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ ํ‚ค์›Œ๋“œ time์œผ๋กœ ์„ ์–ธ๋จ
    • time save_sim_time; // ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์„ ์ €์žฅํ•  time ๋ณ€์ˆ˜๋ฅผ ์ •์˜ initial save_sim_time = $time; // ํ˜„์žฌ์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์„ ์ €์žฅ
ย 

๋ฐฐ์—ด

  • reg, integer, time, real ๋ฐ ๋ฒกํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฐฐ์—ด์ด ํ—ˆ์šฉ๋จ
  • ์—ฌ๋Ÿฌ ์ฐจ์›์˜ ๋ฐฐ์—ด์€ ์–ด๋–ค ์ฐจ์› ์ˆ˜๋กœ๋„ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Œ
    • integer count [0:7]; // 8๊ฐœ์˜ count ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๋ฐฐ์—ด reg bool [31:0]; // 32๊ฐœ์˜ 1๋น„ํŠธ boolean ๋ ˆ์ง€์Šคํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๋ฐฐ์—ด time chk_point[1:100]; // 100๊ฐœ์˜ time ์ฒดํฌํฌ์ธํŠธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๋ฐฐ์—ด reg [4:0] port_id[0:7]; // ๊ฐ ํฌํŠธ ์•„์ด๋””๊ฐ€ 5๋น„ํŠธ ๋„ˆ๋น„๋ฅผ ๊ฐ–๋Š” 8๊ฐœ์˜ ํฌํŠธ ์•„์ด๋”” ๋ฐฐ์—ด integer matrix [4:0][0:255]; // ์ •์ˆ˜ํ˜• 2์ฐจ์› ๋ฐฐ์—ด reg [63:0] array_4d [15:0][7:0][7:0][255:0]; // 4์ฐจ์› ๋ฐฐ์—ด wire [7:0] w_array2 [5:0]; // 8๋น„ํŠธ ๋ฒกํ„ฐ ์™€์ด์–ด์˜ ๋ฐฐ์—ด ์„ ์–ธ wire w_array1[7:0][5:0]; // ๋‹จ์ผ ๋น„ํŠธ ์™€์ด์–ด์˜ ๋ฐฐ์—ด ์„ ์–ธ
  • ํ• ๋‹น
    • count[5] = 0; // count ๋ณ€์ˆ˜ ๋ฐฐ์—ด์˜ 5๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ดˆ๊ธฐํ™” chk_point[100] = 0; // 100๋ฒˆ์งธ time ์ฒดํฌํฌ์ธํŠธ ๊ฐ’์„ ์ดˆ๊ธฐํ™” port_id[3] = 0; // port id ๋ฐฐ์—ด์˜ 3๋ฒˆ์งธ ์š”์†Œ(5๋น„ํŠธ ๊ฐ’)๋ฅผ ์ดˆ๊ธฐํ™” matrix[1][0] = 33559; // [1][0]์— ์˜ํ•ด ์ธ๋ฑ์‹ฑ๋œ ์š”์†Œ์˜ ๊ฐ’์„ 33559๋กœ ์„ค์ • array_4d[0][0][0][0][15:0] = 0; // ์ธ๋ฑ์Šค [0][0][0][0]๋กœ ์ ‘๊ทผ๋˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ์˜ 15:0 ๋น„ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”
ย 

๋ฉ”๋ชจ๋ฆฌ

  • ๋ฉ”๋ชจ๋ฆฌ๋Š” Verilog์—์„œ ๋ ˆ์ง€์Šคํ„ฐ์˜ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ชจ๋ธ๋ง๋จ
    • reg mem1bit [0:1023]; // 1K ํฌ๊ธฐ์˜ 1๋น„ํŠธ ์›Œ๋“œ๋ฅผ ๊ฐ–๋Š” ๋ฉ”๋ชจ๋ฆฌ mem1bit reg [7:0] membyte[0:1023]; // 1K ํฌ๊ธฐ์˜ 8๋น„ํŠธ ์›Œ๋“œ(๋ฐ”์ดํŠธ)๋ฅผ ๊ฐ–๋Š” ๋ฉ”๋ชจ๋ฆฌ membyte membyte [511] // ์ฃผ์†Œ๊ฐ€ 511์ธ 1๋ฐ”์ดํŠธ ์›Œ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ด
ย 

๋งค๊ฐœ๋ณ€์ˆ˜

  • Verilog๋Š” ๋ชจ๋“ˆ ๋‚ด์—์„œ parameter ํ‚ค์›Œ๋“œ๋กœ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์Œ
    • parameter port_id = 5; // ์ƒ์ˆ˜ port id๋ฅผ ์ •์˜ํ•จ parameter cache_line_width = 256; // ์บ์‹œ์˜ ๋„ˆ๋น„๋ฅผ ์ •์˜ํ•˜๋Š” ์ƒ์ˆ˜ parameter signed [15:0] WIDTH; // ๋งค๊ฐœ๋ณ€์ˆ˜ WIDTH์— ๋Œ€ํ•œ ๊ณ ์ •๋œ ๋ถ€ํ˜ธ ๋ฐ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•จ
  • ๋กœ์ปฌ ๋งค๊ฐœ ๋ณ€์ˆ˜ (ํ‚ค์›Œ๋“œ: localparam)๋Š” ๊ทธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด์„œ๋Š” ์•ˆ๋  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ (์˜ˆ: ์ƒํƒœ ์ธ์ฝ”๋”ฉ).
    • localparam state1 = 4'b0001, // state1์€ 4๋น„ํŠธ ๊ฐ’์œผ๋กœ 0001์„ ๊ฐ€์ง state2 = 4'b0010, // state2๋Š” 4๋น„ํŠธ ๊ฐ’์œผ๋กœ 0010์„ ๊ฐ€์ง state3 = 4'b0100, // state3๋Š” 4๋น„ํŠธ ๊ฐ’์œผ๋กœ 0100์„ ๊ฐ€์ง state4 = 4'b1000; // state4๋Š” 4๋น„ํŠธ ๊ฐ’์œผ๋กœ 1000์„ ๊ฐ€์ง
ย 

๋ฌธ์ž์—ด

  • ๋ฌธ์ž์—ด์€ reg์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Œ
  • ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋„ˆ๋น„๋Š” ๋ฌธ์ž์—ด์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  • ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋Š” 8๋น„ํŠธ (1 byte)๋ฅผ ์ฐจ์ง€ํ•จ
    • reg [8*18:1] string value; // 18๋ฐ”์ดํŠธ ๋„ˆ๋น„์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•จ initial string value = "Hello Verilog World"; // ๋ฌธ์ž์—ด์€ ๋ณ€์ˆ˜์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Œ
  • ํŠน์ˆ˜ ๋ฌธ์ž
    • notion image
ย 

์‹œ์Šคํ…œ ํƒœ์Šคํฌ

$

  • Verilog๋Š” ์ผ์ •ํ•œ ๋ฃจํ‹ด ์ž‘์—…์„ ์œ„ํ•œ ํ‘œ์ค€ ์‹œ์Šคํ…œ ํƒœ์Šคํฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์ด๋Š” $<keyword> ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋ƒ„
ย 

์ •๋ณด ํ‘œ์‹œ

  • $display๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํ‘œ์‹œํ•˜๋Š” ์ฃผ์š” ์‹œ์Šคํ…œ ํƒœ์Šคํฌ
  • ์‚ฌ์šฉ๋ฒ•: $display(p1, p2, p3, ..., pn) ์—ฌ๊ธฐ์„œ p1 ~ pn์€ ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Œ
  • C ์–ธ์–ด์˜ printf์™€ ๋งค์šฐ ์œ ์‚ฌํ•จ
  • $display๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ž์—ด์˜ ๋์— ์ค„ ๋ฐ”๊ฟˆ์„ ์‚ฝ์ž…ํ•จ
  • ๋ฌธ์ž์—ด ํฌ๋งท ์ง€์ •
    • notion image
ย 
  • $displayํƒœ์Šคํฌ
    • // ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ๋ฌธ์ž์—ด ํ‘œ์‹œ $display("Hello Verilog World"); -- Hello Verilog World // ํ˜„์žฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„ 230์˜ ๊ฐ’ ํ‘œ์‹œ $display($time); -- 230 // ์‹œ๊ฐ„ 200์—์„œ์˜ 41๋น„ํŠธ ๊ฐ€์ƒ ์ฃผ์†Œ 1fe0000001c ๊ฐ’ ํ‘œ์‹œ reg [0:40] virtual_addr; $display("At time %d virtual address is %h", $time, virtual_addr); -- At time 200 virtual address is 1fe0000001c // 2์ง„์ˆ˜๋กœ ํฌํŠธ ์•„์ด๋”” 5์˜ ๊ฐ’ ํ‘œ์‹œ reg [4:0] port_id; $display("ID of the port is %b", port_id); -- ID of the port is 00101 // ร— ๋ฌธ์ž ํ‘œ์‹œํ•˜๊ธฐ // 2์ง„์ˆ˜๋กœ 4๋น„ํŠธ ๋ฒ„์Šค 10xx (์‹ ํ˜ธ ์ถฉ๋Œ) ๊ฐ’ ํ‘œ์‹œ reg [3:0] bus; $display("Bus value is %b", bus); -- Bus value is 10xx // ๊ฐ€์žฅ ์ƒ์œ„ ๋ชจ๋“ˆ์ธ top ์•„๋ž˜์— ์ธ์Šคํ„ด์Šคํ™”๋œ p1์˜ ๊ณ„์ธต์  ์ด๋ฆ„ ํ‘œ์‹œ // ์ธ์ˆ˜๊ฐ€ ํ•„์š”์—†์Œ. ์œ ์šฉํ•œ ๊ธฐ๋Šฅ $display("This string is displayed from %m level of hierarchy"); -- This string is displayed from top.p1 level of hierarchy
      // ํŠน์ˆ˜ ๋ฌธ์ž, ์ค„ ๋ฐ”๊ฟˆ ๋ฐ % ํ‘œ์‹œํ•˜๊ธฐ $display ("This is a \n multiline string with a %% sign"); -- This is a -- multiline string with a % sign
ย 

์ •๋ณด ๋ชจ๋‹ˆํ„ฐ๋ง

  • Verilog๋Š” ์‹ ํ˜ธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์‹ ํ˜ธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•จ
  • ์‚ฌ์šฉ๋ฒ•: $monitor(p1, p2, ..., pn) ์—ฌ๊ธฐ์„œ p1 ~ pn์€ ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Œ
  • $monitor๋Š” ๋ณ€์ˆ˜๋‚˜ ์‹ ํ˜ธ์˜ ๊ฐ’์„ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•จ
  • $display์™€๋Š” ๋‹ฌ๋ฆฌ $monitor๋Š” ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•จ
  • $monitoron/$monitoroff๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ผœ๊ณ /๋„๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
    • // ์‹œ๊ฐ„๊ณผ ์‹ ํ˜ธ clock ๋ฐ reset์˜ ๊ฐ’์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•จ // Clock์€ ๋งค 5์‹œ๊ฐ„ ๋‹จ์œ„๋งˆ๋‹ค ํ† ๊ธ€ํ•˜๊ณ  reset์€ 10์‹œ๊ฐ„ ๋‹จ์œ„์—์„œ ํ•˜๊ฐ•ํ•จ initial begin $monitor ($time, "์‹ ํ˜ธ clock์˜ ๊ฐ’ = %b reset = %b", clock, reset); end
      -- 0 ์‹ ํ˜ธ clock์˜ ๊ฐ’ = 0 reset = 1 -- 5 ์‹ ํ˜ธ clock์˜ ๊ฐ’ = 1 reset = 1 -- 10 ์‹ ํ˜ธ clock์˜ ๊ฐ’ = 0 reset = 0
ย 

์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ค‘ ์ •์ง€ ๋ฐ ์ข…๋ฃŒ

  • $stop ํƒœ์Šคํฌ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ค‘์— ์ค‘์ง€์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋จ
  • ์‚ฌ์šฉ๋ฒ•: $stop
  • $stop ํƒœ์Šคํฌ๋Š” ์„ค๊ณ„์ž๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ผ์‹œ ์ค‘๋‹จํ•˜๊ณ  ์„ค๊ณ„์˜ ์‹ ํ˜ธ ๊ฐ’์„ ๊ฒ€์‚ฌํ•˜๋ ค ํ•  ๋•Œ ์‚ฌ์šฉ๋จ
ย 
  • $finish ํƒœ์Šคํฌ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ข…๋ฃŒํ•จ
  • ์‚ฌ์šฉ๋ฒ•: $finish
    • // 100์˜ ์‹œ๊ฐ„์— ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ •์ง€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€ํ† ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ // 1000์˜ ์‹œ๊ฐ„์— ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ข…๋ฃŒ initial // ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ์‹œ์ž‘์—์„œ (time = 0์—์„œ) ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก. ์ด ๋ธ”๋ก ๋‚ด์˜ ์ฝ”๋“œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ ํ•œ ๋ฒˆ ์‹คํ–‰๋จ begin clock = 0; // clock ์‹ ํ˜ธ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•จ reset = 1; // reset ์‹ ํ˜ธ๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•จ #100 $stop; // ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ time = 100์—์„œ ์ผ์‹œ ์ค‘์ง€ํ•จ. ๋””๋ฒ„๊น… ์ค‘์— ์‹ ํ˜ธ ๊ฐ’์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•จ #900 $finish; // time = 1000์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์™„์ „ํžˆ ์ข…๋ฃŒํ•จ. $stop๊ณผ ๋‹ฌ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์™„์ „ํžˆ ์ข…๋ฃŒํ•˜๊ณ  ๋ชจ๋“  ์ถœ๋ ฅ ํŒŒ์ผ์„ ๋‹ซ๊ณ , ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ์ž์›์„ ํ•ด์ œํ•จ end
ย 

์ปดํŒŒ์ผ ์ง€์‹œ์ž

`

๋ชจ๋“  ์ปดํŒŒ์ผ ์ง€์‹œ์ž๋Š” `<keyword>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋จ
ย 

`define

  • `define ์ง€์‹œ์ž๋Š” Verilog์—์„œ ํ…์ŠคํŠธ ๋งคํฌ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
    • // ๊ธฐ๋ณธ ์›Œ๋“œ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•˜๋Š” ํ…์ŠคํŠธ ๋งคํฌ๋กœ ์ •์˜ // ์ฝ”๋“œ ๋‚ด์—์„œ 'WORD SIZE'๋กœ ์‚ฌ์šฉ๋จ `define WORD SIZE 32 // ๋ณ„์นญ ์ •์˜. ์ฝ”๋“œ์—์„œ 's๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด $stop์œผ๋กœ ๋Œ€์ฒด๋จ `define S $stop; // ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ…์ŠคํŠธ ๋ฌธ์ž์—ด ์ •์˜ `define WORD_REG reg [31:0] // ๊ทธ๋Ÿฐ ๋‹ค์Œ 'WORD_REG'๋กœ 32๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ. 'WORD_REG reg32;
ย 

`include

  • `include ์ง€์‹œ์ž๋Š” ์ปดํŒŒ์ผ ์ค‘์— ๋‹ค๋ฅธ Verilog ํŒŒ์ผ์— ์†Œ์Šค ํŒŒ์ผ์˜ ์ „์ฒด ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ฒŒ ํ•ด์คŒ (C/C++์˜ #include์™€ ์œ ์‚ฌ)
    • // header.v ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ด // ์ด ํŒŒ์ผ์€ main verilog ํŒŒ์ผ์ธ design.V์— ์„ ์–ธ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ `include header.v ... ... <design.v ํŒŒ์ผ ๋‚ด์˜ Verilog ์ฝ”๋“œ> ... ...
ย