5 / 37 · 개념
logic·wire·X/Z와 명시적인 비트 폭
타입 선언이 저장소자를 결정하지 않음을 이해하고 리터럴·비교·확장·알 수 없는 값을 검증합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
타입·구동자·저장소자는 각각 확인합니다
logic은 4상태 데이터 타입입니다. wire는 연결된 net을 나타내며, net도 4상태 논리값을 전달할 수 있습니다. logic 변수는 언어의 구동 규칙에 따라 조합 결과나 클록 상태에 사용할 수 있습니다. 어느 이름도 그 자체로 플립플롭을 보장하지 않습니다. 실제 연속 대입·조합 프로시저·에지 기반 프로시저를 찾아보세요.
일반적인 RTL 신호에는 의도한 구동자 하나를 둡니다. 여러 구동자를 해석하는 net과 양방향 인터페이스에는 별도 전기적·도구 계약이 필요하며 이 과정의 단일 구동자 예제 범위에 포함하지 않습니다.
폭과 해석을 명시합니다
logic [7:0] u는 unsigned로 해석하는 8비트이고, logic signed [7:0] s는 같은 수의 비트를 signed 2의 보수로 해석합니다. 8'hFF라는 비트열은 u에서는 255, s에서는 −1입니다. packed vector는 비트를 함께 전달하며 시간상으로 이어지는 8개 값이 아닙니다.
module typed_examples (
input logic [3:0] a, b,
input logic signed [7:0] s,
output logic [4:0] full_sum,
output logic signed [8:0] extended_s,
output logic negative,
output logic any_bit, all_bits, parity
);
assign full_sum = {1'b0, a} + {1'b0, b};
assign extended_s = {s[7], s};
assign negative = s < 8'sd0;
assign any_bit = |a;
assign all_bits = &a;
assign parity = ^a;
endmoduleextended_s의 연결 연산은 부호 비트를 반복합니다. 앞에 0만 붙이면 −1을 +255로 바꾸게 됩니다. 연결 연산의 표현식은 unsigned이므로 연결 결과로 signed 산술을 하려면 부호 해석을 명시하거나 알맞게 선언한 중간 신호가 필요합니다. 이 예제는 의도한 비트열을 signed 목적지에 대입합니다.
설계가 폭에 의존하면 크기를 지정한 리터럴을 사용하세요. 4'd15, 8'hFF, 8'sd0은 폭과 필요한 부호를 드러냅니다. 크기 없는 정수 리터럴은 표현식을 넓힐 수 있습니다. 왼쪽 피연산자가 모든 결과 타입을 정한다고 가정하지 말고 두 피연산자와 대입 문맥을 함께 확인하세요.
세 종류의 연산자를 구분합니다
a & b는 같은 위치의 비트를 연산합니다. a && b는 두 벡터가 논리적으로 참인지 묻고 1비트 결과를 만듭니다. &a는 한 벡터의 모든 비트가 1인지 축약합니다. a=4'b0011, b=4'b0101이면 결과는 각각 0001, 1, 0입니다. ^a는 패리티이며 0011에서는 0입니다.
교육용 RTL에서는 폭이나 부호가 불명확한 중간 표현식을 분리하세요. 읽기 쉬운 구조는 각 신호의 정확한 범위를 적게 해 주므로 검증에도 도움이 됩니다.
X는 세 번째 물리 전압이 아닙니다
X는 알 수 없는 값, Z는 고임피던스 구동 상태를 모델링합니다. 둘은 시뮬레이션 값이며 특정한 물리 전압이 아닙니다. 2상태 실행 모델로 4상태 동작을 증명할 수 없습니다. 모든 X를 0으로 가리지 말고 4상태 테스트벤치에서 알 수 없는 상태를 명시적으로 리셋하세요.
==은 동등 여부를 정할 수 없을 때 X가 될 수 있습니다. 테스트벤치에서 actual !== expected를 사용하면 알려진 기대값과 X/Z를 비교할 때 명확한 불일치 결과를 얻습니다. case equality가 일반적인 하드웨어에서 물리적인 X를 감지한다는 뜻은 아닙니다.
실습 · 확장·덧셈·비교
a=15,b=1에서 full_sum=5'b10000인지 확인하세요. s=8'h80이면 extended_s=9'b110000000, negative=1입니다. s=8'h7F이면 extended_s=9'b001111111, negative=0입니다. 0·양의 최댓값·음의 최솟값·−1을 각각 검사합니다.
extended_s를 {1'b0,s}로 바꾸고 음수 검사가 실패하는지 확인하세요. 테스트벤치의 비교를 !==에서 !=로 바꾸고 actual에 X를 넣어 조건문이 실패를 확실하게 보고하는지 살펴보세요. 검사 결과 자체가 unknown이 되면 의도한 검증을 조용히 놓칠 수 있습니다.