1. ๊ธฐ๋ณธ
1) Module
- top module
- ํ์ module
- test module
modul module_name(port_list);
port ์ ์ธ
reg ์ ์ธ
wire ์ ์ธ
parameter ์ ์ธ
gate modeling
data flow modeling
behavioral modeling
structural modeling
ํ์๋ชจ๋ ํธ์ถ
endmodule
- Verilog HDL๋ก ํํ๋๋ ๋ ผ๋ฆฌํ๋ก๋ "module~endmodule" ์์ ์์ด์ผ ํจ
- ๋ชจ๋ ๋ฌธ์ฅ์ ; ๋ก ๋๋๊ณ , "end~"๋ก ์์ํ๋ ์์ฝ์ด์๋ ; ์์
- ์ด๋ฆ ๋๋ ์๋ณ์๋ ์๋ฌธ์์ ๋๋ฌธ์๋ฅผ ๊ตฌ๋ณ
- ์์ฝ์ด๋ ๋ฐ๋์ ์๋ฌธ์์
- module ์ด๋ฆ์ ์๋ฌธ์์ ์ธ๋๋ฐ๋ก ์์ ๊ฐ๋ฅ
- ์ฃผ์์ // ๋๋ /* */
2) Port
: port ๋ฐฉํฅ [n-1:0] ์ด๋ฆ
-input, output, inout
-input[7:0] ina, inb // 8bit์ง๋ฆฌ
3) Data types
- Net data type : ํ๋์จ์ด ์
:wire (wire[15:0] mult // 16bit) , tri, supply0, supply1
- Variable Data type : ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ์ฐ๊ฒฐ
- reg : always ๋ฌธ์ ์ํด ๋ง๋ค์ด์ง๋ ์ ํธ, ๊ฐ์ ๊ธฐ์ตํ๋ ์ํํธ์จ์ด์ ๋ณ์์ ์ ์ฌํ ์ญํ
- integer : signed 32-bit variable
4) ์ง์ํ๋ ์ ํธ : 1, 0, Z(High-impedance), X(Unknown value)
5) ๋ฒกํฐ์์ ํํ๋ฐฉ๋ฒ [์ ํธ์ ๊ธธ์ด]['][์ง์][์ ํธ์ ๊ฐ]
: h(16์ง์), o(8์ง์), d(10์ง์), b(2์ง์), sh(signed 16์ง์) ...
- 4'b1010 : 2์ง์ 1010
- 'ha : 16์ง์ a
6) parameter
- ์์ ์ ์
: parameter [๋ฒ์] ์ด๋ฆ = ์;
ex) parameter size = 8;
7) Instance : ๋ค๋ฅธ module์ด๋ gate primitive๋ฅผ ์ด๋ค module์์ ํธ์ถํด์ ์ฌ์ฉํ ๋ instance๋ผ๊ณ ํจ
- Port ์ด๋ฆ์ ์ํ ์ฐ๊ฒฐ : ์ํ์ ๊ณ์ธต ๋ชจ๋์ ์ด๋ฆ์ ๋ฐ๋์ ์ผ์นํด์ผ ํจ.
- Port list ์์์ ์ํ ์ฐ๊ฒฐ : positional mapping(๊ธฐ์ ์์๋๋ก mapping)
//OR Gate
module or2(a, b, o);
input a, b;
output o;
endmodule
//Half Adder
module hadder(x, y, s, c);
input x, y;
output s, c;
endmodule;
module full_adder(fco, fsum, cin, a, b);
output fco, fsum;
imput cin, a, b;
wire c1, s1, c2;
half_adder u1(c1, s1, a, b);
half_adder u2(.a(s1), .b(cin), sum(fsum), .co(c2); //๋ ๋ค ํฌํธ ์์ ์ค์. ๋ ๋ค ๊ฐ๋ฅ
or u3(fco, c1, c2);
endmodule
2. Gate Level Modeling
: Gate ์์ ํจ์ ์ ๊ณต
//And Gate
module and2(a, b, o);
input a, b;
output o;
//1. GateLevel M
and and2(o,a,b); // ์์ ์ค์!! ์ถ๋ ฅ, ์
๋ ฅ, ์
๋ ฅ์
endmodule
3. Register Transfer Lever (RTL)
: assign ๋ฌธ์ผ๋ก ์ ํธ ์ฐ๊ฒฐ
//Half Adder
module hadder(x, y, s, c);
input x, y;
output s, c;
assign c = x&y;
assign s = x ^ y;
endmodule;
- ์ผ์ชฝ์๋ ์ถ๋ ฅํ๋ ๋ฒกํฐ๋ ๊ฒฐํฉ๋ฒกํฐ (์ถ๋ ฅ , wire(net))
- ์ค๋ฅธ์ชฝ์๋ ๋ ์ง์คํฐ, ๋ท, ํจ์ํธ์ถ ๋ฑ ์ถ๋ ฅ ๋นผ๊ณ ์ ๋ถ ๊ฐ๋ฅ
- ์ค๋ฅธ์ชฝ ๊ฐ์ด ๋ณํ๋ฉด ์ผ์ชฝ๊ฐ๋ ๋ฐ๋ก ๋ณํจ
//And Gate
module and2(a, b, o);
input a, b;
output o;
//1. GateLevel M
and and2(o,a,b); // ์์ ์ค์!! ์ถ๋ ฅ, ์
๋ ฅ, ์
๋ ฅ์
//2. RTL M
assign o = a&b;
endmodule
4. Behavioral Modeling
: ๊ฐ์ฅ ๋์ ์ถ์ํ ๋จ๊ณ์ ํ๋์จ์ด ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ
- initial, always@, if-else, case, ๋ฐ๋ณต๋ฌธ
1) initial ๋ฌธ
- verilog HDL์ ๋ชจ๋ ๊ตฌ๋ฌธ์ด ๋ณ๋ ฌ์ ์ผ๋ก ์คํ๋จ
- initial๋ฌธ์ ์๋ฎฌ๋ ์ด์ ์์๊ณผ ํจ๊ป ์์ํ์ฌ ๋ฑ ํ ๋ฒ ์ํ๋๋ค
- ๊ฐ ๋ธ๋ญ๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด ๋์์ ์์ํ๋ค
- ์ด๊ธฐ๊ฐ ์ค์ ์, ๊ทธ๋ฆฌ๊ณ testbench์์ ์ฌ์ฉ๋๋ค.
- ์ฌ๋ฌ ๊ฐ์ ๋์์ ์คํํ๋ค๋ฉด, ์์๊ณผ ๋์ begin๊ณผ end๊ฐ ์์ด์ผ ํ๋ค.
- initial ์์ ํ ๋น๋๋ ์ ํธ๋ reg๋ก ์ ์ธ๋์ด์ผ ํ๋ค.
`timescale 1ns/ 1ps // 1000์ผ๋ก ์ชผ๊ฐ์
module test1;
reg x, y, a, b, m;
initial m= 1'b0;
initial
begin
#5 a=1'b1;//5ns
#25 b=1'bo; //30ns
end
initial
begin
#10 x=1'b0; //10ns
#25 y=1'b1; //35ns
end
initial #50 $finish //50ns
endmodule
2) always๋ฌธ
always@(์ด๋ฒคํธ)
begin
๋์
end
- always๋ฌธ ๋ธ๋ก์๋ ๋ฐ๋์ ์ด๋ฒคํธ๊ฐ ์์ด์ผ ํ๋ค.
- always๋ฌธ ๋ด์์ ํ ๋น๋๋ ์ ํธ๋ค์ reg๋ก ์ ์ธ๋์ด์ผ ํ๋ค.
- always ๊ตฌ๋ฌธ์ด ์ฌ๋ฌ๊ฐ ์ฌ ์ ์์ผ๋, ๊ฐ๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด ๋ด์ผํจ. ๋ค๋ฅธ always์์ ๊ฐ์ ๊ฒ ๊ฑด๋๋ฆฌ๋ฉด ์๋จ
- ์ด๋ฒคํธ ์๊ทธ๋์ด ๋ณํ๋ฉด ๋์ํจ
- ์กฐํฉํ๋ก์์ ๊ณต๊ธ๋๋ ๋ชจ๋ ์ ํธ๋ค์ @event signal์ ์กด์ฌํด์ผ ํจ
- ์กฐํฉํ๋ก์์ always๋ฌธ ์์์๋ non-blocking ๋์ ๋ฌธ(<=)์ ์ฌ์ฉ.
//4bit ๊ฐ์ฐ๊ธฐ
module ADD_4bit(out, in1, in2);
input[3:0] in1, in2;
output[4:0] out;
reg[4:0] out;
always@(in1, in2)
begin
out = in1 + in2
end
endmodule
- ๋ง์ฝ behavior modeling์ ์กฐ๊ฑด์ด ์์ผ๋ฉด ๋ฌดํ๋ฃจํ์
module clock_test;
reg clock;
initial clock = 1'b0;
always #10 clock = ~clock;
initial #50 $finish;
endmodule
- blocking ๋ฌธ : ๋ธ๋ก ๋ด์์ ์์ฐจ์ ์ธ ์งํ, ํ๋์ ๋์ ์ด ๋๋๊ณ ๋์ ๋ค์ ๋์ ์ ํ๋ค. ์กฐํฉํ๋ก์ ์ ํฉ
- nonblocking ๋ฌธ : ๋ณ๋ ฌ์ ์ธ ์งํ, ์ค๋ฅธ์ชฝ ์ฒ๋ฆฌ๊ฐ ์์ ํ ๋๋๊ณ ๋๋ฉด ์ผ์ ํ ์ผ์ชฝ์ ๋์ , ์์ฐจํ๋ก์ ์ ํฉ
3) if ๋ฌธ
: if(์กฐ๊ฑด) ๋ฌธ์ฅ;
if(์กฐ๊ฑด) ๋ฌธ์ฅ;
else if (์กฐ๊ฑด) ๋ฌธ์ฅ;
else ๋ฌธ์ฅ;
if(์กฐ๊ฑด)
begin
๋ฌธ์ฅ1;
๋ฌธ์ฅ2;
end
..
4) case ๋ฌธ
case(์์)
์กฐ๊ฑด1:
begin
๋ฌธ์ฅ1;
๋ฌธ์ฅ2;
end
์กฐ๊ฑด2:
๋ฌธ์ฅ;
default: ๋ฌธ์ฅ;
endcase;
//And Gate
module and2(a, b, o);
input a, b;
output o;
//1. GateLevel M
and and2(o,a,b); // ์์ ์ค์!! ์ถ๋ ฅ, ์
๋ ฅ, ์
๋ ฅ์
//2. RTL M
assign o = a&b;
//3. Behavioral M
always@(a or b)
begin
if(a==1'b1 && b==1'b1)
o = 1'b1;
else
o = 1'b0;
end
endmodule
5) Function ๋ฌธ
: ๋คํธ = function ์ด๋ฆ (์ธ์ ์ด๋ฆ, ..., ์ธ์์ด๋ฆ) ์ผ๋ก ํธ์ถ
5. Test Bench : Verilog-HDL์ ์ค๊ณํ ํ๋ก๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก Simulation Pattern์ ์์ ํ๋ ๋ฌธ์ฅ
: $stop (์ผ์์ ์ง), $finish(์์ ์ข ๋ฃ), $monitor, $strobe, time
'๐ก๐ธ๐ธ๐ถ5: ๐ฆ๐๐๐๐ถ ๐ฐ๐๐พ๐ > ๋ ผ๋ฆฌ์ค๊ณ Digital Design(COSE221)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ ผ๋ฆฌ์ค๊ณ] 2. ๋ถ์ธ๋์์ ๋ ผ๋ฆฌ๊ฒ์ดํธ (0) | 2021.04.29 |
---|---|
[๋ ผ๋ฆฌ์ค๊ณ] 1. ๋์งํธ ์์คํ ๊ณผ 2์ง์์ฒด๊ณ (0) | 2021.04.29 |