2017-04-03 7 views
-1

다음 코드가 래치를 유추하지 않는 이유는 무엇입니까?다음 논리에 대해 래치가 유추되지 않는 이유는 무엇입니까?

d와 rst가 모두 "0"이면 "e"에 할당 할 항목을 도구에서 어떻게 알 수 있습니까?

module tmp(input d, 
     input clk, 
     input rst, 
     output reg o, 
     output reg e); 

[email protected](posedge clk) 
     if(rst) begin 
       o <=0; 
       e <= 1; 
       end 
     else if(d) begin 
        o<=1; 
        e<=0; 
       end 
      else 
        o <=1; 
endmodule 
+0

if/else가 우선 순위 논리입니다. rst = 0이고 d = 1이면 e는 0으로 지정됩니다. rst = 0이고 d = 0이면 e는 마지막 값을 유지합니다. 이는 래치가 아닌 플립 플롭을 설명합니다. – toolic

+0

'e'는 마지막 값을 유지합니다. 그리고 레벨에 민감하지 않은 가장자리에 민감한 디자인이 있기 때문에 래치가 아닌 FF가 유추됩니다. –

답변

2

당신의 항상 블록 모델 순차 논리 (의 플립 플롭을 가진, 즉 논리). drst이 모두 1'b0 인 경우 e에 할당 된 코드 행은 실행되지 않습니다. 따라서 e은 이전 값을 유지 (즉 기억)합니다. 그러나 e은 D 형 플립 플롭으로 합성되기 때문에 괜찮습니다. 플립 플롭에는 상태가 있으며, 스토리지가 있습니다. 걸쇠가 필요하지 않습니다.

+0

그래서, 항상 @ (posedge **)가 FF를 추론하는 도구를 만들었습니까? 그리고 우선 순위 로직 때문에 플럽 이전이라면 "e"는 상태를 변경하지 않습니다; 그러므로 "걸쇠"를 완전히 피하는 것입니까? 항상 @ (**); 만약 내가 똑같은 논리를 썼다면; 이전 상태 (기본값)를 저장할 FF/메모리 요소가 없기 때문에 래치를 추측했을 것입니다. 답변 해 주셔서 감사합니다. – user2624915

+0

예, 항상 @ (posedge **)는 도구가 FF를 추론하도록 만듭니다. (다른 로직 구성 요소는 클록 에지에서 출력이 변경됩니까?) –