์ดํ ๊ด๋ก
๊ณต๋ฐฑ
- ๊ณต๋ฐฑ (
\b
), ํญ (\t
), ์ค ๋ฐ๊ฟ (\n
)์ผ๋ก ๊ณต๋ฐฑ์ด ๊ตฌ์ฑ๋จ
- Verilog์์ ํ ํฐ์ ๊ตฌ๋ถํ๊ฑฐ๋ ๋ฌธ์์ด ์์ ์์ ๋๋ฅผ ์ ์ธํ๊ณ ๋ ๋ฌด์๋จ
- ์ฃผ์
- ํ ์ค ์ฃผ์์ โ
//
โ๋ก ์์ํจ - ์ฌ๋ฌ ์ค ์ฃผ์์ โ
/*
โ๋ก ์์ํ์ฌ โ*/
โ๋ก ๋๋จ
a = b && c; // ์ด๊ฒ์ ํ ์ค ์ฃผ์์ /* ์ด๊ฒ์ ์ฌ๋ฌ ์ค์ ๊ฑธ์น ์ฃผ์์ */ /* ์ด๊ฒ์ /* ํ์ฉ๋์ง ์๋ */ ์ฃผ์์ */ /* ์ด๊ฒ์ //ํ์ฉ๋๋ ์ฃผ์์ */
ย
์ฐ์ฐ์
- ๋จํญ, ์ดํญ, ์ผํญ ์ฐ์ฐ์๊ฐ ์์
a = ~b; // ~๋ ๋จํญ ์ฐ์ฐ์์. b๋ ํผ์ฐ์ฐ์ a = b && c; // &&๋ ์ดํญ ์ฐ์ฐ์์. b์ c๋ ํผ์ฐ์ฐ์ a = b ? c : d; // ?:๋ ์ผํญ ์ฐ์ฐ์์. b, c, d๋ ํผ์ฐ์ฐ์
ย
์ซ์ ํ๊ธฐ๋ฒ
- ํฌ๊ธฐ๊ฐ ์๋ ์ซ์: <ํฌ๊ธฐ>โ<๊ธฐ์ ํ์><์ซ์> (โd/โD, โh/โH โb/B โo/โO)
4'b1111 // 4๋นํธ ์ด์ง์ 12'habc // 12๋นํธ 16์ง์ 16'd255 // 16๋นํธ 10์ง์
- ํฌ๊ธฐ๊ฐ ์๋ ์ซ์: <ํฌ๊ธฐ>๊ฐ ์์ผ๋ฉฐ 10์ง์์ ๊ฒฝ์ฐ <๊ธฐ์ ํ์>์ ์๋ตํ ์ ์์
23456 // 32๋นํธ 10์ง์ (๊ธฐ๋ณธ๊ฐ) 'hc3 // 32๋นํธ 16์ง์ 'o21 // 32๋นํธ 8์ง์
- X ๋๋ Z ๊ฐ: X๋ ์ ์ ์๋ ๊ฐ, Z๋ ํ์ด ์ํผ๋์ค ๊ฐ์ ๋ํ๋
12'h13x // 12๋นํธ 16์ง์์ด๋ฉฐ, 4๊ฐ์ ๊ฐ์ฅ ํ์ ๋นํธ๋ ์ ์ ์์ 6'hx // 6๋นํธ 16์ง์ 32'bz // 32๋นํธ ํ์ด ์ํผ๋์ค(high impedance) ์ซ์
- ์์
-6'd3 // 3์ 2์ ๋ณด์๋ก ์ ์ฅ๋ 6๋นํธ ์์ -6'sd3 // ๋ถํธ ์๋ ์ ์ ์ํ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋จ 4'd-2 // ์๋ชป๋ ๋ช ์ธ
- ๋ฐ์ค๊ณผ ๋ฌผ์ํ: ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ์ฌ์ฉ๋จ
12'b1111_0000_1010 // ๊ฐ๋ ์ฑ์ ์ํ ๋ฐ์ค ๋ฌธ์ ์ฌ์ฉ 4'b10?? // 4'b10zz์ ๋์ผํจ
ย
๋ฌธ์์ด
- ๋ฌธ์์ด์ ์๋ฐ์ดํ (
โโ
)๋ก ๋๋ฌ์ธ์ธ ๋ฌธ์์ ๋์ด์
- ๋ฌธ์์ด์ ํ ์ค์ ํฌํจ๋์ด์ผ ํจ
"Hello Verilog World" // ๋ฌธ์์ด "a / b" // ๋ฌธ์์ด
ย
์๋ณ์์ ํค์๋
- ํค์๋๋ ์ธ์ด ๊ตฌ์ฑ์ ์ ์ํ๊ธฐ ์ํด ์์ฝ๋ ํน๋ณํ ์๋ณ์์
- ์๋ณ์๋ ๋์์ธ ๋ด์์ ์ฐธ์กฐํ ์ ์๋๋ก ๊ฐ์ฒด์ ์ฃผ์ด์ง ์ด๋ฆ์
- ์์ซ์, ๋ฐ์ค (
_
), ๋๋ ๋ฌ๋ฌ ๊ธฐํธ ($
)๋ก ๊ตฌ์ฑ๋จ - ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํจ
reg value; // reg๋ ํค์๋, value๋ ์๋ณ์ input clk; // input์ ํค์๋, clk๋ ์๋ณ์
ย
๋ฐ์ดํฐ ํ์
๊ฐ ์งํฉ
ย
์คํธ๋ ์ค ๋ ๋ฒจ
- ๋์งํธ ํ๋ก์์ ๋ค๋ฅธ ๊ฐ๋์ ๋๋ผ์ด๋ฒ ๊ฐ์ ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํจ
- ๊ฐ ๋ ๋ฒจ 0๊ณผ 1์ ์คํธ๋ ์ค ๋ ๋ฒจ์ ๊ฐ์ง ์ ์์ (์: supply0, supply1)
ย
Nets
- Nets๋ ํ๋์จ์ด ์์ ๊ฐ์ ์ฐ๊ฒฐ์ ๋ํ๋
- Nets๋ ์ฃผ๋ก wire ํค์๋๋ก ์ ์ธ๋จ
wire a; // ์์ ํ๋ก๋ฅผ ์ํด wire a๋ฅผ ์ ์ธ wire b, c; // ์์ ํ๋ก๋ฅผ ์ํด ๋ ๊ฐ์ wire b, c๋ฅผ ์ ์ธ wire d = 1'b0; // wire d๋ ์ ์ธ ์ ๋ ผ๋ฆฌ ๊ฐ 0์ผ๋ก ๊ณ ์
ย
๋ ์ง์คํฐ
- ๋ ์ง์คํฐ๋ ๋ฐ์ดํฐ ์ ์ฅ ์์๋ฅผ ๋ํ๋ด๋ฉฐ ๊ฐ์ ์ ์ง
- ๋ ์ง์คํฐ ๋ฐ์ดํฐ ํ์ ์ ์ฃผ๋ก reg ํค์๋๋ก ์ ์ธ๋จ
- Verilog์ ๋ ์ง์คํฐ ์ฉ์ด์ ํ๋์จ์ด ๋ ์ง์คํฐ (FFs)๋ฅผ ํผ๋ํ๋ฉด ์๋จ
reg reset; // reset๋ผ๋ ๊ฐ์ ์ ์งํ ์ ์๋ ๋ณ์๋ฅผ ์ ์ธํจ initial // ์ด ๊ตฌ์กฐ๋ ๋์ค์ ๋ ผ์๋ ์์ begin reset = 1'b1; // reset์ 1๋ก ์ด๊ธฐํํ์ฌ ๋์งํธ ํ๋ก๋ฅผ ๋ฆฌ์ ํจ #100 reset = 1'b0; // 100 ์๊ฐ ๋จ์ ํ์ reset์ ํด์ ๋จ end
- ๋ถํธ ๋ ์ง์คํฐ
reg signed [63:0] m; // 64๋นํธ ๋ถํธ ์๋ ๊ฐ integer i; // 32๋นํธ ๋ถํธ ์๋ ๊ฐ
ย
๋ฒกํฐ
- Nets ๋๋ reg ๋ฐ์ดํฐ ํ์ ์ ๋ฒกํฐ๋ก ์ ์ธ๋ ์ ์์ (๋ค์ค ๋นํธ ๋๋น)
- ๋ฒกํฐ๋ [high#:low#] ๋๋ [low#:high#]๋ก ์ ์ธํ ์ ์์ง๋ง, ์ผ์ชฝ ๋ฒํธ๋ ํญ์ ๋ฒกํฐ์ ๊ฐ์ฅ ์ค์ํ ๋นํธ (MSB)์
wire a; // ์ค์นผ๋ผ net ๋ณ์, ๊ธฐ๋ณธ๊ฐ wire [7:0] bus; // 8๋นํธ ๋ฒ์ค wire [31:0] busA, busB, busC; // 32๋นํธ ๋๋น์ 3๊ฐ์ ๋ฒ์ค reg clock; // ์ค์นผ๋ผ ๋ ์ง์คํฐ, ๊ธฐ๋ณธ๊ฐ reg [0:40] virtual_addr; // ๋ฒกํฐ ๋ ์ง์คํฐ, ๊ฐ์ ์ฃผ์๋ 41๋นํธ ๋๋น
- ๋ฒกํฐ ๋ถ๋ถ ์ ํ
busA[7] // ๋ฒกํฐ busA์ 7๋ฒ์งธ ๋นํธ bus[2:0] // ๋ฒกํฐ bus์ ๊ฐ์ฅ ํ์ 3๋นํธ // bus[0:2] ์ฌ์ฉ์ ๋ถ๊ฐ๋ฅํจ // ๋ฒ์ ์ง์ ์ ๊ฐ์ฅ ์์ ๋นํธ๋ ํญ์ ์ผ์ชฝ์ ์์ด์ผ ํจ virtual_addr[0:1] // ๋ฒกํฐ virtual_addr์ ๊ฐ์ฅ ์์ 2๋นํธ
- ๊ฐ๋ณ ๋ฒกํฐ ๋ถ๋ถ ์ ํ
- [
<starting_bit>+:width
] โ starting bit๋ถํฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์ ํ - [
<starting_bit>-:width
] โ starting bit๋ถํฐ ๊ฐ์ํ๋ ๋ถ๋ถ ์ ํ
reg [255:0] datal; // ๋ฆฌํ ์๋์ธ ํ๊ธฐ๋ฒ reg [0:255] data2; // ๋น ์๋์ธ ํ๊ธฐ๋ฒ reg [7:0] byte; // ๊ฐ๋ณ ํํธ ์ ํ์ ์ฌ์ฉํ์ฌ ๋ถ๋ถ์ ์ ํํ ์ ์์ byte = datal[31-:8]; // ์์ ๋นํธ = 31, ๋๋น = 8 => data[31:24] byte = datal[24+:8]; // ์์ ๋นํธ = 24, ๋๋น = 8 => data[31:24] byte = data2[31-:8]; // ์์ ๋นํธ = 31, ๋๋น = 8 => data[24:31] byte = data2[24+:8]; // ์์ ๋นํธ = 24, ๋๋น = 8 => data[24:31] // ์์ ๋นํธ๋ ๋ณ์์ผ ์ ์์. ๋๋น๋ ์์์ฌ์ผ ํจ // ๋ฐ๋ผ์ ๋ฃจํ ๋ด์์ ๋ณ์ ํํธ ์ ํ์ ์ฌ์ฉํ์ฌ ๋ฒกํฐ์ ๋ชจ๋ ๋ฐ์ดํธ๋ฅผ ์ ํํ ์ ์์ for (i=0; i<=31; i=i+1) byte = datal[(i*8)+:8]; // ์์๋ [7:0], [15:8]... [255:248]์ // ๋ฒกํฐ์ ์ผ๋ถ๋ฅผ ์ด๊ธฐํํ ์ ์์ datal[(byteNum*8)+:8] = 8'b0; // byteNum = 1์ผ ๊ฒฝ์ฐ, 8๋นํธ [15:8]๋ฅผ ํด๋ฆฌ์ดํจ
ย
์ ์
- ์ ์๋ ์์ ์กฐ์ํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ๋ชฉ์ ์ ๋ ์ง์คํฐ ๋ฐ์ดํฐ ํ์ ์ด๋ฉฐ ํค์๋ integer๋ก ์ ์ธ๋จ
integer counter; // ์นด์ดํฐ๋ก ์ฌ์ฉ๋๋ ์ผ๋ฐ ๋ชฉ์ ์ ๋ณ์ initial counter = -1; // ์นด์ดํฐ์ ์์ ๊ฐ 1์ด ์ ์ฅ
ย
์ค์
- ์ค์ ๋ ์ง์คํฐ ๋ฐ์ดํฐ ํ์ ์ real ํค์๋๋ก ์ ์ธ๋จ
real delta; // delta๋ผ๋ ์ค์ ๋ณ์๋ฅผ ์ ์ initial begin delta = 4.10e0; // delta์ ๊ณผํ์ ํ๊ธฐ๋ฒ์ผ๋ก ๊ฐ์ ํ ๋น delta = 2.13; // delta์ 2.13์ด๋ผ๋ ๊ฐ์ ํ ๋น end integer i; // i๋ผ๋ ์ ์ ๋ณ์๋ฅผ ์ ์ initial i = delta; // i๋ 2.13์ ๋ฐ์ฌ๋ฆผ๋ ๊ฐ์ธ 2๋ฅผ ์ป์
ย
์๊ฐ
- ์๊ฐ ๋ฐ์ดํฐ ํ์ ์ ์๋ฎฌ๋ ์ด์ ์๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ ํค์๋ time์ผ๋ก ์ ์ธ๋จ
time save_sim_time; // ์๋ฎฌ๋ ์ด์ ์๊ฐ์ ์ ์ฅํ time ๋ณ์๋ฅผ ์ ์ initial save_sim_time = $time; // ํ์ฌ์ ์๋ฎฌ๋ ์ด์ ์๊ฐ์ ์ ์ฅ
ย
๋ฐฐ์ด
- reg, integer, time, real ๋ฐ ๋ฒกํฐ ๋ ์ง์คํฐ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ๋ฐฐ์ด์ด ํ์ฉ๋จ
- ์ฌ๋ฌ ์ฐจ์์ ๋ฐฐ์ด์ ์ด๋ค ์ฐจ์ ์๋ก๋ ์ ์ธ๋ ์ ์์
integer count [0:7]; // 8๊ฐ์ count ๋ณ์๋ฅผ ๊ฐ๋ ๋ฐฐ์ด reg bool [31:0]; // 32๊ฐ์ 1๋นํธ boolean ๋ ์ง์คํฐ ๋ณ์๋ฅผ ๊ฐ๋ ๋ฐฐ์ด time chk_point[1:100]; // 100๊ฐ์ time ์ฒดํฌํฌ์ธํธ ๋ณ์๋ฅผ ๊ฐ๋ ๋ฐฐ์ด reg [4:0] port_id[0:7]; // ๊ฐ ํฌํธ ์์ด๋๊ฐ 5๋นํธ ๋๋น๋ฅผ ๊ฐ๋ 8๊ฐ์ ํฌํธ ์์ด๋ ๋ฐฐ์ด integer matrix [4:0][0:255]; // ์ ์ํ 2์ฐจ์ ๋ฐฐ์ด reg [63:0] array_4d [15:0][7:0][7:0][255:0]; // 4์ฐจ์ ๋ฐฐ์ด wire [7:0] w_array2 [5:0]; // 8๋นํธ ๋ฒกํฐ ์์ด์ด์ ๋ฐฐ์ด ์ ์ธ wire w_array1[7:0][5:0]; // ๋จ์ผ ๋นํธ ์์ด์ด์ ๋ฐฐ์ด ์ ์ธ
- ํ ๋น
count[5] = 0; // count ๋ณ์ ๋ฐฐ์ด์ 5๋ฒ์งธ ์์๋ฅผ ์ด๊ธฐํ chk_point[100] = 0; // 100๋ฒ์งธ time ์ฒดํฌํฌ์ธํธ ๊ฐ์ ์ด๊ธฐํ port_id[3] = 0; // port id ๋ฐฐ์ด์ 3๋ฒ์งธ ์์(5๋นํธ ๊ฐ)๋ฅผ ์ด๊ธฐํ matrix[1][0] = 33559; // [1][0]์ ์ํด ์ธ๋ฑ์ฑ๋ ์์์ ๊ฐ์ 33559๋ก ์ค์ array_4d[0][0][0][0][15:0] = 0; // ์ธ๋ฑ์ค [0][0][0][0]๋ก ์ ๊ทผ๋๋ ๋ ์ง์คํฐ์ 15:0 ๋นํธ๋ฅผ ์ด๊ธฐํ
ย
๋ฉ๋ชจ๋ฆฌ
- ๋ฉ๋ชจ๋ฆฌ๋ Verilog์์ ๋ ์ง์คํฐ์ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ชจ๋ธ๋ง๋จ
reg mem1bit [0:1023]; // 1K ํฌ๊ธฐ์ 1๋นํธ ์๋๋ฅผ ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ mem1bit reg [7:0] membyte[0:1023]; // 1K ํฌ๊ธฐ์ 8๋นํธ ์๋(๋ฐ์ดํธ)๋ฅผ ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ membyte membyte [511] // ์ฃผ์๊ฐ 511์ธ 1๋ฐ์ดํธ ์๋๋ฅผ ๊ฐ์ ธ์ด
ย
๋งค๊ฐ๋ณ์
- Verilog๋ ๋ชจ๋ ๋ด์์ parameter ํค์๋๋ก ์์๋ฅผ ์ ์ํ ์ ์๊ฒ ํจ
- ๋งค๊ฐ๋ณ์๋ ๋ณ์๋ก ์ฌ์ฉ๋ ์ ์์
parameter port_id = 5; // ์์ port id๋ฅผ ์ ์ํจ parameter cache_line_width = 256; // ์บ์์ ๋๋น๋ฅผ ์ ์ํ๋ ์์ parameter signed [15:0] WIDTH; // ๋งค๊ฐ๋ณ์ WIDTH์ ๋ํ ๊ณ ์ ๋ ๋ถํธ ๋ฐ ๋ฒ์๋ฅผ ์ค์ ํจ
- ๋ก์ปฌ ๋งค๊ฐ ๋ณ์ (ํค์๋: localparam)๋ ๊ทธ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด์๋ ์๋ ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋จ (์: ์ํ ์ธ์ฝ๋ฉ).
localparam state1 = 4'b0001, // state1์ 4๋นํธ ๊ฐ์ผ๋ก 0001์ ๊ฐ์ง state2 = 4'b0010, // state2๋ 4๋นํธ ๊ฐ์ผ๋ก 0010์ ๊ฐ์ง state3 = 4'b0100, // state3๋ 4๋นํธ ๊ฐ์ผ๋ก 0100์ ๊ฐ์ง state4 = 4'b1000; // state4๋ 4๋นํธ ๊ฐ์ผ๋ก 1000์ ๊ฐ์ง
ย
๋ฌธ์์ด
- ๋ฌธ์์ด์ reg์ ์ ์ฅ๋ ์ ์์
- ๋ ์ง์คํฐ์ ๋๋น๋ ๋ฌธ์์ด์ ์์ฉํ ์ ์์ด์ผ ํจ
- ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์๋ 8๋นํธ (1 byte)๋ฅผ ์ฐจ์งํจ
reg [8*18:1] string value; // 18๋ฐ์ดํธ ๋๋น์ ๋ณ์๋ฅผ ์ ์ธํจ initial string value = "Hello Verilog World"; // ๋ฌธ์์ด์ ๋ณ์์ ์ ์ฅ๋ ์ ์์
- ํน์ ๋ฌธ์
ย
์์คํ ํ์คํฌ
$
- Verilog๋ ์ผ์ ํ ๋ฃจํด ์์
์ ์ํ ํ์ค ์์คํ
ํ์คํฌ๋ฅผ ์ ๊ณตํ๋ฉฐ ์ด๋
$<keyword>
ํํ๋ก ๋ํ๋
ย
์ ๋ณด ํ์
$display
๋ ๋ณ์์ ๊ฐ์ ํ์ํ๋ ์ฃผ์ ์์คํ ํ์คํฌ
- ์ฌ์ฉ๋ฒ:
$display(p1, p2, p3, ..., pn)
์ฌ๊ธฐ์p1 ~ pn
์ ๋ฌธ์์ด๋ก ํ์๋ ์ ์์
- C ์ธ์ด์ printf์ ๋งค์ฐ ์ ์ฌํจ
$display
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์์ด์ ๋์ ์ค ๋ฐ๊ฟ์ ์ฝ์ ํจ
- ๋ฌธ์์ด ํฌ๋งท ์ง์
ย
$display
ํ์คํฌ
// ๋ฐ์ดํ ์์ ๋ฌธ์์ด ํ์ $display("Hello Verilog World"); -- Hello Verilog World // ํ์ฌ ์๋ฎฌ๋ ์ด์ ์๊ฐ 230์ ๊ฐ ํ์ $display($time); -- 230 // ์๊ฐ 200์์์ 41๋นํธ ๊ฐ์ ์ฃผ์ 1fe0000001c ๊ฐ ํ์ reg [0:40] virtual_addr; $display("At time %d virtual address is %h", $time, virtual_addr); -- At time 200 virtual address is 1fe0000001c // 2์ง์๋ก ํฌํธ ์์ด๋ 5์ ๊ฐ ํ์ reg [4:0] port_id; $display("ID of the port is %b", port_id); -- ID of the port is 00101 // ร ๋ฌธ์ ํ์ํ๊ธฐ // 2์ง์๋ก 4๋นํธ ๋ฒ์ค 10xx (์ ํธ ์ถฉ๋) ๊ฐ ํ์ reg [3:0] bus; $display("Bus value is %b", bus); -- Bus value is 10xx // ๊ฐ์ฅ ์์ ๋ชจ๋์ธ top ์๋์ ์ธ์คํด์คํ๋ p1์ ๊ณ์ธต์ ์ด๋ฆ ํ์ // ์ธ์๊ฐ ํ์์์. ์ ์ฉํ ๊ธฐ๋ฅ $display("This string is displayed from %m level of hierarchy"); -- This string is displayed from top.p1 level of hierarchy
// ํน์ ๋ฌธ์, ์ค ๋ฐ๊ฟ ๋ฐ % ํ์ํ๊ธฐ $display ("This is a \n multiline string with a %% sign"); -- This is a -- multiline string with a % sign
ย
์ ๋ณด ๋ชจ๋ํฐ๋ง
- Verilog๋ ์ ํธ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์ ํธ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ
- ์ฌ์ฉ๋ฒ:
$monitor(p1, p2, ..., pn)
์ฌ๊ธฐ์ p1 ~ pn์ ๋ฌธ์์ด๋ก ํ์๋ ์ ์์
$monitor
๋ ๋ณ์๋ ์ ํธ์ ๊ฐ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํจ
$display
์๋ ๋ฌ๋ฆฌ$monitor
๋ ํ ๋ฒ๋ง ํธ์ถํด์ผ ํจ
$monitoron
/$monitoroff
๋ ๋ชจ๋ํฐ๋ง์ ์ผ๊ณ /๋๋ ๋ฐ ์ฌ์ฉ๋จ
// ์๊ฐ๊ณผ ์ ํธ clock ๋ฐ reset์ ๊ฐ์ ๋ชจ๋ํฐ๋งํจ // Clock์ ๋งค 5์๊ฐ ๋จ์๋ง๋ค ํ ๊ธํ๊ณ reset์ 10์๊ฐ ๋จ์์์ ํ๊ฐํจ initial begin $monitor ($time, "์ ํธ clock์ ๊ฐ = %b reset = %b", clock, reset); end
-- 0 ์ ํธ clock์ ๊ฐ = 0 reset = 1 -- 5 ์ ํธ clock์ ๊ฐ = 1 reset = 1 -- 10 ์ ํธ clock์ ๊ฐ = 0 reset = 0
ย
์๋ฎฌ๋ ์ด์ ์ค ์ ์ง ๋ฐ ์ข ๋ฃ
$stop
ํ์คํฌ๋ ์๋ฎฌ๋ ์ด์ ์ค์ ์ค์ง์ํค๊ธฐ ์ํด ์ ๊ณต๋จ
- ์ฌ์ฉ๋ฒ:
$stop
$stop
ํ์คํฌ๋ ์ค๊ณ์๊ฐ ์๋ฎฌ๋ ์ด์ ์ ์ผ์ ์ค๋จํ๊ณ ์ค๊ณ์ ์ ํธ ๊ฐ์ ๊ฒ์ฌํ๋ ค ํ ๋ ์ฌ์ฉ๋จ
ย
$finish
ํ์คํฌ๋ ์๋ฎฌ๋ ์ด์ ์ ์ข ๋ฃํจ
- ์ฌ์ฉ๋ฒ:
$finish
// 100์ ์๊ฐ์ ์๋ฎฌ๋ ์ด์ ์ ์ ์งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ฒํ ํ๋ ํ๋ก๊ทธ๋จ // 1000์ ์๊ฐ์ ์๋ฎฌ๋ ์ด์ ์ข ๋ฃ initial // ์๋ฎฌ๋ ์ด์ ์ ์์์์ (time = 0์์) ํ ๋ฒ ์คํ๋๋ ์ฝ๋ ๋ธ๋ก. ์ด ๋ธ๋ก ๋ด์ ์ฝ๋๋ ์๋ฎฌ๋ ์ด์ ์ ์์ํ ๋ ํ ๋ฒ ์คํ๋จ begin clock = 0; // clock ์ ํธ๋ฅผ 0์ผ๋ก ์ด๊ธฐํํจ reset = 1; // reset ์ ํธ๋ฅผ 1๋ก ์ด๊ธฐํํจ #100 $stop; // ์๋ฎฌ๋ ์ด์ ์ time = 100์์ ์ผ์ ์ค์งํจ. ๋๋ฒ๊น ์ค์ ์ ํธ ๊ฐ์ ํ์ธํ๊ฑฐ๋ ์๋ฎฌ๋ ์ด์ ์ํ๋ฅผ ๊ฒ์ฌํ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํจ #900 $finish; // time = 1000์์ ์๋ฎฌ๋ ์ด์ ์ ์์ ํ ์ข ๋ฃํจ. $stop๊ณผ ๋ฌ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ ์์ ํ ์ข ๋ฃํ๊ณ ๋ชจ๋ ์ถ๋ ฅ ํ์ผ์ ๋ซ๊ณ , ์ฌ์ฉ ์ค์ธ ๋ชจ๋ ์์์ ํด์ ํจ end
ย
์ปดํ์ผ ์ง์์
`
๋ชจ๋ ์ปดํ์ผ ์ง์์๋
`<keyword>
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋จย
`define
`define
์ง์์๋ Verilog์์ ํ ์คํธ ๋งคํฌ๋ก๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋จ
// ๊ธฐ๋ณธ ์๋ ํฌ๊ธฐ๋ฅผ ์ ์ํ๋ ํ ์คํธ ๋งคํฌ๋ก ์ ์ // ์ฝ๋ ๋ด์์ 'WORD SIZE'๋ก ์ฌ์ฉ๋จ `define WORD SIZE 32 // ๋ณ์นญ ์ ์. ์ฝ๋์์ 's๊ฐ ๋ํ๋๋ฉด $stop์ผ๋ก ๋์ฒด๋จ `define S $stop; // ์์ฃผ ์ฌ์ฉ๋๋ ํ ์คํธ ๋ฌธ์์ด ์ ์ `define WORD_REG reg [31:0] // ๊ทธ๋ฐ ๋ค์ 'WORD_REG'๋ก 32๋นํธ ๋ ์ง์คํฐ๋ฅผ ์ ์ํ ์ ์์. 'WORD_REG reg32;
ย
`include
`include
์ง์์๋ ์ปดํ์ผ ์ค์ ๋ค๋ฅธ Verilog ํ์ผ์ ์์ค ํ์ผ์ ์ ์ฒด ๋ด์ฉ์ ํฌํจํ๊ฒ ํด์ค (C/C++์ #include์ ์ ์ฌ)
// header.v ํ์ผ์ ํฌํจ์ํด // ์ด ํ์ผ์ main verilog ํ์ผ์ธ design.V์ ์ ์ธ๋ค์ ํฌํจํ๊ณ ์์ `include header.v ... ... <design.v ํ์ผ ๋ด์ Verilog ์ฝ๋> ... ...
ย