반응형

조합 논리에서 출력은 현재 입력의 함수입니다. 조합 설계의 예로는 멀티플렉서, 디코더, 가산기, 감산기, 코드 변환기, 인코더 및 기타 우선 순위 인코더가 있습니다. 순차 설계에서 출력은 현재 입력과 과거 출력의 함수입니다.

 

순차 로직

순차 로직은 ​​출력이 현재 입력과 과거 출력의 함수인 디지털 로직으로 정의됩니다. 따라서 순차 논리는 ​​이진 데이터를 보유합니다. 순차 로직 요소는 래치 및 플립플롭이며 주어진 설계 기능에 대한 순차 논리를 설계하는 데 사용됩니다. RTL 설계 엔지니어의 경우 클록 기반 논리 회로에 대한 효율적인 RTL 설계를 이해하는 것이 중요합니다. 순차 로직은 ​​복잡한 설계에서 더 많은 양의 데이터를 보유하는 데 사용됩니다. 로직은 클록의 활성 에지에서 감지합니다. 실제 응용 프로그램에서는 클록의 양의 에지 또는 클록의 음의 에지에서 감지할 수 있는 로직 회로를 설명하는 것이 항상 필수적입니다. 로직 회로는 지정된 클록 기간 동안 유한 출력을 생성해야 합니다.

 

다음 그림은 클럭의 포지티브 에지에 감지한 기본 순차 로직입니다. 로직의 출력은 현재 입력과 과거 출력의 함수입니다.

 

 

포지티브 레벨 감지 D 래치

D 래치에서 D는 데이터 입력을 나타냅니다. 래치는 포지티브 또는 네거티브 레벨의 클록 또는 활성화에 감지됩니다.

포지티브 레벨의 민감한 래치는 그림 8.2에 나타나 있으며 진리표 다음 표에 설명되어 있습니다.

표에서 볼 수 있듯이 래치 활성화(E)가 양의 레벨(논리 1)과 같을 경우 출력 Q는 데이터 입력 D와 같습니다. 그렇지 않으면 출력은 이전 상태(과거 출력)로 유지되며 Qn-1로 표시됩니다.

 

E D Q *Q
1 0 0 1
1 1 1 0
0 X Qn-1 *Qn-1

 

다음 그림은 타이밍 시퀀스를 보여주고 있습니다.

 

타이밍 시퀀스에서 출력 Q는 인에이블 입력 E가 양의 레벨과 동일한 시간 동안 데이터 입력 D와 같습니다. 인에이블 E의 음수 레벨(논리 0) 동안 D 래치는 이전 값을 유지합니다.

 

module d_flip_flop (input D, input LE, output reg Q );

always@(*)

begin

if (LE)
Q <= D;

end
endmodule

 

네거티브 레벨 감지 D 래치

네거티브 레벨에 민감한 D 래치의 진리표는 다음 표와 같으며 활성 로우 또는 네거티브 레벨에 민감한 래치 인에이블 입력(LE_n), 데이터 입력 D, 출력 Q를 갖습니다.

 

LE_n D Q *Q
0 0 0 1
0 1 1 0
1 X Qn-1 *Qn-1

 

 

module d_flip_flop (input D, input LE_n, output reg Q );

always@(*)
begin
  if
(~LE_n)
    Q <= D;
end
endmodule

 

플립플롭

플립플롭은 에지 트리거 순차 로직 요소입니다. 클록의 양의 에지 또는 클록의 음의 에지에서 트리거될 수 있습니다. 플립플롭은 캐스케이드로 연결된 포지티브 및 네거티브 레벨의 래치를 사용하여 실현할 수 있습니다. 플립플롭은 메모리 저장 요소로 사용됩니다.

ASIC 설계에서 D 플립플롭은 메모리 저장 요소로 사용되며 여기서 D는 데이터 입력을 나타냅니다.

 

포지티브 에지 트리거 D 플립플롭

포지티브 에지 트리거 D 플립플롭은 클록의 포지티브 에지에 감지됩니다. 실제로 Edge에 감지할 수 있는 논리 게이트는 없습니다. 포지티브 에지 감지 플립플롭은 네거티브 레벨 감지 래치와 포지티브 레벨 감지 래치를 사용하여 구현됩니다.

 

