Home > Study > System Verilog > Day1 : System Verilog Review

Day1 : System Verilog Review
Study Language

initial vs always


๐ŸŸข initial

  • ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„ 0์— ์‹œ์ž‘๋จ
  • ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋จ
  • ๋ธ”๋ก ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰
  • ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์œผ๋ฉด ๋™์‹œ์— ๋ณ‘๋ ฌ ์‹คํ–‰
  • ์ฃผ๋กœ ํ…Œ์ŠคํŠธ๋ฒค์น˜, ์ดˆ๊ธฐํ™”, ์‹œํ€€์Šค ์ œ์–ด ๋“ฑ์— ์‚ฌ์šฉ
  • ๋‚ด๋ถ€์— #10, sqen ๊ฐ™์€ ์‹œํ€€์…œ ํ๋ฆ„ ํ‘œํ˜„ ๊ฐ€๋Šฅ (์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ „์šฉ)

โœ… ์˜ˆ: ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ค‘ ํ•œ ๋ฒˆ๋งŒ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ๋•Œ

๐Ÿ”ต always

  • ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„ 0๋ถ€ํ„ฐ ์‹œ์ž‘
  • ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์‹คํ–‰๋จ (์˜๊ตฌ ๋ฃจํ”„์ฒ˜๋Ÿผ ๋™์ž‘)
  • ํšŒ๋กœ ๋‚ด ๋™์ž‘์„ ์ง€์†์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ
  • ์„ค๊ณ„ ๋ธ”๋ก๊ณผ ํ…Œ์ŠคํŠธ๋ฒค์น˜ ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํ•˜๋“œ์›จ์–ด ํ•ฉ์„ฑ ๊ฐ€๋Šฅ (๋™๊ธฐ/์กฐํ•ฉ ํšŒ๋กœ ๊ตฌํ˜„)

โœ… ์˜ˆ: ํด๋Ÿญ ์—ฃ์ง€๋งˆ๋‹ค ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๊ฑฐ๋‚˜, ์ž…๋ ฅ ๋ณ€ํ™”์— ๋ฐ˜์‘

โœ… ์š”์•ฝ

  • initial์€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ โ†’ ์ฃผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ œ์–ด
  • always๋Š” ๊ณ„์† ๋ฐ˜๋ณต ์‹คํ–‰ โ†’ ์ฃผ๋กœ ํšŒ๋กœ ๋™์ž‘ ๊ตฌํ˜„

= vs <= (Blocking vs Non-blocking)


โฑ๏ธ ์‹œ๊ฐ„ ํ๋ฆ„ ์ฐจ์ด ์ •๋ฆฌ

  • = (Blocking):
    • ์ฆ‰์‹œ ํ• ๋‹น๋จ โ†’ ์‹œ๊ฐ„ ํ๋ฆ„ ์—†์Œ
    • ๋‹ค์Œ ๋ฌธ์žฅ ์‹คํ–‰ ์ „์— ๊ฐ’์ด ๋ฐ”๋กœ ๋ฐ˜์˜๋จ
  • <= (Non-blocking):
    • ์˜ˆ์•ฝ ํ›„ ๋‚˜์ค‘์— ๋ฐ˜์˜ โ†’ ์‹œ๊ฐ„ ํ๋ฆ„ ์žˆ์Œ
    • ๊ฐ™์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‚ฌ์ดํด ๋‚ด์—์„œ ๊ฐ’์ด ๋™์‹œ์— ์—…๋ฐ์ดํŠธ๋จ

๋น„๋™๊ธฐ ๋ฆฌ์…‹ vs ๋™๊ธฐ ๋ฆฌ์…‹ (Power / Area / Cost)


๐ŸŸข ๋น„๋™๊ธฐ ๋ฆฌ์…‹ (Asynchronous Reset)

  • ๐Ÿ”‹ ์ „๋ ฅ: ๋‚ฎ์Œ
    โ†’ ํด๋Ÿญ ์—†์ด ์ฆ‰์‹œ ๋ฆฌ์…‹๋˜๋ฏ€๋กœ ์ „๋ ฅ ์†Œ๋ชจ๊ฐ€ ์ ์Œ
  • ๐Ÿ“ ๋ฉด์ : ์ž‘์Œ
    โ†’ ๋ฆฌ์…‹ ๋กœ์ง์ด ๊ฐ„๋‹จํ•ด์„œ ํ•˜๋“œ์›จ์–ด ์ž์› ์ ๊ฒŒ ์‚ฌ์šฉ
  • ๐Ÿ’ฐ ๋น„์šฉ: ๋‚ฎ์Œ
    โ†’ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•˜์—ฌ ๊ฒŒ์ดํŠธ ์ˆ˜๊ฐ€ ์ ๊ณ  ๋น„์šฉ ์ ˆ๊ฐ ๊ฐ€๋Šฅ

