์ง์์ ์ธ ํ ๋น (Continuous Assignments)
- ์ง์์ ์ธ ํ ๋น์ ๋ฐ์ดํฐํ๋ก์ฐ ๋ชจ๋ธ๋ง์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ๋ฌธ์ผ๋ก, ๋ท์ ๊ฐ์ ์ฃผ์ ํ๋๋ฐ ์ฌ์ฉ๋จ
- ์ด ํ ๋น์ ํ๋ก์ ์ค๋ช ์์ ๊ฒ์ดํธ๋ฅผ ๋์ฒดํจ
continuous_assign ::= assign I drive_strength 1 | delay3 1 list _of_net_assignments; list_of_net_assignments ::= net_assignment { , net_assignment } net_assignment ::= net_lvalue = expression
- ์ง์์ ์ธ ํ ๋น์ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ ๊ฐ์ง
- ์ง์์ ์ธ ํ ๋น์ ํญ์ ํ์ฑํ๋์ด ์์
- ์ผ์ชฝ ํญ์ ํญ์ ์ค์นผ๋ผ ๋๋ ๋ฒกํฐ ๋ท์ด์ด์ผ ํจ (์ฐ๊ฒฐ๋ ์ ์์)
- ์ค๋ฅธ์ชฝ ํญ์ ๋ ์ง์คํฐ๋ ๋ท, ๋๋ ํจ์ ํธ์ถ์ด ๋ ์ ์์
- ํ ๋น์ ๋ํด ์๊ฐ ๋จ์๋ก ์ง์ฐ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
// ์ง์์ ์ธ ํ ๋น. out์ ๋ท(net)์. i1๊ณผ i2 ์ญ์ ๋ท์ assign out = i1 & i2; // ๋ฒกํฐ ๋ท์ ์ํ ์ง์์ ์ธ ํ ๋น. addr์ 16๋นํธ ๋ฒกํฐ ๋ท์ // addr1๊ณผ addr2๋ 16๋นํธ ๋ฒกํฐ ๋ ์ง์คํฐ์ assign addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0]; // ์ฐ๊ฒฐ(Concatenation). ์ผ์ชฝ ํผ์ฐ์ฐ์๋ ์ค์นผ๋ผ ๋ท๊ณผ ๋ฒกํฐ ๋ท์ ์ฐ๊ฒฐ์ assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in;
- ์๋ฌต์ ์ง์์ ํ ๋น
- ๋ท์ด ์ ์ธ๋ ๋ ์ง์์ ์ธ ํ ๋น์ด ๋ท์ ๋์ฒด๋ ์ ์์
// ์ผ๋ฐ ์ง์์ ํ ๋น wire out; assign out = in1 & in2; // ์์์ ์ง์์ ํ ๋น์ ์ฌ์ฉํ์ฌ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ wire out = in1 & in2;
out
์ด๋ผ๋ ์ด๋ฆ์ wire(๋ท)์ ์ ์ธํ๊ณ ์ด wire์ in1
๊ณผ in2
์ AND ๋
ผ๋ฆฌ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ง์์ ์ผ๋ก ํ ๋นํจin1
๊ณผ in2
์ AND ๋
ผ๋ฆฌ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ out
์ด๋ผ๋ wire์ ํ ๋นํ๋ ๊ฒ์ธ๋ฐ, ์ด๋ ์ฒซ ๋ฒ์งธ ์น์
์ ์ฝ๋์ ๋์ผํ ์์
์ ์ํํ๋, ์ข ๋ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํ ์ค๋ก ํํํ๊ณ ์์- ์๋ฌต์ ๋ท ์ ์ธ
- ์ง์์ ์ธ ํ ๋น ์ผ์ชฝ์ ์ ํธ ์ด๋ฆ์ด ์ฌ์ฉ๋๋ฉด, ๊ทธ ์ ํธ ์ด๋ฆ์ ๋ํด ์๋ฌต์ ๋ท ์ ์ธ์ด ์ ์ถ๋จ
// ์ง์์ ํ ๋น. out์ ๋ท(net)์ wire i1, i2; assign out = i1 & i2; // out์ด ์์ด์ด(wire)๋ก ์ ์ธ๋์ง ์์์์ ์ฃผ์ // ๊ทธ๋ฌ๋ ์๋ฎฌ๋ ์ดํฐ์ ์ํด out์ ๋ํ ์์์ ์ธ ์์ด์ด ์ ์ธ์ด ์ํ๋จ
out
์ด ๋ท(net)์ด๋ผ๊ณ ์ค๋ช
ํ๊ณ ์์i1
๊ณผi2
์ ๋ํดwire
ํ์ ์ผ๋ก ์ ์ธ์ด ์ด๋ฃจ์ด์ก์assign out = i1 & i2;
์ด ๋ถ๋ถ์out
์ด๋ผ๋ ๋ท(net)์i1
๊ณผi2
์ AND ๋ ผ๋ฆฌ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ง์์ ์ผ๋ก ํ ๋นํ๊ณ ์์
out
์ด ๋ช
์์ ์ผ๋ก wire
๋ก ์ ์ธ๋์ง ์์์ง๋ง, ์๋ฎฌ๋ ์ดํฐ๊ฐ out
์ ๋ํด ์์์ ์ผ๋ก wire
์ ์ธ์ ์ํํ๋ค๋ ์ ์ ์ง์ ํ๊ณ ์์- ๋ช ์์ ์ ์ธ์ด ๊ถ์ฅ๋จ
ย
๊ฒ์ดํธ ๋๋ ์ด
- ์ ๊ท ํ ๋น ๋๋ ์ด๋ ์ฐ์ ํ ๋น ๊ตฌ๋ฌธ์์ ๋๋ ์ด ๊ฐ์ ํ ๋นํ๋ ๊ฒ์
- ๋๋ ์ด ๊ฐ์
assign
ํค์๋ ํ์ ์ง์ ๋จ
assign #10 out = in1 & in2; // ์ง์์ ํ ๋น์์์ ๋๋ ์ด
- ๊ด์ฑ ๋๋ ์ด
- ํ ๋น ๊ตฌ๋ฌธ์ ๋๋ ์ด๋ณด๋ค ์งง์ ์ ๋ ฅ ํ์ค๋ ์ถ๋ ฅ์ ์ ํํ์ง ์์ (์: ๊ธ๋ฆฌ์น/๋ ธ์ด์ฆ)
- ๊ด์ฑ ๋๋ ์ด๋ ๋ํ ๊ฒ์ดํธ ๋๋ ์ด์ ์ ์ฉ๋๋ฉฐ, 5์ฅ์์ ๋ ผ์๋จ
- ์๋ฌต์ ์ง์ ํ ๋น ๋๋ ์ด๋ ๋ท์ ๋๋ ์ด์ ํ ๋น์ ๋ชจ๋ ์ง์ ํ๋ ๊ฒ
// ์์์ ์ง์์ ํ ๋น ๋๋ ์ด wire #10 out = in1 & in2; // ๋ค์๊ณผ ๋์ผํจ wire out; assign #10 out = in1 & in2;
- ๋ท ์ ์ธ ๋๋ ์ด๋ ๋ท์ ์ง์์ ์ธ ํ ๋น์ ๋์ง ์๊ณ ๋ท์ ๋ํด ๋๋ ์ด๋ฅผ ์ง์ ํ๋ ๊ฒ
//๋ท(net) ๋๋ ์ด wire #10 out; assign out = in1 & in2; //์ ๊ตฌ๋ฌธ์ ์๋์ ๋์ผํ ํจ๊ณผ๋ฅผ ๊ฐ์ง wire out; assign #10 out = in1 & in2;
- ์ ๊ท ํ ๋น ๋๋ ์ด๊ฐ ๊ถ์ฅ๋จ
ย
ํํ์, ํผ์ฐ์ฐ์, ์ฐ์ฐ์
- ํํ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฐ์ฐ์์ ํผ์ฐ์ฐ์๋ฅผ ๊ฒฐํฉํ๋ ๊ตฌ์กฐ์ ๋๋ค.
// ํํ์์ ์ a^b addr1[20:17] + addr2[20:17] in1 | in2
- ํผ์ฐ์ฐ์๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์ค ํ๋๊ฐ ๋ ์ ์์
- ์๋ฅผ ๋ค์ด, ์์, ์ ์, ๋ท, ๋ ์ง์คํฐ, ์๊ฐ, ํจ์ ํธ์ถ ๋ฑ
integer count, final_count; // count์ final_count๋ฅผ ์ ์ํ ๋ณ์๋ก ์ ์ธํจ final_count = count + 1 // count๋ ์ ์ํ ํผ์ฐ์ฐ์ real a, b, c; c = a - b; // a์ b๋ ์ค์ํ ํผ์ฐ์ฐ์ reg [15:0] reg1, reg2; reg [3:0] reg_out; reg_out = reg1[3:0] ^ reg2[3:0]; // reg1[3:0]๊ณผ reg2[3:0]์ ๋ถ๋ถ ์ ํ ๋ ์ง์คํฐ ํผ์ฐ์ฐ์ reg ret_value; ret_value = calculate_parity (A, B); // calculate_parity๋ ํจ์ ํ์ ์ ํผ์ฐ์ฐ์์ ๋๋ค.
- ์ฐ์ฐ์๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ธฐ ์ํด ํผ์ฐ์ฐ์์ ์์ฉํจ
ย
์ฐ์ฐ์ ์ ํ
- Verilog๋ ๋ง์ ๋ค๋ฅธ ์ ํ์ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํจ
- ์๋ฅผ ๋ค์ด, ์ฐ์ , ๋ ผ๋ฆฌ, ๊ด๊ณ, ๋๋ฑ, ๋นํธ๋ณ, ์ถ์, ์ํํธ, ์ฐ๊ฒฐ, ๋๋ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์ (C์ ์ ์ฌํ ์ผ๋ถ)
ย
์ฐ์ ์ฐ์ฐ์
- ์ดํญ ์ฐ์ฐ์ (ํผ์ฐ์ฐ์ ๋ ๊ฐ)
- ๊ณฑํ๊ธฐ (*), ๋๋๊ธฐ (/), ๋ํ๊ธฐ (+), ๋นผ๊ธฐ (-), ์ ๊ณฑ (**), ๋ฐ ๋๋จธ์ง (%)
A = 4'b0011; B = 4'b0100; // A์ B๋ ๋ ์ง์คํฐ ๋ฒกํฐ D = 6; E = 4; F = 2 // D์ E๋ ์ ์ A * B // A์ B๋ฅผ ๊ณฑํจ. ๊ฒฐ๊ณผ๋ 4'b1100 D / E // D๋ฅผ E๋ก ๋๋. ๊ฒฐ๊ณผ๋ 1์ ๋๋ค. ์์ ๋ถ๋ถ์ ๋ฒ๋ฆผ A + B // A์ B๋ฅผ ๋ํจ. ๊ฒฐ๊ณผ๋ 4'b0111 B - A // B์์ A๋ฅผ ๋บ. ๊ฒฐ๊ณผ๋ 4'b0001 F = E**F; // E์ F ์ ๊ณฑ์. ๊ฒฐ๊ณผ๋ 16
in1 = 4'b101x; in2 = 4'b1010; sum = in1 + in2; // sum์ 4'bx ๊ฐ์ผ๋ก ํ๊ฐ๋ ๊ฒ์
13 % 3 // 1๋ก ํ๊ฐ๋จ 16 % 4 // 0์ผ๋ก ํ๊ฐ๋จ -7 % 2 // -1๋ก ํ๊ฐ๋จ. ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์์ ๋ถํธ๋ฅผ ๊ฐ์ ธ์ด 7 % -2 // +1๋ก ํ๊ฐ๋จ. ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์์ ๋ถํธ๋ฅผ ๊ฐ์ ธ์ด
ย
- ๋จํญ ์ฐ์ฐ์ (ํผ์ฐ์ฐ์ ํ๋)
- + ๋ฐ - ์ฐ์ฐ์๋ ๋จํญ์ฐ์ฐ์๋ก ์๋ํ ์ ์๊ณ ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง
-4 // ์์ 4 +5 // ์์ 5
// ์ ์ ๋๋ ์ค์ ์ฌ์ฉ์ ๊ถ์ฅ -10 / 5 // -2๋ก ํ๊ฐ๋จ // <sss>'โนbase>โนnnn> ํ์ ์ ์ซ์ ์ฌ์ฉํ์ง ์๊ธฐ -'10 / 5 // (2์ ๋ณด์ 10) / 5์ ๋์ผํจ. ์ฆ, (2^32 - 10)/5 // 4294967286/5 = 858993457 // ์ฌ๊ธฐ์ 32๋ ๊ธฐ๋ณธ ๋จธ์ ์๋ ํญ์ // ์ด๋ ๋ถ์ ํํ๊ณ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๋ก ํ๊ฐ๋จ
ย
๋ ผ๋ฆฌ ์ฐ์ฐ์
- ๋
ผ๋ฆฌ ์ฐ์ฐ์๋ ๋
ผ๋ฆฌ AND (
&&
), OR (||
), NOT (!
)์ - ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ํญ์ 1๋นํธ ๊ฐ, 0(๊ฑฐ์ง), 1(์ฐธ), ๋๋ x(๋ชจํธํ ์ํ)๋ก ํ๊ฐ๋จ
- ํผ์ฐ์ฐ์ ๋นํธ ์ค ์ด๋ ๊ฒ์ด x ๋๋ z์ด๋ฉด x (๋ชจํธํ ์กฐ๊ฑด)๊ณผ ๋์ผํ๊ฒ ์ทจ๊ธ๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ฑฐ์ง์ผ๋ก ์ฒ๋ฆฌ๋จ
- ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ๋ณ์ ๋๋ ํํ์์ ํผ์ฐ์ฐ์๋ก ์ทจํจ
// ๋ ผ๋ฆฌ ์ฐ์ฐ A = 3; B = 0; A & B // 0์ผ๋ก ํ๊ฐ๋จ. (logical-1 && logical-0)์ ๋์ผํจ A | B // 1๋ก ํ๊ฐ๋จ. (logical-1 || logical-0)์ ๋์ผํจ !A // 0์ผ๋ก ํ๊ฐ๋จ. (logical-1์ NOT)๊ณผ ๋์ผํจ !B // 1๋ก ํ๊ฐ๋จ. (logical-0์ NOT)๊ณผ ๋์ผํจ // ์ ์ ์๋ ๊ฐ A = 2'b0x; B = 2'b10; A & B // x๋ก ํ๊ฐ๋จ. (x && logical-1)๊ณผ ๋์ผํจ // ํํ์ (a == 2) && (b == 3) // a == 2 ์ b == 3 ์ด ๋ชจ๋ ์ฐธ์ธ ๊ฒฝ์ฐ 1๋ก ํ๊ฐ๋จ // ๋ ์ค ํ๋๋ผ๋ ๊ฑฐ์ง์ด๋ฉด 0์ผ๋ก ํ๊ฐ๋จ
ย
๊ด๊ณ ์ฐ์ฐ์
๊ด๊ณ ์ฐ์ฐ์๋ ํฐ (>), ์์ (<), ํฌ๊ฑฐ๋ ๊ฐ์ (>=), ์๊ฑฐ๋ ๊ฐ์ (<=`)์
- ํผ์ฐ์ฐ์์ ์๋ ค์ง์ง ์์ (์ฆ, x) ๋นํธ ๋๋ z ๋นํธ๊ฐ ์์ผ๋ฉด, ํํ์์ x ๊ฐ์ ๊ฐ์ง
- ์ด ์ฐ์ฐ์๋ค์ C ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์์ ํด๋น ์ฐ์ฐ์์ ์์ ํ ๋์ผํ ๊ธฐ๋ฅ์ ํจ
// A = 4, B = 3 // Y = 4'b1010, X = 4'b1101, Z = 4'b1xxx A < B // ๋ ผ๋ฆฌ์ ์ผ๋ก 0์ผ๋ก ํ๊ฐ๋จ A > B // ๋ ผ๋ฆฌ์ ์ผ๋ก 1์ผ๋ก ํ๊ฐ๋จ Y > X // ๋ ผ๋ฆฌ์ ์ผ๋ก 1๋ก ํ๊ฐ๋จ Y < Z // x๋ก ํ๊ฐ๋จ
Y < Z
์์ Z
๋ 'x'๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ณผ๋ 'x'๋ก ํ๊ฐ๋๋ฉฐ ์ด๋ ๊ฐ์ด ์๋ ค์ง์ง ์์์์ ์๋ฏธํจ๋๋ฑ ์ฐ์ฐ์
- ๋๋ฑ ์ฐ์ฐ์๋ ๋
ผ๋ฆฌ์ ๋๋ฑ (
==
), ๋ถ๋ฑ (!=
), ์ผ์ด์ค ๋๋ฑ (===
), ์ผ์ด์ค ๋ถ๋ฑ (!==
)์ - ์ผ์ด์ค ๋๋ฑ ์ฐ์ฐ์ (
===
,!==
)๋ ๋นํธ ๋จ์๋ก ํผ์ฐ์ฐ์๋ฅผ ๋น๊ตํ๊ณ x์ z๋ฅผ ํฌํจํ ๋ชจ๋ ๋นํธ๋ฅผ ๋น๊ตํจ (์ฆ, x ๊ฒฐ๊ณผ๋ ๋์ค์ง ์์)
// A = 4, B = 3 // X = 4'b1010, Y = 4'b1101 // Z = 4'b1xxz, M = 4'b1xxz, N = 4'b1xxx A == B // ๋ ผ๋ฆฌ์ 0์ ๊ฒฐ๊ณผ๋ก ํจ X != Y // ๋ ผ๋ฆฌ์ 1์ ๊ฒฐ๊ณผ๋ก ํจ X == Z // x๋ฅผ ๊ฒฐ๊ณผ๋ก ํจ Z == M // ๋ ผ๋ฆฌ์ 1์ ๊ฒฐ๊ณผ๋ก ํจ (๋ชจ๋ ๋นํธ๊ฐ ์ผ์น, x์ z ํฌํจ) Z == N // ๋ ผ๋ฆฌ์ 0์ ๊ฒฐ๊ณผ๋ก ํจ (๊ฐ์ฅ ๋ฎ์ ์ ํจ ๋นํธ๊ฐ ์ผ์นํ์ง ์์) M !== N // ๋ ผ๋ฆฌ์ 1์ ๊ฒฐ๊ณผ๋ก ํจ
ย
๋นํธ ์ฐ์ฐ์
- ๋นํธ ์ฐ์ฐ์๋ ๋ถ์ (
~
), AND (&
), OR (|
), XOR (^
), XNOR (^~
,~^
)์ - ํ ํผ์ฐ์ฐ์๊ฐ ๋ค๋ฅธ ํผ์ฐ์ฐ์๋ณด๋ค ์งง์ผ๋ฉด ๊ธธ์ด๊ฐ ๊ธด ํผ์ฐ์ฐ์์ ๊ธธ์ด์ ๋ง์ถ์ด 0์ผ๋ก ๋นํธ ํ์ฅ๋จ (์:
4'b1111 & 2'b11 โ 4'b0011
)
// X = 4'b1010, Y = 4'b1101 // Z = 4'b10x1 ~X // ๋นํธ ๋จ์ NOT ์ฐ์ฐ. ๊ฒฐ๊ณผ๋ 4'b0101 X & Y // ๋นํธ ๋จ์ AND ์ฐ์ฐ. ๊ฒฐ๊ณผ๋ 4'b1000 X | Y // ๋นํธ ๋จ์ OR ์ฐ์ฐ. ๊ฒฐ๊ณผ๋ 4'b1111 X ^ Y // ๋นํธ ๋จ์ XOR ์ฐ์ฐ. ๊ฒฐ๊ณผ๋ 4'b0111 X ^~ Y // ๋นํธ ๋จ์ XNOR ์ฐ์ฐ. ๊ฒฐ๊ณผ๋ 4'b1000 X & Z // ๊ฒฐ๊ณผ๋ 4'b10x0
X & Z
: X์ Z์ ๋นํธ ๋จ์ AND ์ฐ์ฐ. ํ์ง๋ง, Z์ ๋นํธ ์ค์๋ 'x'(์ ์ ์๋ ๊ฐ)๊ฐ ์๊ธฐ ๋๋ฌธ์, ํด๋น ์์น์ ๋ํ ๊ฒฐ๊ณผ ์ญ์ 'x'๊ฐ ๋จ. ๋ฐ๋ผ์ 1010
AND 10x1
์ 10x0
์ ๊ฒฐ๊ณผ๋ก ํจ~
, &
, |
์ ๋
ผ๋ฆฌ ์ฐ์ฐ์ !
, &&
, ||
์ ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ค์ํจ// X = 4'b1010, Y = 4'b0000 X | Y // ๋นํธ ๋จ์ ์ฐ์ฐ. ๊ฒฐ๊ณผ๋ 4'b1010 X || Y // ๋ ผ๋ฆฌ ์ฐ์ฐ. 1 || 0๊ณผ ๋๋ฑํจ. ๊ฒฐ๊ณผ๋ 1.
ย
๊ฐ์ & ์ฌํํธ ์ฐ์ฐ์
- ๊ฐ์ ์ฐ์ฐ์๋ AND (
&
), NAND (~&
), OR (|
), NOR (~|
), XOR (^
), XNOR (~^
,^~
)์ - ๊ฐ์ ์ฐ์ฐ์๋ ๋จ์ผ ํผ์ฐ์ฐ์๋ง ์ทจํ๊ณ , ๋จ์ผ ๋ฒกํฐ ํผ์ฐ์ฐ์์ ๋นํธ ๋จ์ ์ฐ์ฐ์ ์ํํ์ฌ 1๋นํธ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํจ
// X = 4'b1010 &X // 1 & 0 & 1 & 0์ ํด๋นํจ. ๊ฒฐ๊ณผ๋ 1'b0 |X // 1 | 0 | 1 | 0์ ํด๋นํจ. ๊ฒฐ๊ณผ๋ 1'b1 ^X // 1 ^ 0 ^ 1 ^ 0์ ํด๋นํจ. ๊ฒฐ๊ณผ๋ 1'b0 // ๊ฐ์ xor ๋๋ xnor๋ ๋ฒกํฐ์ ์ง์ ๋๋ ํ์ ํจ๋ฆฌํฐ ์์ฑ์ ์ฌ์ฉ๋ ์ ์์
- ์ฌํํธ ์ฐ์ฐ์๋ ์ค๋ฅธ์ชฝ ์ฌํํธ (
>>
), ์ผ์ชฝ ์ฌํํธ (<<
), ์ฐ์ ์ค๋ฅธ์ชฝ ์ฌํํธ (>>>
), ์ฐ์ ์ผ์ชฝ ์ฌํํธ (<<<
)์ - ์ฌํํธ ์ฐ์ฐ์ ์ํ์ผ๋ก ๋์๊ฐ์ง ์์
// X = 4'b1100 Y = X >> 1; // Y๋ 4'b0110์. ์ค๋ฅธ์ชฝ์ผ๋ก 1๋นํธ ์ด๋ํจ. MSB ์์น์๋ 0์ด ์ฑ์์ง Y = X << 1; // Y๋ 4'b1000์. ์ผ์ชฝ์ผ๋ก 1๋นํธ ์ด๋ํจ. LSB ์์น์๋ 0์ด ์ฑ์์ง Y = X << 2; // Y๋ 4'b0000์. ์ผ์ชฝ์ผ๋ก 2๋นํธ ์ด๋ํจ integer a, b, c; // signed ๋ฐ์ดํฐ ํ์ ์ a = 0; // 111โฆ..1110110 (-10) >>> 3 b = -10; // 11111...10110 ์ด์ง์์ c = a + b >>> 3; // ์ฐ์ shift๋ก ์ธํด ๊ฒฐ๊ณผ๋ -2(10์ง์)์
ย
์ฐ๊ฒฐ & ๋ณต์ ์ฐ์ฐ์
- ์ฐ๊ฒฐ ์ฐ์ฐ์ (
{, }
)๋ ์ฌ๋ฌ ํผ์ฐ์ฐ์๋ฅผ ์ด์ด๋ถ์ด๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ - ํผ์ฐ์ฐ์๋ ํฌ๊ธฐ๊ฐ ์ง์ ๋์ด์ผ ํจ
// A = 1'b1, B = 2'b00, C = 2'b10, D = 3'b110 Y = {B, C} // ๊ฒฐ๊ณผ Y๋ 4'b0010 Y = {A, B, C, D, 3'b001} // ๊ฒฐ๊ณผ Y๋ 11'b10010110001 Y = {A, B[0], C[1]} // ๊ฒฐ๊ณผ Y๋ 3'b101
- ๋์ผํ ๋ฒํธ์ ๋ฐ๋ณต์ ์ธ ์ฐ๊ฒฐ์ ๋ณต์ ์์๋ฅผ ์ฌ์ฉํ์ฌ ํํํ ์ ์์
reg A; reg [1:0] B, C; reg [2:0] D; A = 1'b1; B = 2'b00; C = 2'b10; D = 3'b110; Y = { 4{A} } // ๊ฒฐ๊ณผ Y๋ 4'b1111 Y = { 4{A}, 2{B} } // ๊ฒฐ๊ณผ Y๋ 8'b11110000 Y = { 4{A}, 2{B}, C} // ๊ฒฐ๊ณผ Y๋ 10'b1111000010
์กฐ๊ฑด ์ฐ์ฐ์
- ์กฐ๊ฑด ์ฐ์ฐ์ (
?:
)๋ ์ธ ๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ์ทจํจ - ๋์์ ๋ฉํฐํ๋ ์์ ์ ์ฌํจ
// 3์ํ ๋ฒํผ์ ๊ธฐ๋ฅ ๋ชจ๋ธ๋ง assign addr_bus = drive_enable ? addr_out : 36'bz; // 2๋1 ๋ฉํฐํ๋ ์์ ๊ธฐ๋ฅ ๋ชจ๋ธ๋ง assign out = control ? in1 : in0;
- ์กฐ๊ฑด ์ฐ์ฐ์ ์ค์ฒฉ๋ ์ ์์
assign out = (A == 3) ? ( control ? x: y): ( control ? m : n);
ย
์ฐ์ฐ์ ์ฐ์ ์์
- Verilog๋ ํํ์์ ๋ถ๋ถ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๊ดํธ๊ฐ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ, ์์ฒด ์ฐ์ ์์๋ฅผ ๊ฐ์ ํฉ๋๋ค.
- ๋ชจํธํจ์ ํผํ๊ธฐ ์ํด ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ๊ทน ๊ถ์ฅํฉ๋๋ค.
ย
4-to-1 ๋ฉํฐํ๋ ์
- ๋ ผ๋ฆฌ ๋ฐฉ์ ์
// ๋ฐ์ดํฐ ํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ 4-to-1 ๋ฉํฐํ๋ ์ ๋ชจ๋. ๋ ผ๋ฆฌ ๋ฐฉ์ ์ // ๊ฒ์ดํธ ๋ ๋ฒจ ๋ชจ๋ธ๊ณผ ๋น๊ต module mux4_to_1 (out, i0, il, i2, i3, s1, s0); // I/0 ๋ค์ด์ด๊ทธ๋จ์์ ํฌํธ ์ ์ธ output out; input i0, il, i2, i3; input s1, s0; // out์ ์ํ ๋ ผ๋ฆฌ ๋ฐฉ์ ์ assign out = (~s1 & ~s0 & i0) | (~s1 & s0 & i1) | (s1 & ~s0 & i2) | (s1 & s0 & i3); endmodule
- ์กฐ๊ฑด ์ฐ์ฐ์
// ๋ฐ์ดํฐ ํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ 4-to-1 ๋ฉํฐํ๋ ์ ๋ชจ๋. ์กฐ๊ฑด๋ถ ์ฐ์ฐ์ ์ฌ์ฉ // ๊ฒ์ดํธ ๋ ๋ฒจ ๋ชจ๋ธ๊ณผ ๋น๊ต module multiplexer4_to_1 (out, i0, i1, i2, i3, s1, s0); // I/O ๋ค์ด์ด๊ทธ๋จ์์ ํฌํธ ์ ์ธ output out; input io, il, i2, i3; input s1, s0; // ์ค์ฒฉ๋ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์ ์ฌ์ฉ assign out = s1 ? (s0 ? i3 : i2) : (s0 ? i1 : i0); endmodule
ย
ย
4๋นํธ ํ ์ ๋
- ๋ฐ์ดํฐํ๋ก์ฐ ์ฐ์ฐ์
// ๋ฐ์ดํฐํ๋ก์ฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ 4๋นํธ ํ ์ ๋๋ฅผ ์ ์ํจ module fulladd4 (sum, c_out, a, b, c_in); // I/O ํฌํธ ์ ์ธ output [3:0] sum; output c_out; input[3:0] a, b; input c_in; // ์ ์ฒด ๋ง์ ๊ธฐ์ ๊ธฐ๋ฅ์ ์ง์ ํจ assign {c_out, sum} =a + b + c_in; endmodule
ย
๋ฆฌํ ์นด์ดํฐ
- 4๋นํธ ๋ฆฌํ ์นด์ดํฐ
// ๋ฆฌํ ์นด์ดํฐ 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-ํ๋ฆฝํ๋กญ
// ์ฃ์ง ํธ๋ฆฌ๊ฑฐ I-ํ๋ฆฝํ๋กญ. ๋งค ํด๋ก ์ฌ์ดํด๋ง๋ค ํ ๊ธ๋จ. module I_FF (q, clk, clear); // ์ /์ถ๋ ฅ ํฌํธ๋ค output q; input clk, clear; // ์ฃ์ง ํธ๋ฆฌ๊ฑฐ D-ํ๋ฆฝํ๋กญ ์ธ์คํด์คํ // q์ ๋ณด์๊ฐ ๋๋์์ด. // qbar๋ ํ์ํ์ง ์์. ์ฐ๊ฒฐ๋์ง ์์ ํฌํธ. edge_dff ff1(q, , ~q, clk, clear); endmodule
- ์ฃ์ง ํธ๋ฆฌ๊ฑฐ D-ํ๋ฆฝํ๋กญ
// ์ฃ์ง ํธ๋ฆฌ๊ฑฐ D ํ๋ฆฝํ๋กญ module edge_dff(q, qbar, d, clk, clear); // ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ output q, qbar; // q๋ ์ผ๋ฐ ์ถ๋ ฅ, qbar๋ q์ ๋ฐ์ ์ถ๋ ฅ input d, clk, clear; // d๋ ๋ฐ์ดํฐ ์ ๋ ฅ, clk๋ ํด๋ก ์ ํธ, clear๋ ๋น๋๊ธฐ ๋ฆฌ์ // ๋ด๋ถ ๋ณ์ wire s, sbar, r, rbar, cbar; // ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ฐ๊ฒฐ ์ // ๋ฐ์ดํฐ ํ๋ก์ฐ ๋ฌธ // clear ์ ํธ์ ๋ฐ์ ์์ฑ assign cbar = ~clear; // clear ์ ํธ์ ๋ฐ์ // ์ ๋ ฅ ๋์น; ๋ ๋ฒจ ๊ฐ์ง์์ ์ฃผ๋ชฉ. Edge-sensitive ํ๋ฆฝํ๋กญ์ 3๊ฐ์ SR ๋์น๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋จ // ๋ค์์ ๊ฐ ๋์น์ ๋์์ ์ ์ํ๋ ๋ ผ๋ฆฌ ์ฐ์ฐ์ ๋๋ค. assign sbar = ~(rbar & s), // sbar ๋ rbar์ s์ AND ์ฐ์ฐ์ NOT ๊ฒฐ๊ณผ s = ~(sbar & cbar & ~clk), // s๋ sbar, cbar, clk์ NOT์ AND ์ฐ์ฐ์ NOT ๊ฒฐ๊ณผ r = ~(rbar & ~clk & s), // r๋ rbar, clk์ NOT, s์ AND ์ฐ์ฐ์ NOT ๊ฒฐ๊ณผ rbar = ~(r & cbar & d); // rbar๋ r, cbar, d์ AND ์ฐ์ฐ์ NOT ๊ฒฐ๊ณผ // ์ถ๋ ฅ ๋์น // ๋ค์์ ์ถ๋ ฅ ๋์น์ ์ํ๋ฅผ ๊ฒฐ์ ํ๋ ๋ ผ๋ฆฌ ์ฐ์ฐ์ ๋๋ค. assign q = ~(s & qbar); // q๋ s์ qbar์ AND ์ฐ์ฐ์ NOT ๊ฒฐ๊ณผ assign qbar = ~(q & r & cbar); // qbar๋ q, r, cbar์ AND ์ฐ์ฐ์ NOT ๊ฒฐ๊ณผ endmodule
- ์คํฐ๋ฎฌ๋ฌ์ค
// ์์ ๋ ๋ฒจ ์คํฐ๋ฎฌ๋ฌ์ค ๋ชจ๋ module stimulus; // ์ ๋ ฅ์ ์๊ทนํ๊ธฐ ์ํ ๋ณ์ ์ ์ธ reg CLOCK, CLEAR; // CLOCK๊ณผ CLEAR ์ ํธ๋ฅผ ์ํ ๋ ์ง์คํฐ wire [3:0] Q; // 4๋นํธ ์ถ๋ ฅ Q๋ฅผ ์ํ ์์ด์ด initial // ์๋ฎฌ๋ ์ด์ ๋์์ ๊ฐ ๋ณํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ์์คํ ํ์คํฌ $monitor($time, " Count = %b Clear = %b", Q[3:0], CLEAR); // ์ค๊ณ ๋ธ๋ก 'counter'์ ์ธ์คํด์ค ์์ฑ counter c1(Q, CLOCK, CLEAR); // Clear ์ ํธ์ ๋ํ ์คํฐ๋ฎฌ๋ฌ์ค initial begin CLEAR = 1'b1; // ์ด๊ธฐ์ CLEAR๋ฅผ ๋์ ์ํ๋ก ์ค์ #34 CLEAR = 1'b0; // 34 ์๊ฐ ๋จ์ ํ์ CLEAR๋ฅผ ๋ฎ์ ์ํ๋ก ๋ณ๊ฒฝ #200 CLEAR = 1'b1; // 200 ์๊ฐ ๋จ์ ํ์ ๋ค์ CLEAR๋ฅผ ๋์ ์ํ๋ก ๋ณ๊ฒฝ #50 CLEAR = 1'b0; // 50 ์๊ฐ ๋จ์ ํ์ CLEAR๋ฅผ ๋ค์ ๋ฎ์ ์ํ๋ก ๋ณ๊ฒฝ end initial begin // ํด๋ญ ์ ํธ๊ฐ 10 ์๊ฐ ๋จ์๋ง๋ค ํ ๊ธ๋๋๋ก ์ค์ CLOCK = 1'b0; // ์ด๊ธฐ์ CLOCK๋ฅผ ๋ฎ์ ์ํ๋ก ์ค์ forever #10 CLOCK = ~CLOCK; // ๋ฌดํ ๋ฃจํ ๋ด์์ 10 ์๊ฐ ๋จ์๋ง๋ค CLOCK ์ํ ํ ๊ธ end // ์๊ฐ 400์์ ์๋ฎฌ๋ ์ด์ ์ข ๋ฃ initial begin #400 $finish; // 400 ์๊ฐ ๋จ์ ํ์ ์๋ฎฌ๋ ์ด์ ์ข ๋ฃ end endmodule
- ์ด ์ฝ๋๋
stimulus
๋ผ๋ ๋ชจ๋์ ์ ์ํ๋ฉฐ, ์ด๋ ํ ์คํธ ํ๊ฒฝ์์ DUT(ํ ์คํธ ๋์ ๋๋ฐ์ด์ค)์ธcounter
๋ชจ๋์ ์ํํ๊ธฐ ์ํ ๊ฒ์
CLOCK
๊ณผCLEAR
๋ ์ ๋ ฅ ์ ์ด ์ ํธ๋ก, ์ด๋ค์ DUT์ ๋์์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋จ
- ์๋ฎฌ๋ ์ด์
์์ ์,
CLEAR
์ ํธ๊ฐ ํ์ฑํ๋์ด ์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ๊ณ , ํน์ ์๊ฐ ๊ฒฝ๊ณผ ํ์ ๋ณ๊ฒฝ๋์ด DUT์ ๋ฐ์์ ํ ์คํธํจ
CLOCK
์ ํธ๋ ์ง์์ ์ผ๋ก ํ ๊ธ๋๋ฉฐ, ์ด๋ DUT์ ํด๋ญ ์ ๋ ฅ์ ์ ๊ณตํจ
$monitor
์์คํ ํ์คํฌ๋ ์ ํธ์ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ์ฝ์์ ์ถ๋ ฅํจ. ์ด๋ฅผ ํตํด ์๋ฎฌ๋ ์ด์ ๋์Q
๋ฐCLEAR
์ ์ํ๋ฅผ ์ถ์ ํ ์ ์์
- ์๋ฎฌ๋ ์ด์ ์ ์ ์ฒด ๋์์ ๊ฒ์ฆํ ํ์ ์ข ๋ฃ๋จ
ย