공부/Verilog

[Verilog 팁] 폭 없는 파라미터에 ~ 썼다가 ||가 항상 TRUE 되는 함정

오비루 2025. 5. 2. 19:55
728x90
728x90

요약

  1. ~(비트 NOT) + 사이즈 안 줬던 파라미터 → 32 bit로 확장돼서 사고 난다.
  2. !(논리 NOT) 은 1-bit 불리언이므로 조건식엔 얘가 안전하다.
  3. 파라미터/상수엔 반드시 bit/logic 타입이나 [0:0] 식 크기를 붙여라.
  4. 실무에서 if (~USE_EN || valid) 같은 식은 “항상 1”로 고정될 수 있다.
  5. → 시뮬 파형 안 뜨고, 합성 땐 로직 통채로 날아감.

👶 왜 이런 일이?

상황 시뮬레이터 내부에서 벌어지는 일

parameter USE_EN = 1; (폭 없음) 32-bit 정수 32'h0000_0001 로 변신
~USE_EN 32'hFFFF_FFFE (LSB만 0)
`~USE_EN  

valid가 바뀌어도 결과는 1

→ 파형 평평, 디버그 지옥.

 

320x100

 


🛠️ 실전 회피법

체크리스트 한 줄 팁

논리 조건 !USE_EN && ready 처럼 ! 쓰기
폭 명시 parameter logic USE_EN = 1'b1;
슬라이스 ~USE_EN[0] 처럼 필요한 비트만
캐스트 ~$unsigned(USE_EN) or ~{1'b0, USE_EN}

🧐 ~ vs ! 10초 비교

~ 비트 NOT ! 논리 NOT

결과 폭 입력과 동일 항상 1-bit
용도 마스크 뒤집기·버스 인버터 조건 부정, enable/disable
X/Z 처리 그대로 뒤집음 결과 1’bX
폭 함정 있음 (unsized → 32 bit) 거의 없음

✅ 실무 템플릿

module foo
 #(parameter bit USE_EN = 1)  // 크기/타입 명시!
 (
   input  logic clk,
   input  logic valid,
   output logic out
 );

 // 조건엔 항상 논리 NOT
 assign out = !USE_EN || valid;

endmodule

한 줄 요약:

“폭 없는 상수 + ~ = 불길한 조합”

폭 붙이거나 !로 갈아타라 — 이거면 시뮬/합성 불일치 끝! 💯

728x90

본문은 chatgpt를 통해 내용을 가독성 좋게 요약하였습니다.

728x90
반응형