๐Ÿ”ต ๋™๊ธฐ ๋ฆฌ์…‹ (Synchronous Reset)

  • ๐Ÿ”‹ ์ „๋ ฅ: ๋†’์Œ
    โ†’ ํด๋Ÿญ ์‹ ํ˜ธ๊ฐ€ ํ•„์š”ํ•˜์—ฌ ํด๋Ÿญ ๊ด€๋ จ ์ „๋ ฅ ์†Œ๋ชจ ๋ฐœ์ƒ
  • ๐Ÿ“ ๋ฉด์ : ํผ
    โ†’ ์กฐ๊ฑด ์ œ์–ด ๋กœ์ง ์ถ”๊ฐ€๋กœ ์ธํ•ด ํ•˜๋“œ์›จ์–ด ์ž์›์ด ๋” ๋“ค์–ด๊ฐ
  • ๐Ÿ’ฐ ๋น„์šฉ: ๋†’์Œ
    โ†’ ๋…ผ๋ฆฌ ํšŒ๋กœ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉฐ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ ๋น„์šฉ ์ฆ๊ฐ€

โœ… ์š”์•ฝ

  • Async ๋ฆฌ์…‹: ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ (์ €์ „๋ ฅ, ์ €๋ฉด์ , ์ €๋น„์šฉ), ํ•˜์ง€๋งŒ ํƒ€์ด๋ฐ ๋ฏผ๊ฐ๋„ โ†‘
  • Sync ๋ฆฌ์…‹: ์„ค๊ณ„ ์•ˆ์ •์„ฑ โ†‘, ๊ทธ๋Ÿฌ๋‚˜ ์ž์› ์†Œ๋ชจ โ†‘

์กฐํ•ฉ ๋…ผ๋ฆฌ vs ์ˆœ์ฐจ ๋…ผ๋ฆฌ


๐ŸŸข Combinational Logic (์กฐํ•ฉ ๋…ผ๋ฆฌ)

  • ์ถœ๋ ฅ์ด ์ž…๋ ฅ์—๋งŒ ์˜์กด
  • ๋ฉ”๋ชจ๋ฆฌ(์ƒํƒœ ์ €์žฅ) ์š”์†Œ ์—†์Œ
  • ํด๋Ÿญ ์‹ ํ˜ธ ์—†์ด ๋™์ž‘
  • ์ž…๋ ฅ์ด ๋ฐ”๋€Œ๋ฉด ์ฆ‰์‹œ ์ถœ๋ ฅ๋„ ๋ฐ”๋€œ
  • ์˜ˆ: ๊ฐ€์‚ฐ๊ธฐ, ์ธ์ฝ”๋”, ๋””์ฝ”๋”, ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ ๋“ฑ
assign y = a & b;

๐Ÿ”ต Sequential Logic (์ˆœ์ฐจ ๋…ผ๋ฆฌ)

  • ์ถœ๋ ฅ์ด ์ž…๋ ฅ + ์ด์ „ ์ƒํƒœ(๋ฉ”๋ชจ๋ฆฌ)์— ์˜์กด
  • ๋ ˆ์ง€์Šคํ„ฐ, ํ”Œ๋ฆฝํ”Œ๋กญ ๋“ฑ ์ƒํƒœ ์ €์žฅ ์†Œ์ž ์‚ฌ์šฉ
  • ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒํƒœ๊ฐ€ ๊ฐฑ์‹ ๋จ
  • ์‹œ๊ฐ„ ๊ฐœ๋…(์ˆœ์„œ, ํƒ€์ด๋ฐ)์ด ์ค‘์š”
  • ์˜ˆ: ๋ ˆ์ง€์Šคํ„ฐ, ์นด์šดํ„ฐ, FSM ๋“ฑ
always @(posedge clk) begin
  q <= d;
end

โœ… ์š”์•ฝ

  • ์กฐํ•ฉ ๋…ผ๋ฆฌ: ํ˜„์žฌ ์ž…๋ ฅ๋งŒ์œผ๋กœ ๊ฒฐ์ • โ†’ ๋ฉ”๋ชจ๋ฆฌ ์—†์Œ, ํด๋Ÿญ ํ•„์š” ์—†์Œ
  • ์ˆœ์ฐจ ๋…ผ๋ฆฌ: ํ˜„์žฌ ์ž…๋ ฅ + ์ด์ „ ์ƒํƒœ๋กœ ๊ฒฐ์ • โ†’ ๋ฉ”๋ชจ๋ฆฌ ์žˆ์Œ, ํด๋Ÿญ ํ•„์š”

Equality Operator ์š”์•ฝ


