Kim Seon Deok

[Verilog] Structural modeling - Generate statement 본문

Verilog

[Verilog] Structural modeling - Generate statement

seondeok 2022. 12. 9. 23:15

 

 

 

  • gate level modeling
  • concurrent assignment
  • behavioral modeling 
  • structural modeling 

gate level modeling과 concurrent assignment는 조합회로를 구현하는 데 사용된다. 

behavioral moeling과 structural modeling은 대체로 조합회로와 순차회로를 구현하는 데 사용된다.

 

 

 

 

structural modeling

이미 만들어져 있는 모듈들을 불러와 더 큰 모듈을 설계하는 데 사용된다.

  • module instance
  • module parameter
  • generate statement

 

 

generate statement

 

generate
~
endgenerate

사이 for문, if문, case문을 넣어 회로를 효율적으로 모델링할 수 있게 만든 구문이다.

behavioral modeling의 for, if, case문 안에서는 gate primitive, assign문이 허용되지 않았는데,

genereate - for, if, case - endgenerate 문 안에서는 모듈, 사용자 정의 프리미티브, gate primitive, assign문, inital, always구문 인스턴스 여러개가 들어갈 수 있다.

net, reg, integer, real, time, realtime, event 등의 자료형 선언이 가능하다.

parameter 값 변경이나 defparam에 의한 parameter 재정의도 가능하다.

하지만 생성문에서 parameter, local parameter, input, output, inout, specify block의 선언은 허용되지 않는다.

 

 

 

  • 반복 생성문 (generate - for - generate)

generate - endgenerate문 안에 for문이 들어간 경우이다.

생성문 내에서만 사용될 수 있는 인덱스 변수를 genvar로 선언해주어야 한다.

genvar로 선언되는 변수는 지역변수이고 정수형이다.

genvar변수는 simulation 또는 simulation의 elaboration 과정에서만 정의되고, simulation 또는 simulation이 실제로 진행되는 동안에는 존재하지 않는다. elaboration과정은 simulation이나 synthesis를 위해 구문 오류를 검출하고 모듈의 연결, 계층 참조에 대해 분석하는 과정을 말한다.

for문의 begin 뒤에 생성문 블록 식별자 (:identifier)를 붙여주어야 한다.

module graybin(bin, gray);
	parameter           size = 4     	;
	output  [size-1:0]  bin 		 ;
	input	[size-1:0]  gray 		 ;
	genvar				i   	;  // generate - for 문 안에 들어갈 변수 선언
 
	generate
		for (i=0 ; i < size < i = i + 1) begin :bit   // for문 begin 뒤 식별자 bit로 붙임
 			assign bin[i] = ^gray[size-1:i]  ;  // generate문을 사용해 for문 안에 assign문 들어갈 수 있음
 		end
	endgenerate
endmodule
genvar   i ;
generate 
	for (i = 0 ; i < size ; i = i+1) begin : bit  // for문 내부 gate primitive 가능
		xor g1(t[1][i], a[i], b[i]) ;
    	and g2(sum[i], t[1][i], c[i]) ; 
    	or g5(c[i+1], t[2][i], t[3][i]);
	end
endgenerate
genvar    i ;
generate
	for(i=0 ; i <size ; i = i+1) begin :bit
		wire t1, t2,  t3    // generate-for문 안에 자료형 선언 가능
		and g1(t2, a[i], b[i]) ;
		or g2(c[i+1], t2, t3) ;
	end
endgenerate

 

  • 조건 생성문 (generate - for - if)

generate - endgenerate문 안에 if 문이 들어간 경우이다.

여러 경우의 수 중 조건을 만족하는 한가지 경우만 선택

여러 개의 인스턴스가 선택되는 조건은 elaboration되는 시점에서의 값에 의해 결정된다.

generate
	if ((a_width < 8) ||(b_width < 8))
    	c_mul #(a_width, b_width) u1(a,b,product) ;
	else
		w_mul #(a_width, b_width)  u1(a,b,product) ;
endgenerate

 

 

 

 

  • case 생성문 (generate - for - case)

generate - endgenerate문 안에 case 문이 들어간 경우이다.

여러 경우의 수 중 조건을 만족하는 한가지 경우만 선택

여러 개의 인스턴스가 선택되는 조건은 elaboration되는 시점에서의 값에 의해 결정된다.

generate
	case(width)
		1: adder_1bit x1(co,sum,a,b,ci);
 		2: adder_2bit x1(co,sum,a,b,ci);
		default: adder_cla #(width) x1(co, sum, a,b,ci) ;
 endcase

 

 

 

 

 

 

 

 

Comments