게이트 레벨 모델링: 하드웨어 회로도에서 Verilog 코드로
대부분의 디지털 설계는 RTL 같은 높은 추상화 수준에서 수행되지만, 때로는 and, or 같은 조합 소자를 사용하여 더 낮은 수준에서 작고 결정적인 회로를 구축하는 것이 직관적일 수 있습니다. 이 수준에서의 모델링은 일반적으로 게이트 레벨 모델링이라고 불리며, 게이트를 포함하고 하드웨어 회로도와 Verilog 코드 간에 일대일 대응 관계가 있습니다.
Verilog는 기본 요소(primitives)로 알려진 몇 가지 기본 논리 게이트를 지원하는데, 이들은 이미 미리 정의되어 있어 모듈처럼 인스턴스화할 수 있습니다.
And/Or/Xor 게이트
이 기본 요소들은 여러 스칼라 입력을 받아 단일 스칼라 출력을 제공하는 AND와 OR 게이트를 구현합니다. 이 기본 요소들에 대한 인자 리스트의 첫 번째 단자가 출력이며, 입력 중 어느 것이든 변경될 때마다 업데이트됩니다.
module gates (
input a, b,
output c, d, e
);
and (c, a, b); // c가 출력, a와 b가 입력
or (d, a, b); // d가 출력, a와 b가 입력
xor (e, a, b); // e가 출력, a와 b가 입력
endmodule
module tb;
reg a, b;
wire c, d, e;
integer i;
gates u0 ( .a(a), .b(b), .c(c), .d(d), .e(e));
initial begin
{a, b} = 0;
$monitor ("[T=%0t a=%0b b=%0b c(and)=%0b d(or)=%0b e(xor)=%0b", $time, a, b, c, d, e);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random;
end
end
endmodule
시뮬레이션 로그
ncsim> run
[T=0 a=0 b=0 c(and)=0 d(or)=0 e(xor)=0
[T=1 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1
[T=2 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
[T=4 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1
[T=5 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
[T=6 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1
[T=7 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1
[T=10 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
ncsim: *W,RNQUIE: Simulation is complete.
Nand/Nor/Xnor 게이트
위 게이트들의 역도 nand, nor, xnor 형태로 제공됩니다. 위 설계에서 기본 요소들만 역 버전으로 바꾼 것 외에는 동일합니다.
module gates (
input a, b,
output c, d, e
);
// 이 예제에서는 and, or, xor 대신 nand, nor, xnor 사용
nand (c, a, b); // c가 출력, a와 b가 입력
nor (d, a, b); // d가 출력, a와 b가 입력
xnor (e, a, b); // e가 출력, a와 b가 입력
endmodule
module tb;
reg a, b;
wire c, d, e;
integer i;
gates u0 ( .a(a), .b(b), .c(c), .d(d), .e(e));
initial begin
{a, b} = 0;
$monitor ("[T=%0t a=%0b b=%0b c(nand)=%0b d(nor)=%0b e(xnor)=%0b", $time, a, b, c, d, e);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random;
end
end
endmodule
시뮬레이션 로그
ncsim> run
[T=0 a=0 b=0 c(nand)=1 d(nor)=1 e(xnor)=1
[T=1 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0
[T=2 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
[T=4 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0
[T=5 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
[T=6 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0
[T=7 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0
[T=10 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
ncsim: *W,RNQUIE: Simulation is complete.
이 게이트들은 두 개 이상의 입력을 가질 수 있습니다.
module gates (
input a, b, c, d,
output x, y, z
);
and (x, a, b, c, d); // x가 출력, a,b,c,d가 입력
or (y, a, b, c, d); // y가 출력, a,b,c,d가 입력
nor (z, a, b, c, d); // z가 출력, a,b,c,d가 입력
endmodule
module tb;
reg a, b, c, d;
wire x, y, z;
integer i;
gates u0 ( .a(a), .b(b), .c(c), .d(d), .x(x), .y(y), .z(z));
initial begin
{a, b, c, d} = 0;
$monitor ("[T=%0t a=%0b b=%0b c=%0b d=%0b x=%0b y=%0b x=%0b", $time, a, b, c, d, x, y, z);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random; c <= $random; d <= $random;
end
end
endmodule
시뮬레이션 로그
ncsim> run
[T=0 a=0 b=0 c=0 d=0 x=0 y=0 x=1
[T=1 a=0 b=1 c=1 d=1 x=0 y=1 x=0
[T=2 a=1 b=1 c=1 d=0 x=0 y=1 x=0
[T=3 a=1 b=1 c=0 d=1 x=0 y=1 x=0
[T=4 a=1 b=0 c=1 d=0 x=0 y=1 x=0
[T=5 a=1 b=0 c=1 d=1 x=0 y=1 x=0
[T=6 a=0 b=1 c=0 d=0 x=0 y=1 x=0
[T=7 a=0 b=1 c=0 d=1 x=0 y=1 x=0
[T=8 a=1 b=1 c=1 d=0 x=0 y=1 x=0
[T=9 a=0 b=0 c=0 d=1 x=0 y=1 x=0
[T=10 a=0 b=1 c=1 d=1 x=0 y=1 x=0
ncsim: *W,RNQUIE: Simulation is complete.
Buf/Not 게이트
이 게이트들은 하나의 스칼라 입력과 하나 이상의 출력을 가집니다. buf는 버퍼로, 극성 변경 없이 입력 값을 출력으로 단순히 전달합니다. not은 인버터로, 입력 신호의 극성을 반전시킵니다. 따라서 입력에 0이면 1이, 1이면 0이 나옵니다.
module gates (
input a,
output c, d
);
buf (c, a); // c가 출력, a가 입력
not (d, a); // d가 출력, a가 입력
endmodule
module tb;
reg a;
wire c, d;
integer i;
gates u0 ( .a(a), .c(c), .d(d));
initial begin
a = 0;
$monitor ("[T=%0t a=%0b c(buf)=%0b d(not)=%0b", $time, a, c, d);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random;
end
end
endmodule
시뮬레이션 로그
xcelium> run
[T=0 a=0 c(buf)=0 d(not)=1
[T=2 a=1 c(buf)=1 d(not)=0
[T=8 a=0 c(buf)=0 d(not)=1
[T=9 a=1 c(buf)=1 d(not)=0
xmsim: *W,RNQUIE: Simulation is complete.
포트 리스트의 마지막 단자가 게이트의 입력에 연결되고, 나머지 모든 단자가 게이트의 출력 포트에 연결됩니다. 여기 다중 출력 버퍼 예제가 있지만 드물게 사용됩니다.
module gates (
input a,
output c, d
);
not (c, d, a); // c,d가 출력, a가 입력
endmodule
시뮬레이션 로그
xcelium> run
[T=0 a=0 c=1 d=1
[T=2 a=1 c=0 d=0
[T=8 a=0 c=1 d=1
[T=9 a=1 c=0 d=0
xmsim: *W,RNQUIE: Simulation is complete.
Bufif/Notif
출력을 활성화하는 추가 제어 신호가 있는 버퍼와 인버터는 bufif와 notif 기본 요소를 통해 제공됩니다. 이 게이트들은 제어 신호가 활성화된 경우에만 유효한 출력을 가지며, 그렇지 않으면 출력이 하이 임피던스 상태가 됩니다. 제어 극성이 정상(1로 활성화)인 bufif1, notif1과 제어 극성이 반전(0으로 활성화)인 bufif0, notif0 두 버전이 있습니다.