반응형

블록킹 할당 사용

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

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

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

 

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.

 

반응형

+ Recent posts