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

김상현님의 프로필 이미지
김상현

작성한 질문수

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

[HDL 17장] HW 의 동작을 제어하는 FSM 을 이해해보자. (실습응용편)

fsm 에서 next state 계산하는 always 블록 관련 질문 드립니다.

해결된 질문

작성

·

1K

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요. 맛비님. 먼저 글씨가 흐려서 죄송합니다.. 어떻게 바꾸는지 모르겠어요..ㅠㅠㅠ
 
next state 계산?하는 always block에서
n_state = S_IDLE;
n_state = S_RUN;
Blocking 구문으로 작성되어 있는데요.
n_state <= S_IDLE;
n_state <= S_RUN;
이런식으로 Non-blocking 구문으로 작성하면 안되는 이유가 있나요?
 
제가 이해하기론 n_state 는 combinational 회로라 굳이 Non-blocking 구문으로 작성할 이유는 없다고 생각해요. clock이랑 동기화를 해줄 이유가 없어서..그런데
 
https://verilogguide.readthedocs.io/en/latest/verilog/fsm.html#verilog-edgedetector
 
위 링크에서 rising edge detector 예제를 푸는데, waveform이 next state 를 Non-blocking 구문으로 작성했을 때 예제에서 제공한 waveform이랑 같은 것을 확인할 수 있었습니다.
 
이상한 것은 예제에서는 next state가 Blocking 구문으로 작성되어 있다는 것이에요.
 
아래 그림은 위 링크 예제처럼 작성했을 때 waveform 차이입니다. 코드는 혹시나 제가 실수한 것이 있을까봐 올려둡니다. 죄송합니다.
figure1. 링크 waveform
figure2. 실습했을 때 waveform, mealy_tick과 moore_tick이 위 사진과 다르게 출력되는 것을 확인.
아래처럼 Blocking 구문을 전부 Non-blocking 구문으로 바꾸면 파형이 잘 나옵니다.
figure3. Non-blocking 구문으로 수정한 후의 waveform.
내용이 너무 기네요. 정리해보겠습니다.
 
수업 외 다른 코드를 이용해 질문 드리는 것에 대해 사과드립니다. 그래도 최대한 코드 볼 필요 없이 질문 드려봅니다. <- 제 개인적인 생각입니다..
 
제가 알고 싶은 것은
1. next state 계산에서 Blocking 구문으로 사용하는 이유가 제가 이해한 것이 맞는지
2. 제가 이해한 것이 맞다면 왜 이 예제는 Blocking 구문으로 작성하면 원하는 파형이 안 나오는 것인지
3. 추가로 지금 waveform을 보면 reset이 눌리기 전에 c_state와 n_state가 x로 나오는데, 만약 x로 나오지않고 0으로 나온다면 c_state와 n_state는 Latch로 된 것인지 알고싶습니다.
 
이상입니다. 감사합니다.

답변 3

1

김상현님의 프로필 이미지
김상현
질문자

안녕하세요. 맛비님.

전에 저 문제에 대한 해답을 찾으려고 봤으나 아무리 봐도 로직엔 문제가 없어보이는데,

시뮬레이터에 대한 차이 때문에 발생한 이슈라고 생각하고 넘어가도 되는지 궁금합니다.

 

 

아래는 제가 시뮬레이터에 대한 차이 때문에 발생한 이슈라고 생각한 이유 입니다. 안 보셔도 됩니다.

위 사진은 질문에 있던 사진이고, 아래 사진은 test bench에서 level 입력 신호를 5ns 정도 지연시켰을 때의 결과입니다.

일단 예제에서 원하는 밀리 머신과 무어 머신의 차이가 확실히 나옵니다.

이 결과를 보니 시뮬레이터에 대한 차이 때문에 발생한 문제다라는 생각이 듭니다.

개인 문제로 질문 드려서 정말 죄송합니다.

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

안녕하세요 :)

확답을 못드리겠어요. 보통 시뮬레이터 차이다.. 라는 생각이 드신다면 EDA ground 를 통해서 다른 시뮬레이터 툴로 돌려보세요 (하지만 시뮬레이터 차이를 의심하는 case 는 접하기 어렵습니다.)

즐공하세요 :)

0

김상현님의 프로필 이미지
김상현
질문자

blocking 사용시
A = B;
C = A;
 
A는 B 값, C도 B 값이 되고요.
A = 0, B = 1, C = 2로 테스트 해보았을 때,
위 구문을 실행하면
A = 1, B = 1, C = 1이 되는 것을 확인했습니다.
 
C = A;
A = B;
 
C는 A 값, A 는 B 값이 됩니다.
위와 똑같이 설정하고 테스트 했을 때,
A = 1, B = 1, C = 0이 되는 것을 확인했습니다.
 
위의 예제에서 A, B, C 값은 각각 어떻게 될까요?
 
==================================
 
Non blocking 사용시
A <= B;
C <= A;
 
A는 B 값, C는 A 값이 될 것 같습니다.
A = 0, B = 1, C = 2일 때,
A = 1, B = 1, C = 0 이렇게요...
 
C <= A;
A <= B;
 
C는 A 값, A는 B 값이 될 것 같습니다.
A = 0, B = 1, C = 2일 때,
A = 1, B = 1, C = 0 이렇게요...
 
initial 구문 안에
A = 2'b00;
B = 2'b01;
C = 2'b10;
 
A <= B;
C <= A; 하고 테스트해서 그런지 원하는 결과 값이 안나옵니다만... 맛비님께서 의도하신 답변은 위에 제가 적은 것일거라 생각합니다...
 
 
위의 예제에서 A, B, C 값은 각각 어떻게 될까요?
 
Blocking Non-blocking 구문에 대해서는 어느정도 이해가 되었다고 생각이 되는데...
이것을 해도 궁금한 것이 전혀 해결되지가 않네요.
 
