UDP(User-Defined Primitive) ์ ์์ ๊ตฌ์ฑ ์์
- ์ฌ์ฉ์ ์ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ(UDP) ์ ์๋
primitive
ํค์๋๋ก ์์ํฉ๋๋ค.
// UDP ์ด๋ฆ ๋ฐ ํฐ๋ฏธ๋ ๋ชฉ๋ก primitive <udp_name> (<output_terminal_name>, <input_terminal_names>); // ํฐ๋ฏธ๋ ์ ์ธ output <output_terminal_name>; input <input_terminal_names>; // ์์ฐจ์ UDP์ ๊ฒฝ์ฐ ์ ํ์ ์ผ๋ก reg ์ ์ธ reg <output_terminal_name>; (optional; only for sequential UDP) // ์์ฐจ์ UDP ์ด๊ธฐํ (์ ํ์ ) initial <output_terminal_name> = <value>; // UDP ์ํ ํ ์ด๋ธ table <table_entries> endtable // UDP ์ ์ ์ข ๋ฃ endprimitive
ย
UDP ๊ท์น
- UDP ์ ์๋ ํน์ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค.
- UDP๋ ์ค์นผ๋ผ ์ ๋ ฅ(1-๋นํธ) ํฐ๋ฏธ๋๋ง ๋ฐ์ ์ ์์ต๋๋ค.
- ๋ค์ค ์ ๋ ฅ ํฐ๋ฏธ๋์ด ํ์ฉ๋ฉ๋๋ค.
- UDP๋ ํ๋์ ์ค์นผ๋ผ ์ถ๋ ฅ ํฐ๋ฏธ๋๋ง ๊ฐ์ง ์ ์์ต๋๋ค.
- ์ถ๋ ฅ ํฐ๋ฏธ๋์ ํฐ๋ฏธ๋ ๋ชฉ๋ก์์ ํญ์ ๋จผ์ ๋ํ๋์ผ ํฉ๋๋ค.
- ๋ค์ค ์ถ๋ ฅ ํฐ๋ฏธ๋์ ํ์ฉ๋์ง ์์ต๋๋ค.
- ์ถ๋ ฅ ํฐ๋ฏธ๋์
output
ํค์๋๋ก ์ ์ธ๋ฉ๋๋ค. - ์์ฐจ์ UDP๋ ์ํ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์ถ๋ ฅ ํฐ๋ฏธ๋์
reg
๋ก๋ ์ ์ธ๋์ด์ผ ํฉ๋๋ค. - ์
๋ ฅ์
input
ํค์๋๋ก ์ ์ธ๋ฉ๋๋ค. - ์์ฐจ์ UDP์์ ์ํ๋
initial
๋ฌธ์ผ๋ก ์ด๊ธฐํ๋ ์ ์์ต๋๋ค(์ ํ์ ). - ์ถ๋ ฅ์๋
reg
๋ก ์ ์ธ๋ 1-๋นํธ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค. - ์ํ ํ ์ด๋ธ ํญ๋ชฉ์ 0, 1, x ๊ฐ์ ํฌํจํ ์ ์์ต๋๋ค.
- UDP๋ z ๊ฐ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. z ๊ฐ์ x ๊ฐ์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค.
- UDP๋ ๋ชจ๋๊ณผ ๋์ผํ ์์ค์์ ์ ์๋ฉ๋๋ค.
- UDP๋ ๋ชจ๋ ๋ด๋ถ์์ ์ ์ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋ด์์๋ง ์ธ์คํด์คํ๋ ์ ์์ต๋๋ค.
- UDP๋ inout ํฌํธ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
์กฐํฉํ UDP ์ ์
- ์ํ ํ ์ด๋ธ์ UDP ์ ์์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ๋๋ค.
// UDP ์ด๋ฆ ๋ฐ ํฐ๋ฏธ๋ ๋ชฉ๋ก primitive udp_and (out, a, b); // ์ ์ธ output out; // ์กฐํฉํ UDP์ ๊ฒฝ์ฐ reg๋ก ์ ์ธ๋์ด์๋ ์ ๋ฉ๋๋ค. input a, b; // ์ ๋ ฅ ์ ์ธ // ์ํ ํ ์ด๋ธ ์ ์; ํค์๋ table๋ก ์์ // a b : out; 0 0 : 0; 0 1 : 0; 1 0 : 0; 1 1 : 1; endtable endprimitive
์ํ ํ ์ด๋ธ ํญ๋ชฉ
- ์กฐํฉํ UDP์ ์ํ ํ
์ด๋ธ์ ๊ฐ ํญ๋ชฉ์
<input1> <input2> ... <inputn> : <output>;
ํ์์ ๊ฐ์ง๋๋ค. <input#>
์ ์ ๋ ฅ ๋ชฉ๋ก์์์ ๋์ผํ ์์๋ก ๋ํ๋์ผ ํฉ๋๋ค.- ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ":"์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
- ์ํ ํ ์ด๋ธ ํญ๋ชฉ์ ";"๋ก ๋๋ฉ๋๋ค.
- ์ ๋ ฅ์ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ด ๋ช ์์ ์ผ๋ก ์ง์ ๋์ด์ผ ํฉ๋๋ค.
- ํน์ ์กฐํฉ์ด ๋ฐ์ํ๊ณ ํด๋น ํญ๋ชฉ์ด ํ ์ด๋ธ์ ์๋ ๊ฒฝ์ฐ, ์ถ๋ ฅ์ x๊ฐ ๋ฉ๋๋ค.
primitive udp_or(out, a, b); output out; input a, b; table // a b : out; 0 0 : 0; 0 1 : 1; 1 0 : 1; 1 1 : 1; endtable endprimitive
Don't Cares์ ๋ํ ์ถ์ฝ ํํ
- Don't Care๋ฅผ ๋ํ๋ด๊ธฐ ์ํด
?
๊ธฐํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ?
๊ธฐํธ๋ ์๋์ผ๋ก 0, 1, ๋๋ x๋ก ํ์ฅ๋ฉ๋๋ค.
primitive udp_or(out, a, b); output out; input a, b; table // a b : out; 0 0 : 0; 1 ? : 1; // ?๋ 0, 1, x๋ก ํ์ฅ๋จ ? 1 : 1; // ?๋ 0, 1, x๋ก ํ์ฅ๋จ ? ? : x; // ?๋ 0, 1, x๋ก ํ์ฅ๋จ 0 x : x; x 0 : x; endtable endprimitive
UDP(User-Defined Primitive) ์์์ฒด ์ธ์คํด์คํ
- UDP๋ Verilog ๊ฒ์ดํธ ์์์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์คํด์คํ๋ฉ๋๋ค.
// 1๋นํธ ์ ์ฒด ๋ง์ ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. module fulladd(sum, c_out, a, b, c_in); output sum, c_out; input a, b, c_in; // ๋ด๋ถ ๋ท wire s1, c1, c2; // ๋ ผ๋ฆฌ ๊ฒ์ดํธ ์์์ฒด ์ธ์คํด์คํ xor (s1, a, b); // Verilog ์์์ฒด ์ฌ์ฉ xor (sum, s1, c_in); // Verilog ์์์ฒด ์ฌ์ฉ udp_and (c1, a, b); // UDP ์ฌ์ฉ udp_and (c2, s1, c_in);// UDP ์ฌ์ฉ udp_or (c_out, c2, c1);// UDP ์ฌ์ฉ endmodule primitive udp_or(out, a, b); output out; input a, b; table // a b : out; 1 ? : 1; // ?๋ 0, 1, x๋ก ํ์ฅ๋จ ? 1 : 1; // ?๋ 0, 1, x๋ก ํ์ฅ๋จ ? ? : x; // ?๋ 0, 1, x๋ก ํ์ฅ๋จ 0 x : x; x 0 : x; endtable endprimitive
ย
์กฐํฉํ UDP ์์
4๋1 ๋ฉํฐํ๋ ์
- 4๋1 ๋ฉํฐํ๋ ์๋ฅผ ์์์ฒด๋ก ์ ์ํฉ๋๋ค.
primitive mux4_to_1 (out, i0, i1, i2, i3, s1, s0); output out; input i0, i1, i2, i3, s1, s0; table // i0 i1 i2 i3 s1 s0 : out 1 ? ? ? 0 0 : 1; 0 ? ? ? 0 0 : 0; ? 1 ? ? 0 1 : 1; ? 0 ? ? 0 1 : 0; ? ? 1 ? 1 0 : 1; ? ? 0 ? 1 0 : 0; ? ? ? 1 1 1 : 1; ? ? ? 0 1 1 : 0; ? ? ? ? x ? : x; ? ? ? ? ? x : x; endtable endprimitive
- ์ ๋ ฅ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ํ ํ ์ด๋ธ์ด ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ปค์ง ์ ์์์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์์ฐจ์ UDP
- ์์ฐจ์ UDP๋ ์กฐํฉํ UDP์ ๋ค๋ฆ ๋๋ค.
- ์์ฐจ์ UDP์ ์ถ๋ ฅ์ ํญ์
reg
๋ก ์ ์ธ๋ฉ๋๋ค. - ์ด๊ธฐํ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฐจ์ UDP์ ์ถ๋ ฅ์ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
- ํฌ๋งท:
<input1> <input2> ... <inputN> : <current_state> : <next_state>;
- ์ํ ํ ์ด๋ธ์ ์ ๋ ฅ์ ์ ๋ ฅ ๋ ๋ฒจ ๋๋ ์์ง ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ํ์ฌ ์ํ๋ ์ถ๋ ฅ ๋ ์ง์คํฐ์ ํ์ฌ ๊ฐ์ ๋๋ค.
- ๋ค์ ์ํ๋ ์ ๋ ฅ๊ณผ ํ์ฌ ์ํ์ ๋ฐ๋ผ ๊ณ์ฐ๋ฉ๋๋ค.
- ๋ค์ ์ํ๋ ์ถ๋ ฅ ๋ ์ง์คํฐ์ ์ ๊ฐ์ด ๋ฉ๋๋ค.
- ์๋ ค์ง์ง ์์ ์ถ๋ ฅ ๊ฐ์ ํผํ๊ธฐ ์ํด ์ ๋ ฅ์ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๋ช ์ํด์ผ ํฉ๋๋ค.
- ์ ๋ ฅ ๋ ๋ฒจ๊ณผ ์ ๋ ฅ์ ์์ง ์ ํ์ ๋ฏผ๊ฐํ ๊ฒฝ์ฐ ๊ฐ๊ฐ ๋ ๋ฒจ-๋ฏผ๊ฐํ(level-sensitive)๊ณผ ์์ง-๋ฏผ๊ฐํ(edge-sensitive) ์์ฐจ์ UDP๋ผ๊ณ ํฉ๋๋ค.
๋ ๋ฒจ-๋ฏผ๊ฐํ ์์ฐจ์ UDP
- ๋ ๋ฒจ-๋ฏผ๊ฐํ UDP๋ ์ ๋ ฅ ๋ ๋ฒจ์ ๋ฐ๋ผ ์ํ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ๋์น๋ ๋ ๋ฒจ-๋ฏผ๊ฐํ UDP์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์์์ ๋๋ค.
// UDP๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฒจ-๋ฏผ๊ฐํ ๋์น ์ ์ primitive latch(q, d, clock, clear); output q; reg q; // ๋ด๋ถ ์ ์ฅ์ ์์ฑ์ ์ํด reg๋ก ์ ์ธ input d, clock, clear; // ์์ฐจ์ UDP ์ด๊ธฐํ initial q = 0; // ์ถ๋ ฅ์ 0์ผ๋ก ์ด๊ธฐํ // ์ํ ํ ์ด๋ธ table // d clock clear : q : q+ ? ? 1 : ? : 0 ; // ํด๋ฆฌ์ด ์กฐ๊ฑด ? 0 ? : ? : - ; // ํด๋ก์ด 0์ด๋ฉด ์๋ ์ํ ์ ์ง 1 1 ? : ? : 1 ; // ๋์น q = ๋ฐ์ดํฐ = 1 0 1 ? : ? : 0 ; // ๋์น q = ๋ฐ์ดํฐ = 0 endtable endprimitive
ย
์์ง-๋ฏผ๊ฐํ ์์ฐจ์ UDP
์์ง-๋ฏผ๊ฐํ ์์ฐจ์ UDP๋ ์์ง ์ ํ๊ณผ/๋๋ ์
๋ ฅ ๋ ๋ฒจ์ ๋ฐ๋ผ ์ํ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
// ์์ง-๋ฏผ๊ฐํ ์์ฐจ์ UDP ์ ์ primitive edge_dff(q, d, clock, clear); output reg q; // ์ถ๋ ฅ์ reg๋ก ์ ์ธ input d, clock, clear; table // clock clear : q : q+ ? 1 : ? : 0 ; // clear๊ฐ 1์ผ ๋ ์ถ๋ ฅ = 0 (10) : ? : - ; // clear์ ์์ ์์ง ๋ฌด์ (10) 0 : ? : 1 ; // clock์ ์์ ์์ง์์ ๋ฐ์ดํฐ ๋์น (10) 0 : ? : 0 ; // clock์ ์์ ์์ง์์ ๋ฐ์ดํฐ ๋์น (1x) 0 : ? : - ; // clock์ด ๋ถํ์คํ ์ํ๋ก ์ ํ๋ ๋ q ์ ์ง ... // ์ถ๊ฐ ๊ท์น endtable endprimitive
์์ฐจ์ UDP ์์
4๋นํธ ๋ฐ์ด๋๋ฆฌ ๋ฆฌํ ์นด์ดํฐ์ UDP T-ํ๋ฆฝํ๋กญ ์์์
๋๋ค.
module counter(q, clock, clear); output [3:0] q; input clock, clear; // T-ํ๋ฆฝํ๋กญ ์ธ์คํด์คํ t_ff tff0(q[0], clock, clear); t_ff tff1(q[1], q[0], clear); t_ff tff2(q[2], q[1], clear); t_ff tff3(q[3], q[2], clear); endmodule // ์์ง ํธ๋ฆฌ๊ฑฐ T-ํ๋ฆฝํ๋กญ primitive t_ff(q, clk, clear); output reg q; input clk, clear; table // clk clear : q : q+ ? 1 : ? : 0; // ๋น๋๊ธฐ ํด๋ฆฌ์ด ์กฐ๊ฑด ? (10) : ? : -; // clear์ ์์ ์์ง ๋ฌด์ (10) 0 : ? : ~q; // clk์ ์์ ์์ง์์ ํ ๊ธ ... // ์ถ๊ฐ ๊ท์น endtable endprimitive
UDP ํ ์ด๋ธ ์ถ์ฝ ๊ธฐํธ
table ? ? 1 : ? : 0 ; // clear๊ฐ 1์ผ ๊ฒฝ์ฐ, ์ถ๋ ฅ q = 0 ? ? (10) : ? : - ; // clock์ ํ๊ฐ ์์ง์์ q ์ ์ง 1 (10) 0 : ? : 1 ; // d๊ฐ 1์ด๊ณ , clock์ ํ๊ฐ ์์ง์์ clear๊ฐ 0์ผ ๋, ์ถ๋ ฅ q = 1 0 (10) 0 : ? : 0 ; // d๊ฐ 0์ด๊ณ , clock์ ํ๊ฐ ์์ง์์ clear๊ฐ 0์ผ ๋, ์ถ๋ ฅ q = 0 ? (1x) 0 : ? : - ; // clock์ด ๋ถํ์ค ์ํ์์ clear๊ฐ 0์ผ ๋ q ์ ์ง ? (0?) 0 : ? : - ; // clock์ด 0์์ ๋ถํ์ค ์ํ๋ก ์ ํ๋ ๋ q ์ ์ง ? (x1) 0 : ? : - ; // clock์ด ๋ถํ์ค ์ํ์์ 1๋ก ์ ํ๋ ๋ q ์ ์ง (??) ? 0 : ? : - ; // clock์ด ์ด๋ค ์ํ ๋ณํ๋ฅผ ๋ณด์ฌ๋ clear๊ฐ 0์ผ ๋ q ์ ์ง endtable
?
๊ธฐํธ๋ ๋ฌด๊ด์ฌ(Don't care) ์ํ๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด๋ค ๊ฐ์ด๋ ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
(10)
์ clock ์ ํธ๊ฐ 1์์ 0์ผ๋ก ๋ณํ๋ ํ๊ฐ ์์ง๋ฅผ ๋ํ๋ ๋๋ค.
(1x)
,(0?)
,(x1)
์ clock ์ ํธ๊ฐ ๋ถํ์คํ ์ํ(์: 1์์ ๋ถํ์ค(x) ๋๋ ๋ถํ์ค(x)์์ 1)๋ก ๋ณํ๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
(??)
๋ clock ์ ํธ๊ฐ ์ด๋ค ๊ฐ์ผ๋ก๋ ๋ณํ ์ ์์์ ๋ํ๋ ๋๋ค.
-
๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ฆ, ํ์ฌ ์ํq
๋ฅผ ์ ์งํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ย
table // d clock clear : q : q+ ? ? 1 : ? : 0 ; // clear๊ฐ 1์ด๋ฉด ์ถ๋ ฅ q = 0 ? ? f : ? : - ; // clear์ ์์ ์์ง ๋ฌด์ 1 f 0 : ? : 1 ; // clock์ ์์ ์์ง์์ ๋ฐ์ดํฐ ๋์น 0 f 0 : ? : 0 ; // clock์ ์์ ์์ง์์ ๋ฐ์ดํฐ ๋์น ? (1x) 0 : ? : - ; // clock์ด ๋ถํ์ค ์ํ๋ก ์ ํ๋ ๋ q ์ ์ง ? p 0 : ? : - ; // clock์ ์์ ์์ง ๋ฌด์ * ? 0 : ? : - ; // d๊ฐ ๋ณ๊ฒฝ๋์ด๋ clock์ด ์์ ์ ์ด๋ฉด q ์ ์ง endtable
- ์ด ํ
์ด๋ธ์ ์
๋ ฅ
d
,clock
,clear
์ ๋ฐ๋ผ ์ถ๋ ฅq
๊ฐ ์ด๋ป๊ฒ ๋ณํํ๋์ง๋ฅผ ์ ์ํฉ๋๋ค.
(1x)
๋clock
์ด ๋ถํ์คํ ์ํ๋ก ์ ํ๋ ๋๋ฅผ ์๋ฏธํ๋ฉฐ, ์ฌ๊ธฐ์๋๋ ์ํ ๋ณ๊ฒฝ ์์์ ๋ํ๋ ๋๋ค.
ย
๊ธฐํธ | ์๋ฏธ | ์ค๋ช
|
? | 0, 1, x | ์ถ๋ ฅ ํ๋์์ ๋ช
์ํ ์ ์์ |
b | 0, 1 | ์ถ๋ ฅ ํ๋์์ ๋ช
์ํ ์ ์์ |
- | ์ํ ๊ฐ ๋ณํ ์์ | ์์ฐจ์ UDP์ ์ถ๋ ฅ ํ๋์์๋ง ๋ช
์ ๊ฐ๋ฅ |
r | (01) | ์ ํธ์ ์์น ์์ง |
f | (10) | ์ ํธ์ ํ๊ฐ ์์ง |
p | (01), (0x) ๋๋ (x1) | ์ ํธ์ ์ ์ฌ์ ์์น ์์ง |
n | (10), (1x) ๋๋ (x0) | ์ ํธ์ ์ ์ฌ์ ํ๊ฐ ์์ง |
* | (??) | ์ ํธ์ ์ด๋ค ๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ |