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 ๋ฐ์ ๊ฐ๋ฅ์ฑ ์์ โ ๋ฐ๋์ ์ฒ๋ฆฌ ํ์
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