always@(*) 내부의 assign 을 blocking 으로 사용하면, assign 자체가 logic 으로 기술 할 수 있습니다.
 
아무래도 제가 이 말씀에 대해 잘 이해를 못한 것 같아요.
설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

오 돌려보셨나요? 

(assign 순서를 바꾼겁니다. 지금 blocking 문의 assign 순서에 따라 다른 결과, 즉 다른 로직이 만들어진다 를 알게 해드리고 싶어요)

이 다음 문장을 이해하실 수 있을꺼에요. assign 자체가를, assign 순서 자체가 로 수정!

 

김상현님의 프로필 이미지
김상현
질문자

아 한번에 말고 나눠서 돌려보라는 말씀이신가요?

A = B;

C = A; 로 한 번

 

C = A;

A = B; 로 한 번 이렇게요?

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

네네! 같은 결과가 아니다를 눈으로 확인하시면 됩니다.

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

그 다음 non blocking 으로 했을때는 순서에 따라서 결과가 같은지 확인하시면 되구요. (설명이 이상하더라도 찰떡같이 이해해주세요 ㅎ)

김상현님의 프로필 이미지
김상현
질문자

답변 수정했습니다.

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

훌륭합니다. 제가 해드릴 수 있는 이야기는

non blocking 과 blocking 의 차이 정도 밖에 없을 것 같아요.

정리하면,

blocking assign 시 순서에 영향 있음. 순서에 따른 로직 생성

non blocking assign 시 순서에 영향 없음.

 

1. next state 계산에서 Blocking 구문으로 사용하는 이유가 제가 이해한 것이 맞는지
(제가 이해하기론 n_state 는 combinational 회로라 굳이 Non-blocking 구문으로 작성할 이유는 없다고 생각해요. clock이랑 동기화를 해줄 이유가 없어서..그런데)

"Clock 이랑 동기화를 해줄 이유가 없다," 라기 보다는 Combinational 로직은 회로를 구성하는 것이기에 순서가 중요한 blocking 문을 사용하는 것이 맞습니다.

 

2번질문의 답은 스스로 내보셔요.

즐공하세요 :)

김상현님의 프로필 이미지
김상현
질문자

(assign 순서를 바꾼겁니다. 지금 blocking 문의 assign 순서에 따라 다른 결과, 즉 다른 로직이 만들어진다 를 알게 해드리고 싶어요)

이 다음 문장을 이해하실 수 있을꺼에요. assign 자체가를, assign 순서 자체가 로 수정!

 

아 이해가 됬습니다. Blocking 구문으로 작성하면 순서에 따라 결과가 달라질 수 있다는 말씀이신 것 같네요.

하나 더 질문 드려도될까요?

어디선가 글을 봤는데 Non-blocking 구문은 sequential logic을 구현할 때 많이 사용한다는 글을 본 것 같습니다. sequential logic은 클럭에 동기화되어서 동작하니까요. 이 말에 대해선 저도 동의합니다.

그래서 되도록 combinational logic 구현엔 Non-blocking 구문을 사용하지 않으려고 했는데, 이 생각을 좀 바꿔야할까요?

아니면 Blocking 구문으로 사용하는 것이 좋나요?

 

작성하고 보니 답변이 달려있네요..ㅋㅋ 감사합니다.

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

위와 같은 이유 (순서성)로 다음과 같이 사용하시면 되겠습니다.

암묵적인 룰! 이다 생각하셔도 편합니다.

combinational logic  은 Blocking

sequential logic 은  Non-blocking 

을 사용하시면 되겠습니다. :)

0

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

안녕하세요 :)
올려주신 코드는 보진 않았습니다. 양해부탁드립니다. (공지사항 참고해주세요)
글씨는 검정을 선택하시면 돼요,
제가 알고 싶은 것은
1. next state 계산에서 Blocking 구문으로 사용하는 이유가 제가 이해한 것이 맞는지
(제가 이해하기론 n_state 는 combinational 회로라 굳이 Non-blocking 구문으로 작성할 이유는 없다고 생각해요. clock이랑 동기화를 해줄 이유가 없어서..그런데)
always@(*) 내부의 assign 을 blocking 으로 사용하면, assign 자체가 logic 으로 기술 할 수 있습니다.
즉, blocking 문의 assign 순서에 따라 로직을 표현할 수 있어요, 역으로 질문드립니다. 다음 답을 찾아서 댓글로 달아주세요. (환경은 전부 드렸고 직접 돌려보시면 됩니다.)
순서에따른 값의 비교, bloking, nonblocking 일때의 값을 확인해보시면 답이 되시지 않을까 생각이 들어요.
blocking 사용시
A = B;
C = A;
 
C = A;
A = B;
 
위의 예제에서 A, B, C 값은 각각 어떻게 될까요?
==================================
 
Non blocking 사용시
A <= B;
C <= A;
 
C <= A;
A <= B;
위의 예제에서 A, B, C 값은 각각 어떻게 될까요?
 
 
2. 제가 이해한 것이 맞다면 왜 이 예제는 Blocking 구문으로 작성하면 원하는 파형이 안 나오는 것인지
코드를 안봐서 모르겠어요.
3. 추가로 지금 waveform을 보면 reset이 눌리기 전에 c_state와 n_state가 x로 나오는데, 만약 x로 나오지않고 0으로 나온다면 c_state와 n_state는 Latch로 된 것인지 알고싶습니다.
Latch 또한 x 값이 나올 수 있습니다. 즉, x,0 값만으로 Latch 생성여부를 파악 할 수 없습니다.
 
즐공하세요 :)
 
 
김상현님의 프로필 이미지
김상현

작성한 질문수

질문하기