โฌ› ==, !=

  • x, z ๋ฌด์‹œ ๋ชปํ•จ โ†’ ๊ฒฐ๊ณผ๊ฐ€ x ๋  ์ˆ˜ ์žˆ์Œ
  • ์ผ๋ฐ˜์ ์ธ ๊ฐ’ ๋น„๊ต์— ์‚ฌ์šฉ

โฌ› ===, !==

  • x, z๊นŒ์ง€ ํฌํ•จํ•ด์„œ ์ •ํ™•ํžˆ ๋น„๊ต
  • ํ…Œ์ŠคํŠธ๋ฒค์น˜์—์„œ ์ž์ฃผ ์‚ฌ์šฉ

โœ… ํ•ต์‹ฌ ์ •๋ฆฌ

  • ==, != โ†’ ๊ฐ’ ๋น„๊ต, x/z ์žˆ์œผ๋ฉด ๊ฒฐ๊ณผ๋„ x
  • ===, !== โ†’ ์™„์ „ ์ผ์น˜ ๋น„๊ต, x/z ํฌํ•จํ•ด์„œ ๋น„๊ต

signed vs unsigned


๐ŸŸข unsigned

  • ๋ถ€ํ˜ธ ์—†๋Š” ์ˆ˜ โ†’ 0 ์ด์ƒ๋งŒ ํ‘œํ˜„
  • MSB(์ตœ์ƒ์œ„ ๋น„ํŠธ)๋Š” ๊ฐ’์˜ ์ผ๋ถ€
  • ๊ธฐ๋ณธ๊ฐ’ (์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ถ™์ด๋ฉด unsigned)

์˜ˆ: 4โ€™b1000 = 8 (์Œ์ˆ˜๊ฐ€ ์•„๋‹˜)

๐Ÿ”ต signed

  • ๋ถ€ํ˜ธ ์žˆ๋Š” ์ˆ˜ โ†’ ์–‘์ˆ˜/์Œ์ˆ˜ ๋ชจ๋‘ ํ‘œํ˜„ ๊ฐ€๋Šฅ
  • MSB๋Š” ๋ถ€ํ˜ธ๋น„ํŠธ๋กœ ์‚ฌ์šฉ๋จ (0: ์–‘์ˆ˜, 1: ์Œ์ˆ˜)
  • ๋น„๊ต, ์—ฐ์‚ฐ ์‹œ signed๋ผ๋ฆฌ ๊ณ„์‚ฐ๋˜์–ด์•ผ ์ •ํ™•ํ•จ
reg signed [3:0] a = 4'b1000;  // -8

โœ… ์š”์•ฝ

  • unsigned โ†’ 0 ์ด์ƒ๋งŒ ํ‘œํ˜„, ๊ธฐ๋ณธ๊ฐ’
  • signed โ†’ ์Œ์ˆ˜๊นŒ์ง€ ํ‘œํ˜„, MSB๋Š” ๋ถ€ํ˜ธ๋น„ํŠธ

reg vs wire


๐ŸŸข wire

  • ๊ฐ’ ์ €์žฅ X, ์—ฐ๊ฒฐ์šฉ
  • assign์œผ๋กœ๋งŒ ๊ฐ’ ์ง€์ •
  • ์กฐํ•ฉ ๋…ผ๋ฆฌ ํšŒ๋กœ์— ์‚ฌ์šฉ

๐Ÿ”ต reg

  • ๊ฐ’ ์ €์žฅ O, ๋‚ด๋ถ€ ์ƒํƒœ ์œ ์ง€
  • always, initial ๋ธ”๋ก์—์„œ ๊ฐ’ ํ• ๋‹น
  • ์ˆœ์ฐจ ๋…ผ๋ฆฌ ํšŒ๋กœ์— ์‚ฌ์šฉ

โœ… ์š”์•ฝ

  • wire: ์ €์žฅ โŒ, ์—ฐ๊ฒฐ๋งŒ
  • reg: ์ €์žฅ โญ•, ๋ธ”๋ก ๋‚ด์—์„œ ๊ฐ’ ์œ ์ง€

Clock Gating, else ์‚ฌ์šฉ, power ๊ด€๋ จ


๐ŸŸข local clock gating

  • ํŠน์ • block๋งŒ ์„ ํƒ์ ์œผ๋กœ ํด๋Ÿญ ๊ณต๊ธ‰ํ•ด์„œ ๋™์ž‘์„ ์ œํ•œ
  • ์‚ฌ์šฉ ๋ชฉ์ : ๋™์ž‘ ์•ˆ ํ•˜๋Š” ํšŒ๋กœ์˜ ์ „๋ ฅ ์ฐจ๋‹จ โ†’ ์ €์ „๋ ฅ ์„ค๊ณ„
  • ์ง์ ‘ if (~enable)๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Œ

