๋ถ์ฐ ์ง์ฐ (Distributed Delay)
- ๋ถ์ฐ ์ง์ฐ์ ๊ฐ๋ณ ์์ ๊ธฐ์ค์ผ๋ก ์ง์ ๋ฉ๋๋ค.
- ์ง์ฐ ๊ฐ์ ํ๋ก์ ๊ฐ๋ณ ์์์ ํ ๋น๋ฉ๋๋ค.
- ์ด๋ค ๊ฒ์ดํธ์ ์ ๋ ฅ์ด ๋ณ๊ฒฝ๋ ๋, ์ถ๋ ฅ์ ์ง์ ๋ ์ง์ฐ ํ์ ๋ณ๊ฒฝ๋ฉ๋๋ค.
module M (out, a, b, c, d); output out; input a, b, c, d; wire e, f; // ๊ฐ ๊ฒ์ดํธ์ ์ง์ฐ์ด ๋ถ์ฐ๋ฉ๋๋ค. and #5 a1(e, a, b); and #7 a2(f, c, d); and #4 a3(out, e, f); endmodule
ย
์ง์ ์ง์ฐ (Lumped Delay)
- ์ง์ ์ง์ฐ์ ๋ชจ๋ ๊ธฐ์ค์ผ๋ก ์ง์ ๋ฉ๋๋ค.
- ์ถ๋ ฅ ๊ฒ์ดํธ์ ๋จ์ผ ์ง์ฐ์ผ๋ก ์ง์ ๋ ์ ์์ต๋๋ค.
- ๋ชจ๋ ๊ฒฝ๋ก์ ๋์ ์ง์ฐ์ด ํ๋์ ์์น์์ ์ง์ ๋ฉ๋๋ค.
- ์ ์ฒด ์ง์ฐ์ด ์ถ๋ ฅ ๊ฒ์ดํธ์ ์ง์ ๋ฉ๋๋ค.
- ๋ชจ๋ M์ ์ด๋ค ์ ๋ ฅ์ด ๋ณ๊ฒฝ๋ ํ ์ง์ฐ์ ๊ฑฐ์ณ ๊ธฐ๋ณธ ์ถ๋ ฅ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
module M (out, a, b, c, d); output out; input a, b, c, d; wire e, f; and a1(e, a, b); and a2(f, c, d); and #11 a3(out, e, f); // ์ถ๋ ฅ ๊ฒ์ดํธ์๋ง ์ง์ฐ endmodule
ํ-ํฌ-ํ ์ง์ฐ (Pin-to-Pin Delays)
- ํ-ํฌ-ํ ์ง์ฐ์ ๊ฐ ์ ๋ ฅ์์ ๊ฐ ์ถ๋ ฅ์ผ๋ก ์ด์ด์ง๋ ๊ฒฝ๋ก๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ํ ๋น๋ฉ๋๋ค.
- ๊ฐ ์ ๋ ฅ/์ถ๋ ฅ ๊ฒฝ๋ก์ ๋ํด ๋ณ๋๋ก ์ง์ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
- ๋์งํธ ํ๋ก์ ๋ชจ๋์ ๋ํ ํ-ํฌ-ํ ์ง์ฐ์ SPICE์ ๊ฐ์ ์ ์์ค ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก ํน์ฑํ๋ฅผ ํตํด ์ป์ด์ง๋๋ค.
- ํ-ํฌ-ํ ์ง์ฐ์ ๊ฒฝ๋ก ์ง์ฐ์ผ๋ก๋ ์๋ ค์ ธ ์์ต๋๋ค.
Specify ๋ธ๋ก
- Specify ๋ธ๋ก์ ๋ค์์ ์ํํ๋ ๋ฌธ์ ํฌํจํฉ๋๋ค:
- ๋ชจ๋ ๊ฒฝ๋ก ์ ๋ฐ์ ๊ฑธ์ณ ํ-ํฌ-ํ ํ์ด๋ฐ ์ง์ฐ ํ ๋น,
- ํ๋ก ๋ด ํ์ด๋ฐ ๊ฒ์ฌ ์ค์ ,
- specparam ์์ ์ ์.
module M (out, a, b, c, d); output out; input a, b, c, d; wire e, f; // ๊ฒฝ๋ก ์ง์ฐ ๋ฌธ์ ํฌํจํ Specify ๋ธ๋ก specify (a => out) = 9; (b => out) = 9; (c => out) = 11; (d => out) = 11; endspecify and a1(e, a, b); and a2(f, c, d); and a3(out, e, f); endmodule
- ๋ชจ๋ ๊ฒฝ๋ก ์ง์ฐ์ ์์ค(์ ๋ ฅ) ํ์์ ๋ชฉ์ ์ง(์ถ๋ ฅ) ํ๊น์ง์ ์ง์ฐ์ ๋ํ๋ ๋๋ค.
// ๋นํธ-๋-๋นํธ ์ฐ๊ฒฐ. a์ out ๋ชจ๋ ๋จ์ผ ๋นํธ์ ๋๋ค. (a => out) = 9; // ๋ฒกํฐ ์ฐ๊ฒฐ. a์ out ๋ชจ๋ 4-๋นํธ ๋ฒกํฐ์ ๋๋ค. (a[3:0] => out[3:0]) = 9; // ์๊ธฐ ๋ฌธ์ ๋ค ๊ฐ์ ๋นํธ-๋-๋นํธ ์ฐ๊ฒฐ ๋ฌธ์ ์ถ์ฝํ์ ๋๋ค. (a[0] => out[0]) = 9; (a[1] => out[1]) = 9; (a[2] => out[2]) = 9; (a[3] => out[3]) = 9; // ์๋ชป๋ ์ฐ๊ฒฐ. a[4:0]์ 5-๋นํธ ๋ฒกํฐ, out[3:0]์ 4-๋นํธ ๋ฒกํฐ์ ๋๋ค. (a => out) = 9; // ๋นํธ ๋๋น๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.
ย
Specify ๋ธ๋ก ๋ด๋ถ (2)
์ ์ฒด ์ฐ๊ฒฐ
module M (out, a, b, c, d); output out; input a, b, c, d; wire e, f; // ์ ์ฒด ์ฐ๊ฒฐ ์ง์ specify (a, b *> out) = 9; (c, a *> out) = 11; endspecify and a1(e, a, b); and a2(f, c, d); and a3(out, e, f); endmodule // a[31:0]์ 32-๋นํธ ๋ฒกํฐ, out[15:0]์ 16-๋นํธ ๋ฒกํฐ์ ๋๋ค. specify (a *> out) = 9; // ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด 32 X 16 = 512 ๋ณ๋ ฌ ์ฐ๊ฒฐ ๋ฌธ์ด ํ์ํฉ๋๋ค! endspecify
Specify ๋ธ๋ก ๋ด๋ถ (3)
์์ง-์ผ์ํฐ๋ธ ๊ฒฝ๋ก
specparam
๋ฌธspecify
๋ธ๋ก ๋ด๋ถ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ํจspecparam
๋งค๊ฐ๋ณ์๋ ํด๋นspecify
๋ธ๋ก ๋ด์์๋ง ์ฌ์ฉ๋จ
Specify ๋ธ๋ก ๋ด๋ถ (4)
์กฐ๊ฑด๋ถ ๊ฒฝ๋ก ์ง์ฐ
if
์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์ฌ ํํ๋ฉ๋๋ค (else
๋ ์ฌ์ฉ๋์ง ์์).Specify ๋ธ๋ก ๋ด๋ถ (5)
์์น, ํ๊ฐ, ๋ฐ ๊บผ์ง ์ง์ฐ
// ๋จ์ผ ์ง์ฐ ์ง์ . ๋ชจ๋ ์ ํ์ ๋ํด ๋จ์ผ ์ง์ฐ(t_delay)์ด ์ฌ์ฉ๋จ specparam t_delay = 11; (clk => q) = t_delay; // ๋ ์ง์ฐ, ์์น ๋ฐ ํ๊ฐ ์ง์ฐ ์ง์ // - ์์น ์ง์ฐ(`t_rise`)์ 0์์ 1, Z์์ 1๋ก์ ์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค. // - ํ๊ฐ ์ง์ฐ(`t_fall`)์ 1์์ 0, Z์์ 0์ผ๋ก์ ์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค. specparam t_rise = 9, t_fall = 13; (clk => q) = (t_rise, t_fall); // ์ธ ์ง์ฐ, ์์น, ํ๊ฐ, ๋ฐ ๊บผ์ง ์ง์ฐ ์ง์ // - ์์น ์ง์ฐ์ 0์์ 1, Z์์ 1๋ก์ ์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค. // - ํ๊ฐ ์ง์ฐ์ 1์์ 0, Z์์ 0์ผ๋ก์ ์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค. // - ๊บผ์ง ์ง์ฐ(`t_turnoff`)์ 0์์ Z, 1์์ Z๋ก์ ์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค. specparam t_rise = 9, t_fall = 13, t_turnoff = 11; (clk => q) = (t_rise, t_fall, t_turnoff); // ์ฌ์ฏ ๊ฐ์ง ์ง์ฐ ์ง์ // 0์์ 1, 1์์ 0, 0์์ Z, Z์์ 1, 1์์ Z, Z์์ 0์ผ๋ก์ ์ ํ์ ๋ํด ์ง์ฐ์ด ์์๋๋ก ์ง์ ๋ฉ๋๋ค. specparam t_01 = 9, t_10 = 13, t_0z = 11; specparam t_z1 = 9, t_1z = 11, t_z0 = 13; (clk => q) = (t_01, t_10, t_0z, t_z1, t_1z, t_z0); // ์ด๋ ๊ฐ์ง ์ง์ฐ ์ง์ // 0์์ 1, 1์์ 0, 0์์ Z, Z์์ 1, 1์์ Z, Z์์ 0, 0์์ X, X์์ 1, 1์์ X, X์์ 0, X์์ Z, Z์์ X๋ก์ ์ ํ์ ๋ํด ์ง์ฐ์ด ์์๋๋ก ์ง์ ๋ฉ๋๋ค. specparam t_01 = 9, t_10 = 13, t_0z = 11; specparam t_z1 = 9, t_1z = 11, t_z0 = 13; specparam t_0x = 4, t_x1 = 13, t_1x = 5; specparam t_x0 = 9, t_xz = 11, t_zx = 7; (clk => q) = (t_01, t_10, t_0z, t_z1, t_1z, t_z0, t_0x, t_x1, t_1x, t_x0, t_xz, t_zx);
ย
Specify ๋ธ๋ก ๋ด๋ถ (6)
์ต์, ์ต๋, ์ผ๋ฐ ์ง์ฐ
specparam t_rise = 8:9:10, t_fall = 12:13:14, t_turnoff = 10:11:12; (clk => q) = (t_rise, t_fall, t_turnoff);
ย
x ์ ํ ์ฒ๋ฆฌ
// ์ฌ์ฏ ์ง์ฐ์ด ์ง์ ๋ฉ๋๋ค. // 0->1, 1->0, 0->z, z->1, 1->z, z->0๋ก์ ์ ํ์ ๋ํด specparam t_01 = 9, t_10 = 13, t_0z = 11; specparam t_z1 = 9, t_1z = 11, t_z0 = 13; (clk => q) = (t_01, t_10, t_0z, t_z1, t_1z, t_z0);
ย
ํ์ด๋ฐ ๊ฒ์ฌ (Timing Checks)
Verilog๋ ํ์ด๋ฐ ๊ฒ์ฌ๋ฅผ ์ํ ์์คํ
์์
์ ์ ๊ณตํฉ๋๋ค.
specify
๋ธ๋ก ์์ ์์ด์ผ ํฉ๋๋ค.$setup
๋ฐ $hold
์์
์ ์ค๊ณ์ ์์ฐจ ์์์ ๋ํ ์ค์ (setup) ๋ฐ ์ ์ง(hold) ์ ์ฝ ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.- ์ค์ ์๊ฐ์ ํ์ฑ ํด๋ก ์์ง ์ด์ ์ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํด์ผ ํ๋ ์ต์ ์๊ฐ์ ๋๋ค.
- ์ ์ง ์๊ฐ์ ํ์ฑ ํด๋ก ์์ง ์ดํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ๋ ์ต์ ์๊ฐ์ ๋๋ค.
$setup ๋ฐ $hold ๊ฒ์ฌ
$setup ์์
$setup(data_event, reference_event, limit);
data_event
: ์๋ฐ์ ๊ฐ์ํ๋ ์ ํธreference_event
:data_event
์ ํธ๋ฅผ ๊ฐ์ํ๊ธฐ ์ํ ์ฐธ์กฐ ์ ํธlimit
:data_event
์ ์ค์ ์ ํ์ํ ์ต์ ์๊ฐ- ์๋ฐ์
(T_reference_event - T_data_event) < limit
์ผ ๋ ๋ณด๊ณ ๋ฉ๋๋ค.
// ์ค์ ๊ฒ์ฌ๊ฐ ์ค์ ๋ฉ๋๋ค. // clock์ ์ฐธ์กฐ์ ๋๋ค. // data๋ ์๋ฐ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. // ์๋ฐ์ (posedge_clk - data) < 3 ์ผ ๋ ๋ณด๊ณ ๋ฉ๋๋ค. specify $setup(data, posedge clock, 3); endspecify
$hold ์์
$hold(reference_event, data_event, limit);
reference_event
:data_event
์ ํธ๋ฅผ ๊ฐ์ํ๊ธฐ ์ํ ์ฐธ์กฐ ์ ํธdata_event
: ์๋ฐ์ ๊ฐ์ํ๋ ์ ํธlimit
:data_event
์ ์ ์ง์ ํ์ํ ์ต์ ์๊ฐ- ์๋ฐ์
(T_data_event - T_reference_event) < limit
์ผ ๋ ๋ณด๊ณ ๋ฉ๋๋ค.
// ์ ์ง ๊ฒ์ฌ๊ฐ ์ค์ ๋ฉ๋๋ค. // clock์ ์ฐธ์กฐ์ ๋๋ค. // data๋ ์๋ฐ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. // ์๋ฐ์ (data - posedge_clk) < 5 ์ผ ๋ ๋ณด๊ณ ๋ฉ๋๋ค. specify $hold(posedge clock, data, 5); endspecify
์ด ์ฝ๋๋ Verilog์ ํ์ด๋ฐ ๊ฒ์ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ฐจ ํ๋ก ์์์ ์ค์ ๋ฐ ์ ์ง ์๊ฐ ์ ์ฝ์ ๊ฒ์ฌํฉ๋๋ค.
$setup
๊ณผ $hold
์์
์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ ํธ๊ฐ ํด๋ก ์ ํธ์ ๋ํด ์ ์ ํ ์๊ฐ ๋ด์ ์์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.ย
ย
$width ๊ฒ์ฌ
$width
๋ ํ์ค์ ๋๋น๊ฐ ์ต์ ๋๋น ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.$width
์ ๋ํ data_event
๋ ๋ช
์์ ์ผ๋ก ์ง์ ๋์ง ์์ง๋ง reference_event
์ ํธ์ ๋ค์ ๋ฐ๋ ์์ง๋ก ํ์๋ฉ๋๋ค.$width(reference_event, limit);
reference_event
: ์์ง ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ(์ ํธ์ ์์ง ์ ํ)limit
: ํ์ค์ ์ต์ ๋๋น
// ๋๋น ๊ฒ์ฌ๊ฐ ์ค์ ๋ฉ๋๋ค. // clear์ posedge๋ `reference_event`์ ๋๋ค. // clear์ ๋ค์ negedge๋ `data_event`์ ๋๋ค. // ์๋ฐ์ (Tdata_event - Treference_event) โค 6์ผ ๋ ๋ณด๊ณ ๋ฉ๋๋ค. specify $width(posedge clear, 6); endspecify
ย
์ง์ฐ ๋ฐฑ-์ด๋ ธํ ์ด์ (Delay Back-Annotation)
์ง์ฐ ๋ฐฑ-์ด๋
ธํ
์ด์
์ ํ์ด๋ฐ ์๋ฎฌ๋ ์ด์
์์ ์ค์ํ๊ณ ๊ด๋ฒ์ํ ์ฃผ์ ์
๋๋ค.
- RTL ์ฝ๋ โ ๊ฒ์ดํธ-๋ ๋ฒจ ๋ท๋ฆฌ์คํธ
- ๋ ์ด์์ ์ ์ถ์ ์ง์ฐ โ ํ์ด๋ฐ ์๋ฎฌ๋ ์ด์ /์ ์ ํ์ด๋ฐ ๋ถ์
- ๊ฒ์ดํธ-๋ ๋ฒจ ๋ท๋ฆฌ์คํธ โ ๋ ์ด์์
- ๋ ์ด์์ ํ ์ง์ฐ(R/C) โ ๋ฐฑ-์ด๋ ธํ ์ด์ โ ํ์ด๋ฐ ์๋ฎฌ๋ ์ด์ /์ ์ ํ์ด๋ฐ ๋ถ์
์ด ๊ณผ์ ์ ์ค๊ณ์์ ๊ฒ์ดํธ-๋ ๋ฒจ์ ๋ท๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ , ๋ ์ด์์ ์ ๊ณผ ํ์ ์ง์ฐ์ ์ถ์ ํ์ฌ ์ด๋ฅผ ํ์ด๋ฐ ์๋ฎฌ๋ ์ด์
๊ณผ ์ ์ ํ์ด๋ฐ ๋ถ์์ ๋ฐ์ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ํ๋ก์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ , ํ์ด๋ฐ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๋ฐ ํ์์ ์
๋๋ค.