inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

테스트벤치에 대해서 질문 하나 해도 될까요??

813

현세환

작성한 질문수 5

2

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요. 이번에 테스트벤치 작성하면서 궁금한 것이 있어서 질문드립니다.
먼저 i_run신호를 강사님께서 작성하신대로
이렇게 작성하고 시뮬레이션을 돌리면
다음과 같이 나옵니다.
근데 위의 코드를
이렇게 바꾸면
이렇게 나옵니다. 저 두개의 코드는 같은 의미가 아니였나요?
왜 이렇게 나오는지 궁금합니다. 또, 두개의 테스트 벤치중에서 어떤게 맞는 건지 궁금합니다.

verilog-hdl 임베디드 fpga

답변 1

0

설계독학맛비

안녕하세요 :)

이런 응용을?! 이럴 수 있겠다 생각이 드네요.

결론부터 말씀드리면,

 Testbench 에서의 현재 수정하신 (#10 i_run) "i_run 신호는 Clock 에 동기화 되지 않았다" 입니다. 

 

저 두개의 코드는 같은 의미가 아니였나요?

#10 과 posedge clk 는 현재 simulation 상에서 같은 time 을 바라보고 있는 것은 맞습니다. 

하지만 전혀 다른 i_run 신호입니다. :)

위와같이 확인하신 현상은 Verilog Race Condition 이라고 부릅니다.. (출처)

A Verilog race condition occurs when two or more statements that are scheduled to execute in the same simulation time-step, would give different results when the order of statement execution is changed, as permitted by the IEEE Verilog Standard. 

1. "#10 i_run" 신호는 clk 에 동기화되지 않았습니다.

- #10 i_run 으로 하게되면 clk 와 아무런 동기화가 없는, 아무상관없는 i_run 이 됩니다. 이는 simulation 에 따라서 다른 결과를 만들 수 있습니다. 또한 이런 상황은 HW 관점에서 Race condition 이 됩니다. (비추천)

SW 하시는 분들은 이해하기 힘든... 안배우는 내용이죠.

HW 의 Race Condition 을 공부하시면 이해에 도움이 되실 것 같아요.

- posedge clk 이후에 i_run 을 하게 되면, clk 의 상승엣지의 동기화에 맞춘 i_run 이 됩니다.

즉 posedge clk 를 사용하는 것이 맞습니다.

2. 난 꼭!! #10 i_run 을 사용하고 싶다. (다시 말씀드리지만 추천 드리지 않습니다.)

이러려면 blocking assignments (=) 대신, nonblocking assignment (<=) 를 사용하시면 됩니다.

임시적인 방법일 뿐, 정상동작을 보장하긴 힘듭니다. 또한 다른 시뮬레이션 툴에서는 오작동을 할 가능성이 있습니다. (맛비도 정확하게 설명을 못하겠습니다.) 참고로 보여드리려고 작성드립니다. 궁금해하실까봐.

<blocking 사용시>

<non-blocking 사용시>

 

결론은 i_run 신호는 Clock 에 동기화해서 동작시켜야 정상적인 동작을 볼 수 있습니다.

Clock 동기화가 되지 않은 서로 다른 신호는 race condition 을 유발하게 됩니다.

 posedge clk 로 Clock 동기화를 명시하여, i_run 신호를 handling 해주시면 되겠습니다.

 

 

또, 두개의 테스트 벤치중에서 어떤게 맞는 건지 궁금합니다.

제 의도는 기존 코드의 동작이 맞아요. :) 

c_state 기준으로 0 -> 1 -> 2 -> 0 으로 돌면됩니다. (Idle -> run -> done -> idle) 

 

즐공하세요 :)

0

현세환

덕분에 궁금한 것이 말끔하게 해결됐습니다! 즐거운 설에 이런 귀중한 답변 해주셔서 정말 감사드립니다! 늦었지만 새해복 많이 받으시고 행복한 하루 되셨으면 좋겠습니다!

0

설계독학맛비

새해 복 많이 받으시고, 즐공입니다 :)

latency 개념 구현

1

82

3

비바도 all os버전

1

67

2

초기화를 reset_n 이 '1'일 때가 아닌 '0' 일 때 실행시키는 이유 질문

1

68

2

다운로드용량

1

68

2

비바도리눅스설치

1

79

2

전체path복사넣기

1

59

2

Vivado 2025.2 리눅스 설치 후 실행 에러와 솔루션 (libxv_commontasks.so)

1

142

2

explorer.exe오류

1

99

3

mobaxterm설치오류

1

84

2

./build시, waveform 'divide color' 사용

1

51

2

Latch와 관련하여 (Time borrowing, Latch-based design)

1

122

2

clean 명령어가 안되는데, 따로 저장해줘야 하는지 궁금합니다.

0

57

1

안녕하세요 설치 관련 질문 드립니다.

1

60

3

16장 mealy 설계.

1

71

2

14장 Cycle 관련, Testbench 코드.

1

63

2

21강(16장) 초기값 설정이 적용되는 시점 질문

1

59

1

20강(15장) - 밀리 머신 관련하여 질문 드립니다.

1

63

2

build에러 질문

0

54

2

1장 ./build에서 에러가 나요

1

70

2

FPGA 강의 보드 문의 드립니다.

1

104

2

5장 DFF특성에 대한 질문

1

73

3

vivado linux 사용 이유.

1

134

2

메모리의 형태가 전체설계에 미치는 영향이 궁금합니다.

1

102

2

디스코드 멤버쉽 등업 관련 문제

1

91

2