포지티브 에지 트리거 D 플립플롭의 논리 회로는 다음 그림과 같습니다.

 

 

네거티브 에지 트리거 D 플립플롭

네거티브 에지 트리거 D 플립플롭은 클록의 네거티브 에지에 감지됩니다.

네거티브 에지 트리거 플립플롭은 포지티브 레벨 감지 래치 다음에 네거티브 레벨 감지 래치를 사용하여 실현됩니다.

 

포지티브 에지 트리거 D 플립플롭의 논리 회로는 다음 그림과 같습니다.

 

 

동기 및 비동기 리셋

ASIC 설계용 RTL을 코딩할 때 해결해야 할 중요한 질문 중 하나는 비동기식 리셋을 사용할 때 또는 동기식 리셋을 사용할 때입니다. 이것은 항상 설계 엔지니어의 마음에 혼란을 야기합니다. 동기식 리셋 신호는 활성 클록 에지에서 샘플링되며 데이터 경로에 일부 로직이 있습니다. 반면 비동기 리셋 신호는 활성 클록 에지와 관계없이 샘플링되므로 데이터 경로에 리셋 관련 로직이 없습니다.

 

비동기 리셋을 갖는 D 플립플롭

비동기식 리셋은 데이터 경로에 리셋 관련 로직이 없고 활성 클록 에지와 상관없이 플립플롭을 초기화하는 데 사용됩니다. 플립플롭을 초기화하는 이 기술은 결함이 발생하기 쉽기 때문에 내부 리셋 신호 생성에 권장되지 않습니다. 설계자는 이 리셋 신호를 내부적으로 동기화하여 글리치를 방지하도록 주의해야 합니다.

내부 동기 리셋 신호는 순차 로직에 적용됩니다. 리셋 디어설션은 비동기식 Reset 신호의 주요 문제이며, 이 문제는 2단계 레벨 동기화 장치를 사용하여 극복할 수 있습니다. 레벨 동기화는 리셋 디어설션 중에 조건을 둘러싼 경쟁을 방지합니다.

 

다음 예제는 활성 로우 비동기 리셋 신호 reset_n을 사용합니다.

 

module d_flip_flop (input d_in, input clk, input reset_n, output reg q_out );

always@(posedge clk, negedge reset_n)

begin

if(~reset_n)
q_out <= 1'b0;

else
q_out <= d_in;

end

endmodule

 

동기 리셋을 갖는 D 플립플롭

동기식 리셋 기술에서 리셋 관련 로직은 데이터 경로에 포함되며 리셋은 활성 클록 에지에서 샘플링됩니다. 동기식 리셋은 글리치 또는 위험 문제가 없으므로 이 접근 방식이 설계 중에 가장 적합합니다. 이 메커니즘은 추가 동기화 회로가 필요하지 않습니다.

 

다음 예제는 활성 로우 동기 리셋 신호 reset_n을 사용합니다.

 

module d_flip_flop (input d_in, input clk, input reset_n, output reg q_out );

always@(posedge clk)
begin

if(~reset_n)
q_out <= 1'b0;

else
q_out <= d_in;

end

endmodule

반응형
반응형

블록킹 할당 사용

블로킹 할당은 (=)로 표시되며 조합 논리 설계의 기능을 설명하기 위해 절차 블록 내에서 사용됩니다.

연속 할당을 사용할 때 사용하는 (=) 할당은 블로킹과 논블로킹이 아니므로 혼동하면 안됩니다.

다음 예는 다중 할당 구문을 사용하여 디자인의 기능을 설명합니다.

 

module half_adder (
input a_in;
input b_in;

output sum_out;

output carry_out ) ;

 

assign sum_out = a_in ^ b_in;
assign carry_out = a_in & b_in;
endmodule

 

다음은 절차 블록에서 블로킹 할당을 사용하는 예제입니다. 상호 의존적 블로킹 할당의 순서가 올바르지 않으면 시뮬레이션 및 합성 불일치의 가능성이 있습니다.

이 예제에서는 블로킹 문의 순서로 인한 시뮬레이션 및 합성 불일치 문제가 표시됩니다. 할당을 차단하면 현재 할당이 실행되지 않는 한 다음 할당 실행이 차단됩니다.

 

module blocking_assignment (input a_in, output reg y1_out, output reg y2_out ) ;
always@(a_in)
begin
  y2_out=y1_out;
  y1_out=a_in;
