인프런 커뮤니티 질문&답변

royroy님의 프로필 이미지
royroy

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

clock gating 및 assign 구문 질문드립니다.

작성

·

461

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
1. clock gating 생성에 관한 질문 clock gating 생성 예제에서는 DUT에서 input i_clk input i_clock_en의 wire 타입의 입력과 output o_clk을 이용해 assign o_clk = i_clk & i_clock_en 을 만들어 testbench에서 o_clk과 연결해줬는데,
 
D F/F 실습 예제에서는 바로 testbench에서 reg타입의 clk, clk_enable을 이용해 wire clk_for_dut = clk && clk_enable로 만들어 DUT를 인스턴스 하는 과정에서 clk와 clk_for_dut를 연결해준걸로 이해했습니다.
 
질문 1 : clock gating 생성을 DUT와 testbecnh에서 모두 위의 다른 방식으로 생성하는것인가요 ? (예를들어 testbench에서만 해야된다? DUT에서만 해야된다?)
 
질문 2 : wire clk_for_dut = clk && clk_enable 이식에서 clk와 clk_enable 모두 reg타입인데 결과값이 wire로 나올 수 있나요 ? (&&의 논리연산 때문인가요? 0or1)
 
질문 3 : DUT를 인스턴스하는 과정에서 clk를 제외한 다른 값 (sync_reset, async_reset등)은 뒤의 괄호안에 reg 타입의 값이 들어가는데 .clk(clk_for_dut)에서는 clk_for_dut가 wire값인데 들어가도 되는지 질문드립니다. clk와 clk_enable이 이미 reg타입으로 값을 저장하고 있는 상태이고, 이 저장되는 값들의 관계에 의해서 clk_for_dut가 나오므로 단지 결과값을 연결하는 선(wire)으로 썻다. 이정도로 이해하면 될까요 ?
 
2. assign 구문에 대한 질문 D F/F 실습에서 마지막에서 이러한 구문이 나오는데
assign o_value_sync_reset = r_ff_sync_reset;
assign o_value_async_reset = r_ff_async_reset;
assign o_value_async_reset_n = r_ff_async_reset_n;
assign o_value_mixed_reset = r_ff_mixed_reset;
assign o_value_no_reset = r_ff_no_reset;
 
질문 4 :이렇게 reg 타입을 wire 타입 output과 연결시켜주는데 input, 또는 output으로 나오는 reg타입은 무조건 wire타입과 연결해줘야 하나요?(testbench 마지막에서 DUT를 인스턴스 하는 과정이랑 동일하다고 보면 될까요 ?)
그래서 testbench에서 인스턴스 할때 output값들이 매핑이 안되는 것인가요 ? (ex .o_value_sync_reset(빈칸) )
또한 testbench에서 output값들이 wire로 선언이 되지 않은 이유인가요?
 
베릴로그를 오랜만에 접하다 보니 이런저런 귀찮은 질문 지송합니다. ㅠ

 

답변 3

1

royroy님의 프로필 이미지
royroy
질문자

책 완독하고 간단하게 정리해봤습니다. 

 

질문 2 : wire clk_for_dut = clk && clk_enable 이식에서 clk와 clk_enable 모두 reg타입인데 결과값이 wire로 나올 수 있나요 ? (&&의 논리연산 때문인가요? 0or1) 

 >> 연속할당문 assign문의 왼쪽은 항상 wire(net)형이다. 우측은 operand와 operator로 구성되는데 operand에는 wire/reg형 모두 쓸 수 있다. 연속할당문은 항상 능동적이다. 할당문은 항상 오른쪽 피연산자들의 값이 바뀌자마자 왼쪽의 wire에 값을 할당한다. 

wire clk_for_dut = clk && clk_enable은 함축된 표현이며, 풀어쓰면 

wire clk_for_dut;

assign clk_for_dut = clk && clk_enable으로 표현된다. 

 

우측의 clk와 clk_enable이 reg형인 이유는 testbench에서 clk와 clk_enable 을 initial을 통하여 초기값을 할당하여 그 값을 유지해야 되기 때문이다. 참고로 initial구문과 always구문에서 한 문장의 좌측은 무조건 reg형이어야 한다. 

