작성
·
918
2
답변 3
1
fsm_test.v 파일에서 52번째 always block 하고 66번째 always block 하고 합쳐서 한 블럭 안에 기술 할 수 있는가에 대한 질문 이었습니다.
아래와 같이 두 always 블록을 합해서 vivado에서 implantation 해보고 schemetic 확인 해 보니 합하기 전이랑 똑 같네요.
근데 이렇게 하면 S-DONE 의 두개의 조건이 나란히 실행되는데 blocking assignmet 로 되었어서
o_done에 1 이 대입되고 n_state가 s_IDLE 로 변하는데 순서 대로 변화 하는지 아님 clk이 없으니 동시에 변화하는지 궁금합니다. 보니까 클럭 없는 always block 은 항상 "=" 만 쓰이는 거 같아서요..
==============================
always @(*)
begin
n_state = S_IDLE; // To prevent Latch.
o_done = 0; // To prevent Latch.
case(c_state)
S_IDLE: if(i_run)
n_state = S_RUN;
S_RUN : if(is_done)
n_state = S_DONE;
S_DONE: o_done = 1;
S_DONE: n_state = S_IDLE;
endcase
==================================
틀려서 좋다고 하셔서 이렇게 해도 되지 않을까 하고 용기를 가지고 질문해 봅니다.^^
너무 주저리 주저리 한것 같네요^^
0
굉장히 훌륭합니다!! 우리는 배우는 단계이기 때문에 틀릴 수 있어요.
저의 의도는, 질문이 잘못되었다가 아닌, 제가 이해할 수 있도록 해달라는 뜻이었습니다. :)
말씀하신 대로 지금 예제에서는 c_state 의 S_DONE 이라는 조건이 같기 때문에 합치셔도 됩니다. (line num 60, 70 조건이 동일)
올려주신 코드가 맞구요. 다음처럼 begin ~ end 로도 case 를 묶으셔도 됩니다.
분리하느냐, 나누느냐 관점이 어떤게 정답이다라기보다는, 설명을 위해서 Step 을 나눠 놓았다 생각하시면 될 것 같아요.
==============================
always @(*)
begin
n_state = S_IDLE; // To prevent Latch.
o_done = 0; // To prevent Latch.
case(c_state)
S_IDLE: if(i_run)
n_state = S_RUN;
S_RUN : if(is_done)
n_state = S_DONE;
S_DONE: o_done = 1;
S_DONE: n_state = S_IDLE; // 붉은색 부분처럼 S_DONE 을 여러번 사용하는 대신, 다음 그림처럼 begin end 로 묶어도됩니다. (결과는 동일해요)
endcase
==================================
동시 변화 관점.
SW 가 아니라 HW 다를 먼저 인지하셔야 됩니다.
blocking assign 을 사용할때,
<assign 순서가 중요한 Case>
reg A,B,C;
always @(*) begin
B = A + 1;
C = B + 1;
end
이거는, 회로를 그려보시면, A -> B -> C 이렇게 연결이 되겠죠?
<assign 순서 상관없는 Case>
reg A,B,C;
always @(*) begin
B = A + 1;
C = A + 2;
end
여기서, B, C 는 아무런 연관이 없습니다.
B 와 C 의 순서를 swap 하여도 동일한 HW 가 생성이 될 것이고, HW 가 생성되었다!
즉 동시성이 보장됩니다.
그렇다면 다음 질문의 답은?
o_done에 1 이 대입되고 n_state가 s_IDLE 로 변하는데 순서 대로 변화 하는지 아님 clk이 없으니 동시에 변화하는지 궁금합니다.
순서대로 변하지 않습니다. 관계없이 동시에 변합니다.
즐공하세요 :)
0
안녕하세요 :)
시간 되실때 답변이라뇨.. ㅎㅎ 없어도 해야죠.
A1. Latch 관련 답변.
원론적인 질문이 가장 어려운 것 같습니다.. 만 아는 범위 내에서 답변을 드리겠습니다.
먼저 Latch 와 F/F 은 저장 소자라는 공통점을 가집니다.
그렇다면, Latch 와 F/F 의 차이를 한번 보겠습니다.
Latch 는 Level sensitive 로 입력신호를 바로 저장 + 출력합니다.
F/F 은 Clock Edge 기반의 동작으로 Clock 신호가 인가될 때 저장 + 출력 합니다. (동기화 입니다.)
여기서 Latch 를 만들면 안된다 라고 말씀드린 이유는.
설계독학에서 뿐만아니라, 현업에 가셔서 설계하실 Digital 로직은 Synchronous (동기식) 동작이기 때문입니다. (Latch 를 일부러 사용하는 Case 도 있다고 합니다. 11년 동안 Latch 를 일부러 만든적은 없었습니다.)
동기 회로를 설계하는데, Latch 소자가 중간에 들어있다면, 이는 Timing 관점에서 문제를 야기합니다. (Timing 관점은 석사 공부가 필요합니다.)
말씀드리고 하자는 내용의 결론은 동기식 회로 설계에서 Level Sensitive 저장 소자를 사용하지 말자입니다. 사용시, Timing 의 문제가 발생합니다. (로직이 오동작 할 수 있습니다.)
아주 다행인건, 현업에 가시면 이런 Latch 가 발생하는 코드들을 잡아주는 Tool 들이 있다는 것이니, 크게 겁먹지 마시고 열심히 설계하시면 됩니다. (Synopsys 사의 spyglass 라는 툴을 썼었습니다.)
더 자세히 알고 싶으시다면, 다음 링크를 참고 부탁드릴께요.
https://electronics.stackexchange.com/questions/38645/why-are-inferred-latches-bad
A2. 그리고 한 가지더요, always block 2번째 3번째는 always block 한개로 같이 기술 될 수 있나요?
라인넘버 혹은 코드를 적어주시겠어요?
PS. 질문을 남기실때, 상세히 적어주시면 감사하겠습니다. (전 항상 처음 보는 거니까요.. ㅎㅎ 지식의 Sync 를 맞춰야 좋은 답이 나오겠죠?)
틀려도 좋으니까, 어떤 고민을 해봤는지까지 적어주시면, 본인실력 + 저의 좋은 답변에 도움이 될 것 같아요.