end
endmodule


if...else case 구조의 사용

케이스 구성 내 조합 설계의 경우 모든 블로킹 할당이 포함되어야 합니다!

다음 예제는 case문을 사용하여 병렬 로직을 추론하는 방법을 보여주고 있습니다. 's_in' 상태에 따라 입력 d_in[3:0] 중 하나가 출력 'y_out'에 할당됩니다. 'case' 구조를 사용하기 때문에 병렬 논리를 생성합니다.

 

module mux_4to1(input [3:0] d_in, input [1:0] s_in, output reg y_out) ;

always @ (*)
begin
  case
(s_in)
    2'b00 : y_out = d_in[0];
    2'b01 : y_out = d_in[1];
    2'b10 : y_out = d_in[2];
    default : y_out = d_in[3];
  endcase
end
endmodule

 

중첩 멀티플렉서 또는 우선 순위 논리

if-else 구문을 사용하여 기능을 설명하면 합성 결과가 우선 순위 논리로 귀결됩니다. 우선 순위 논리를 설명하기 위해 if-else 구문을 사용하는 것이 좋습니다.

 

다음 예제는 중첩된 if-else 구성을 사용하는 4:1 mux의 기능에 대한 코딩입니다.

 

module mux_4to1(input[3:0]d_in, output reg y_out, input [1:0] s_in ) ;
always @ (*)
begin
  if