Verilog에서 reg형(레지스터)는 단지 값을 저장할 수 있는 변수를 의미한다. wire과 달리 레지스터는 신호의 유도를 필요로 하지 않는다. Verilog 레지스터는 하드웨어 레지스터처럼 클럭을 필요로 하지도 않는다. Verilog의 레지스트 reg형과 하드웨어의 레지스터는 다른 의미를 가지고 있으니 혼동하지 말자. 

 

만약 assign문의 clk과 clk_enable문이 reg형이 아니라 wire문이라고 가정하면 다음과 같은 의미를 가질 것이다. 

질문 3 

>> 위의 그림과 같이 testbench에서 clk과 clk_for_dut를 연결해준것 뿐이다. 

참고로 DUT의 input은 항상 wire값으로 선언된다. 

 

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

오 감동입니다!! 흠잡을 것이 없는 정리입니다.

감사합니다 :)

0

royroy님의 프로필 이미지
royroy
질문자

질문이 있습니다. d_ff실습에서 아래 코드와 같이 output값을 reg값으로 선언해 값을 저장하고 ,

testbench wire값들을 선언해 DUT를 인스턴시하는과정에서 reg output값과 연결해줘도 상관없지않나요?

저는 이렇게 생각하는것이 원칙적인? 방법인거 같은데...

밑과 같이 시도해보았는데 에러가떠서... 제생각이 잘못된건지 질문드립니다. 

 

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

testbench wire값들을 선언해 DUT를 인스턴시하는과정에서 reg output값과 연결해줘도 상관없지않나요?

네 저도 그렇게 생각해요.

Error 메세지를 확인해보시겠어요? :)

royroy님의 프로필 이미지
royroy
질문자

세미콜론을 중간에 빼먹었네요 ㅎㅎ... 결과 잘 나옵니다.! 

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 :)

장문의 질문!!! 잘 읽었습니다 :)

우선 문법관련 질문은 책 한권을 읽으시면 말끔히 해소가 됨으로 책을 먼저 꼭 봐주시고, 영상을 봐주세요. 필독문서에도 적혀있지만, 수강자 분들의 수준을 문법은 알고계시다 가정하고 강의를 만들었습니다. :) 

그러면 질문 1,2,3,4 중 1번 만 답변해드리면 될 것 같아요. (이거는 책에 없는 내용입니다)

 

1. clock gating 생성에 관한 질문 clock gating 생성 예제에서는 DUT에서 input i_clk input i_clock_en의 wire 타입의 입력과 output o_clk을 이용해 assign o_clk = i_clk & i_clock_en 을 만들어 testbench에서 o_clk과 연결해줬는데,
 
D F/F 실습 예제에서는 바로 testbench에서 reg타입의 clk, clk_enable을 이용해 wire clk_for_dut = clk && clk_enable로 만들어 DUT를 인스턴스 하는 과정에서 clk와 clk_for_dut를 연결해준걸로 이해했습니다.
 
질문 1 : clock gating 생성을 DUT와 testbecnh에서 모두 위의 다른 방식으로 생성하는것인가요 ? (예를들어 testbench에서만 해야된다? DUT에서만 해야된다?)
 
 
강의에서 사용한 해당 코딩 스타일은 Testbench 에서 Function 을 Clock gating 과 동일하게 만든 Modeling 코드입니다,
Clock 은 디지털 로직에서 가장 중요한 부분입니다. 이렇게 제 예제코드처럼 단순하게? And gate 처리로 실 사용을 하면 안됩니다.
현업에서 ASIC 을 하시게 되면, Clock gating 라이브러리 모듈이 별도로 존재합니다.
그 모듈을 사용하셔야 합니다.
 
고로 질문 1의 답변은,
Function Test 를 위함이면 Testbench 에서 저처럼 기술 해주시면 돼구요.
ASIC 실 적용을 위해서 라면 DUT 에 절대! 저렇게 기술하지 마시고, Clock gating 라이브러리를 사용하셔야 합니다.
 
즐공하세요 :)
 
royroy님의 프로필 이미지
royroy

작성한 질문수

질문하기