반응형

연속 할당 대 절차 할당

연속 할당: 연속 할당은 값을 네트에 할당하는 데 사용됩니다. 연소 할당은 조합 논리 기능을 코딩하는 데 사용됩니다. 이러한 할당은 활성 이벤트 큐에서 업데이트되고 오른쪽 표현식 평가 시 업데이트됩니다. 연속 할당을 사용하는 동안 포트 또는 출력이 와이어로 선언됩니다.

assign y_out = sel_in ? a_in: b_in;

 

절차적 할당: 절차적 할당은 reg에 값을 할당하는 데 사용됩니다. 이들은 조합 논리와 순차 논리를 모두 코딩하는 데 사용됩니다. reg에 할당된 출력은 다음 할당이 실행될 때까지 유지됩니다. 이러한 할당은 절차 블록에서 always, initial 및 요구 사항에 따라 작업 및 기능 내에서 사용됩니다.

절차 블록에서 블로킹(=) 할당이 사용되면 활성 이벤트 큐에서 업데이트됩니다. 모든 논블로킹 할당(<=)은 활성 이벤트 큐에서 평가되지만 논블로킹 이벤트 큐에서 업데이트됩니다.

 

always@(posedge clk) // Sequential design description
begin
  q_out<= data_in;
end

always@ * // Combinational design description
begin
  y_out = sel_in ? a_in : b_in;
end

 

설계의 조합 루프

설계의 조합 루프는 위험하고 중대한 설계 오류 중 하나입니다. 동일한 신호가 여러 절차 블록에서 사용되거나 할당되는 경우 설계의 조합 루프가 발생합니다. 동일한 신호가 표현식의 오른쪽 또는 왼쪽에 있는 경우 설계에 조합 루프가 있는 것입니다.

조합 루프는 진동 동작을 나타내며 업데이트 단계에서 경쟁 조건을 가질 수 있습니다.

다음은 조합 루프의 예를 보여주고 있습니다.

 

always@(a)
begin
  b=a;
end


always
@(b)
begin
  a=b;
end

 

위의 예에서 두 블록은 항상 동시에 실행되기 때문에 b를 업데이트하는 동안 b 값이 a에 할당됩니다. 이것은 디자인의 경쟁 조건입니다. 이 디자인은 이벤트로 인해 진동 동작을 생성합니다.

 

조합 루프는 합성할 수 없으며 합성 도구는 조합 루프에 대한 오류 또는 경고를 생성합니다. 조합 루프는 설계에 잠재적인 위험이 될 수 있으므로 피해야 합니다.

 

위의 예에서 볼 수 있듯이 always@(a) 블록은 이벤트 on에 감지되고 b 출력을 생성합니다. 결국 b 입력에 대한 변경 사항은 다른 always 블록 always@(b)를 트리거하고 출력을 생성하는 데 사용됩니다. 따라서 이것은 계속해서 진동 동작 또는 설계 조건 주변의 경쟁을 나타냅니다.

 

이 문제를 극복하기 위한 솔루션은 레지스터를 사용하여 다중 always 블록을 트리거하는 신호의 종속성을 피하는 것입니다. 레지스터를 조합 루프에 삽입하여 값을 업데이트할 수 있습니다.

 

always@(posedge clk)
begin
  b<=a;
end

always@(posedge clk)
begin
  a<=b;
end

 

조합 루핑을 방지하려면 논블로킹 할당을 사용하고 레지스터 논리를 사용하여 조합 루프를 끊습니다.

 

다음 예제는 두 always 블록은 클럭의 양의 에지에서 각각 a, b에 값을 할당합니다. 두 절차 블록이 동시에 실행되지만 논블로킹 할당은 NBA 큐에 대기되므로 다음 그림과 같은 구조가 생성됩니다.

 

 

설계상의 의도하지 않은 래치

래치는 활성 레벨 동안 명백하게 데이터를 출력으로 전송하므로 설계에 의도하지 않은 래치가 없어야 합니다. 의도하지 않은 래치는 설계 테스트 또는 DFT 중에 문제를 야기하므로 ASIC 설계에서 권장되지 않습니다.

STA 중에도 타이밍 알고리즘은 데이터를 클럭의 양의 에지에서 샘플링할지 아니면 음의 에지에서 데이터를 샘플링할지 이해할 수 없습니다.

 

다음 코드에서는 else 조건을 실행할 때 b_in에 대한 할당에 대한 정보가 제공되지 않으므로 래치를 유추하고 b_in의 이전 값을 유지합니다.

 

always@(c_in)
begin
  if
(c_in==1)
  begin
    a_in=1’b1;
    b_in=1’b1;
  end
  else
  begin
    a_in=1’b0;
  end
end

 

 

다음 그림은 논리 표현을 보여주고 있습니다. if-else 구조는 멀티플렉서를 유추하고 b_in에 대한 할당이 else 내에서 누락되었으므로 활성화 입력 c_in에 의해 제어되는 양의 레벨 감지 래치를 유추합니다.

 

 

래치는 if-else 내의 불완전한 할당이나 케이스 구성을 사용하는 동안 다루어진 불완전한 조건으로 인해 추론됩니다. RTL을 코딩하는 동안 디자이너가 이것을 처리하는 것이 좋습니다.

 

다음 예제는 AND 게이트를 구현에 있어서 래치의 발생 예입니다.

else 조건이 누락되어 의도하지 않은 D 래치로 AND 게이트를 유추합니다. RTL 설계 엔지니어의 의도는 AND 게이트를 구현하는 것이지만 다른 것이 누락되어 래치 기반 설계를 유추합니다.

 

module logic_design ( input a_in, b_in, output reg y_out );

// missing b_in from sensitivity list
always@(*)
begin
  if
(a_in ==1 && b_in ==1)
    y_out = 1;
end
endmodule

반응형

+ Recent posts