( s_in == 2'b00)
    y_out = d_in[0];
  else if( s_in == 2'b01)
    y_out = d_in[1];
  else if( s_in == 2'b10)

y_out = d_in[2];

else

y_out = d_in[3];

end

endmodule

 

 

module decoder_2to4 ( input [1:0] sel_in, input enable_in, output wire [3:0] y_out);
assign y_out = enable_in ? ( 1 << sel_in ) : 4'b0000;

endmodule

 

병렬 논리 또는 디코딩 논리

디코딩 논리의 기능을 설명하는 동안 연속 할당 또는 사례 구성을 사용합니다. 둘 다 병렬 논리를 생성합니다. 챕터에서 논의된 바와 같이. 6, 디코더는 병렬 선택 입력을 가지며 병렬 출력을 생성해야 합니다.

디코더가 case-endcase 구성을 사용하여 설명된 경우. 그런 다음 병렬 논리도 추론합니다. Assign case-endcase를 사용하여 디코더 구현을 위해 추론된 논리는 그림 7.11에 나와 있습니다.

 

//Decoder using ‘case-endcase’
module decoder_2to4 (input [1:0] sel_in, input enable_in, output reg [3:0] y_out ) ;

always @ (*)
begin
  if
(enable_in)
    case (sel_in)
      2'b00 : y_out = 4'b0001;
      2'b01 : y_out =4'b0010;
      2'b10 : y_out =4'b0100;
      default : y_out =4'b1000;
    endcase
  else
    y_out = 4'b0000;
end
endmodule

 

case 구성에서 누락된 기본 조건

case-endcase 표현식을 사용하는 동안 모든 조건이 포함되지 않으면 설계에 의도하지 않은 래치가 발생합니다. 디자인 기능에 모든 케이스 조건이 지정되지 않은 경우 디폴트문을 사용하는 것이 좋습니다. 기본값이 누락되고 모든 조건이 포함되지 않은 경우 합성 도구는 누락된 케이스 조건으로 경고를 깜박이고 의도하지 않은 래치가 있는 로직를 유추합니다.

 

module decoder_2to4 (input [1:0] sel_in, input enable_in, output reg [3:0] y_out );

always @ (*)

begin
if
(enable_in)
  case (sel_in)
    2'b00 : y_out = 4'b0001;
    2'b01 : y_out =4'b0010;
    2'b10 : y_out =4'b0100;
  endcase
else
  y_out = 4'b0000;

end

endmodule

 

else 조건이 없는 중첩된 if...else

표시된 대로 4:1 mux 기능은 중첩된 if-else를 사용하여 설명되지만 else 조건이 없기 때문에 의도하지 않은 래치로 4:1 mux를 유추합니다. RTL 디자인에 else 조건을 통합하여 의도하지 않은 래치를 피하는 것이 좋습니다.

 

다음은 로직이 의도하지 않은 래치를 생성하는 예를 보여주고 있습니다.

 

module mux_4to1_else_mising (output reg y_out, input [3:0] d_in, input [1:0] s_in );

always @ (*)
begin
  if
( s_in == 2'b00)
    y_out = d_in[0];
  else if( s_in == 2'b01)
    y_out = d_in[1];
  else if( s_in == 2'b10)
    y_out = d_in[2];
  else if (s_in == 2'b11)
    y_out = d_in[3];
end
endmodule

 

논리적 등식 대 케이스 평등

논리적 등식(==) 및 논리적 부등식(!=) 연산자는 합성 가능한 설계에 사용되는 반면, /소문자 등호(===) 및 대소문자의 부등식(!==)은 합성 가능한 설계에서 권장되지 않습니다.

 

논리적 등식과 논리적 부등식 연산자

1. 합성 가능한 디자인에 사용 권장

2. 피연산자 중 하나라도 x 또는 z 값을 갖는 경우 결과는 미지수(x)이며 논리적 비교 결과는 거짓으로 귀결됩니다.

3. 피연산자 중 하나에 x 또는 z 값이 있는 경우 비교 결과가 비결정적입니다.

 

다음은  a_in b_in과 비교하는 예제입니다. 여기에서 피연산자 중 하나에 x 또는 z 값이 있으면 else 절이 실행되고 else 조건에 지정된 논리를 유추합니다.

 

always@(a_in, b_in)
begin
  if
(a_in==b_in)
    y_out= a_in ^b_in;
  else
    y_out =a_in &b_in;
end
//For either of a_in, b_in has ‘x’ or ‘z’ value then the result is y_out=a_in & b_in;

 

대소문자 동등 연산자와 대소문자 불일치 연산자

1. 합성이 불가능한 디자인에 사용 권장

2. 피연산자 중 하나에 x 또는 z 값이 있는 경우 결과는 알려진 값이고 결과는 참 또는 거짓입니다.

3. 피연산자 중 하나에 x 또는 z 값이 있는 경우 비교 결과가 결정적입니다.

 

다음은 a_in b_in과 비교하는 예제입니다. 여기서 피연산자 중 하나가 x 또는 z 값이면 a_in b_in과 같으면 if 절이 실행되고 if 조건에 지정된 논리를 유추합니다.

 

always@(a_in, b_in)
begin
  if
(a_in===b_in)
    y_out= a_in ^b_in;
  else
    y_out =a_in &b_in;
end
//For either of a_in, b_in has ‘x’ or ‘z’ value then the result is y_out=a_in ^ b_in;

 

여러 드라이버 할당

연속 할당을 사용하는 동안 동일한 네트(와이어)가 여러 표현식에 의해 구동되는 경우 합성 도구는 '다중 드라이버 할당' 오류를 깜박입니다.

유사하게, 동일한 'reg' 변수가 여러 절차 블록 내에서 다른 표현식에 의해 구동되면 다중 드라이버 오류가 발생합니다.

 

wire y_tmp;
assign y_tmp = a_in ^ b_in;
assign y_tmp = a_in & b_in;
//in this example y_tmp is assigned by using ‘xor’ and ‘and’ at a me and hence mulple driver assignment error.

 

반응형
반응형

연속 할당 대 절차 할당

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

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

반응형
반응형

이벤트 큐 및 디자인 지침

디자인 및 코딩 지침은 일반적으로 디자인 성능, 가독성 및 재사용성을 향상시키는 데 사용됩니다. 조합 설계는 설계가 최소 전파 지연과 최소 면적을 갖는 방식으로 코딩되어야 합니다.

Verilog를 사용하여 디자인을 설명하는 동안 항상 특정 코딩 지침을 따르는 것이 좋습니다.

 

Verilog 계층화된 이벤트 큐

Verilog는 절차 블록에서 두 종류의 할당을 지원합니다. 이러한 할당은 blocking(=) non-blocking(<=) 할당으로 명명됩니다.

 

조합 논리 설계를 설명하는 동안 항상 blocking 할당을 사용하는 것이 좋습니다. 그 이유는 아주 간단하지만 그 이면의 근본을 이해하는 것이 중요합니다.

 

블로킹 할당을 이해하려면 계층화된 이벤트 큐의 개념을 이해해야 합니다. IEEE 1364-2005 Verilog 표준에 따르면 계층화된 이벤트 큐는 4가지 주요 영역으로 분류됩니다. 이러한 영역의 이름은 다음과 같습니다.

활성, 비활성, NBA 및 모니터.

 

Verilog 계층화된 이벤트 큐는 4개의 주요 영역을 가지며 아래에 설명되어 있습니다.

i. 활성 큐: 대부분의 Verilog 이벤트는 활성 이벤트 큐에서 예약됩니다. 이러한 이벤트는 임의의 순서로 예약하고 임의의 순서로 평가하거나 업데이트할 수 있습니다. 활성 큐는 블로킹 할당, 연속 할당, 논블로킹 할당의 RHS 평가(NBA LHS는 활성 큐에서 업데이트되지 않음), $display 명령을 업데이트하고 기본 요소를 업데이트하는 데 사용됩니다.

ii. 비활성 큐: #0지연 할당이 비활성 큐에서 업데이트됩니다.

Verilog에서 #0 지연을 사용하는 것은 좋은 습관이 아니며 이벤트 일정 및 순서를 불필요하게 복잡하게 만듭니다. 대부분의 경우 설계자는 #0 지연 할당을 사용하여 조건 주변의 경쟁을 피하기 위해 시뮬레이터를 속입니다.

iii. NBA : 이 대기열에서 논블로킹 할당의 LHS가 업데이트됩니다.

iv. 모니터 큐: $monitor $strobe 명령을 평가하고 업데이트하는 데 사용됩니다. 모든 변수의 업데이트는 현재 시뮬레이션 시간 동안입니다.

 

Verilog 블로킹 할당

블로킹 할당은 절차적 블록 내에서 순차적으로 실행됩니다. 할당 블로킹은 현재 할당을 실행하는 동안 절차 블록의 모든 후행 문을 차단합니다. 블로킹 할당의 실행은 항상 1단계 프로세스로 간주됩니다. 활성 이벤트 큐에서 차단 할당의 RHS가 평가되고 동일한 타임스탬프 동안 블로킹 할당의 LHS가 업데이트됩니다.

블로킹 할당에 대한 예제는 다음과 같습니다.

 

// Verilog RTL code using the blocking assignments
reg a_reg, b_reg;

// Functionality of design
always @ (a_reg or b_reg)

begin

a_reg=b_reg;

b_reg=a_reg;
end

 

불완전한 감지신호목록

always 절차 블록을 사용하는 동안 감도 목록에 필요한 모든 신호 및 입력을 통합하는 것이 좋습니다.

 

다음은 2입력 NAND 로직의 기능을 설명하기 예제입니다.

합성 도구는 감지신호 목록을 무시하고 2개의 입력 NAND 게이트를 합성 가능한 출력으로 유추하지만 시뮬레이터는 입력 b_in의 변경을 무시하고 출력 파형을 생성합니다. 이는 시뮬레이션 및 합성 불일치로 이어집니다. 합성할 수 없는 구성을 사용하는 테스트벤치는 시뮬레이션 및 합성 불일치를 보고하도록 코딩됩니다.

 

// Verilog RTL code to understand the incomplete sensitivity list
module logic_design(
input a_in,
input b_in,

output reg y_out) ;

// Functionality of design

always @ (a_in)

begin

if (a_in==1’b1 && b_in==1’b1)
y_out = 1’b0;

else
y_out =1’b1;

end

endmodule

 

//testbench to find the simulation and synthesis mismatch
module
test_logic;
// Inputs
reg a_in;
reg b_in;
// Outputs
wire y_out;

// Instantiate the Unit Under Test (UUT)
logic_design uut (
.a_in(a_in),
.b_in(b_in),
.y_out(y_out)
);

always #25 a_in = ~a_in;
always #40 b_in = ~b_in;

initial
begin
  // Initialize Inputs
  a_in = 0;
  b_in = 0;
  // Wait 100 ns
  #100;
end
endmodule

 

 

감지신호 목록에서 b_in이 누락되어 있으므로 a_in = 1 b_in = 1일 때 y_out 1입니다. 그러나 a_in = 1 b_in = 1일 때 NAND 게이트 출력은 0입니다. 따라서 시뮬레이션 및 합성 불일치가 발생합니다.

반응형

+ Recent posts