๐Ÿ”ต Flip-Flop (seq logic)์—์„œ else ์‚ฌ์šฉ

  • ํ•ญ์ƒ else๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์›์น™์€ ์•„๋‹˜
  • ํ•˜์ง€๋งŒ always @(posedge clk)์—์„œ if๋งŒ ์“ฐ๊ณ  else๊ฐ€ ์—†์œผ๋ฉด:
    • ์ด์ „ ๊ฐ’ ์œ ์ง€ ์•ˆ ๋  ์ˆ˜ ์žˆ์Œ
    • synthesis ํˆด์ด latch๋กœ ์˜คํ•ดํ•  ์ˆ˜๋„ ์žˆ์Œ
  • ๋ช…ํ™•ํ•œ ์ƒํƒœ ์œ ์ง€ ๋ชฉ์ ์œผ๋กœ else๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒŒ ์ข‹์Œ

โœ… ํ•˜์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ(=ํ† ๊ธ€)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด
โ†’ power ์ธก๋ฉด์—์„œ ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ”ท Combinational Logic์—์„œ๋Š”?

  • always @(*)์—์„œ๋Š” if์— else๋ฅผ ๋ฐ˜๋“œ์‹œ ์จ์•ผ ํ•จ
    โ†’ ๋ชจ๋“  ์กฐ๊ฑด์—์„œ ์ถœ๋ ฅ์ด ์ •์˜๋˜์ง€ ์•Š์œผ๋ฉด latch ๋ฐœ์ƒ ์œ„ํ—˜
  • latch๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ (else ํฌํ•จ) ๊ฐ€ ์ค‘์š”ํ•จ

โœ… ์š”์•ฝ

  • local clock gating: ํด๋Ÿญ์„ ์ฐจ๋‹จํ•ด์„œ ์ „๋ ฅ ์ค„์ด๋Š” ๊ธฐ๋ฒ•
  • FF์—์„œ else: ์ƒํƒœ ๋ณด์กด ๋ช…ํ™•ํžˆ ํ•˜๋ ค๋ฉด ์ข‹์ง€๋งŒ, ๋ถˆํ•„์š”ํ•œ ์ „๋ ฅ ์†Œ๋ชจ ์ฃผ์˜
  • combinational์—์„œ else ๋ˆ„๋ฝ: latch ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ โ†’ ๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌ ํ•„์š”

alt text

Quiz 1


์ด ์ฝ”๋“œ๋Š” ํ•ฉ๋ฒ•์ ์ธ๊ฐ€? ์ปดํŒŒ์ผ์ด ๋ ๊นŒ?

program automatic test;
  bit [31:0] count;
  logic [31:0] Count = 'x;

  initial begin
    count = Count;
    $display("Count = %0x count = %0d", Count, count);
  end
endprogram: test

๋‹ต๋ณ€ : ํ•ฉ๋ฒ•์ ์ธ SystemVerilog ์ฝ”๋“œ์ด๋ฉฐ ์ปดํŒŒ์ผ๋„ ๊ฐ€๋Šฅํ•จ. program automatic์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์กฐ์ด๊ณ  ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ฌธ์ œ ์—†์Œ.

logic ํƒ€์ž…์€ ์–ด๋–ค ํƒ€์ž…์˜ ๋‹ค๋ฅธ ์ด๋ฆ„์ธ๊ฐ€? โ€˜x๋Š” Count๋ฅผ ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐํ™”ํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€ : logic์€ 4-state ํƒ€์ž…์ธ reg์˜ ๋Œ€์ฒด ํ‘œํ˜„ โ†’ 0, 1, x, z ์ €์žฅ ๊ฐ€๋Šฅ. โ€˜x๋Š” ๋ชจ๋“  ๋น„ํŠธ๋ฅผ unknown(x) ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•จ.

ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌด์—‡์„ ์ถœ๋ ฅํ• ๊นŒ? ์™œ count์™€ Count์˜ ๊ฐ’์ด ๋‹ค๋ฅธ๊ฐ€?

์ถœ๋ ฅ ์˜ˆ์‹œ : Count = xxxxxxxx count = 0 (ํ˜•์‹์ ์œผ๋กœ ํ‘œํ˜„)

์ด์œ  : Count๋Š” logic์ด๋ฏ€๋กœ โ€˜x ๊ฐ’์„ ์œ ์ง€ํ•จ. count๋Š” bit ํƒ€์ž…์ด๋ผ 2-state๋งŒ ๊ฐ€๋Šฅ โ†’ x ๊ฐ’์„ 0์œผ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•ด์„œ ์ €์žฅ๋จ

shift_reg