Kim Seon Deok

[Verilog] Combinational Logic Modeling 본문

Verilog

[Verilog] Combinational Logic Modeling

seondeok 2022. 12. 10. 23:47

 

 

 

조합회로는 현재 들어오는 입력에 의해 출력이 결정된다.

 

조합논리회로의 형태 logic gate(and,or,not,nand,,,)
multiplexer
encoder
decoder
random logic
adder
subtractor
ALU
Lookup table
Comparator
조합회로설계에 이용되는 verilog 구문 gate primitive
concurrent assignment
behavioral modeling
함수 및 task (시간 제어 못 가짐)
module instance
논립합성이 불가능한 verilog 구문
(simulation용 테스트 벤치에만 사용된다.)
initial문
스위치 프리미티브(cmos, nmos, tran)
forever문
wait, event, 지연 등 타이밍 제어 구문
force-release, fork-join
시스템 task($finish, $time, $display 등)

 

 

 

 

조합논리회로 모델링

  • always구문

감지신호 목록에 회로의 입력신호들이 모두 빠지지 않고 포함되어야 한다. 하나라도 누락된다면,always 구문 안으로 들어가서 값을 결정할 수 없기 때문에,  합성 전과 후의 시뮬레이션 결과가 다를 수 있다.

  • if 조건문과 case 문

모든 입력 조건들에 대한 출력값이 명식적으로 지정되어야 한다.

조건이 없다면 래치가 생성되어 순차논리회로가 될 수 있다.

  • 논리 최적화가 용이한 구조와 표현을 사용

최소의 게이트 수와 최소 지연경로를 갖는 회로가 합성되도록 해야 한다.

  • 소스코드가 간결해지도록 모델링

일정한 들여쓰기를 하면 소스코드의 가독성을 좋게 하여 오류 발생 가능성을 줄여주고 디버깅을 쉽게 한다.

 

 

 

 

 

 

  1. 비트단위 연산자를 사용
  2. 축약 연산자를 사용
  3. gate primitive를 사용
  4. if 조건문을 사용

위 방식을 선택해 모델링하고 테스트벤치를 작성해 기능을 검증 

 

 

 

 

 

 

ex) 4비트 입력이 2개인 NOR gate

module file

// assign문 사용
module nor_gate(a,b,y) ;
	input	[3:0]	a, b	;
	output	[3:0]	y		;

	assign	y = ~(a|b)		;   //축약연산자 사용
endmodule

 

module not_for(a,b,y) ;
	input	[3:0]	a,b	;
	output	[3:0]	y	;
	reg		[3:0]	y	;
	integer			i	;
 
 // always문 사용
	always @(a or b) begin
		for(i=0 ; i<4 ; i = +1) ;
			y[i] = ~(a[i] | b[i]) ;
	end
// gate primitive 사용
	nor U0 [3:0] (y,a,b) ;
    
endmodule

 

testbench file

module tb_nor() ;
	reg	[3:0]	a,b ;
	wire	[3:0] y ;
    
	nor_gate  U0(a,b,y) ;  // nor_gate 인스턴스로 불러옴
    
	initial begin
		a = 4'b0000; b=4'b0000;
	#10 a = 4'b1010; b=4'b0101;
	#10 a = 4'b1100; b=4'b1100;
	#10 a = 4'b1011; b=4'b0000;    
	#10 a = 4'b1001; b=4'b1000;
	#10 a = 4'b1111; b=4'b0000;
	#10 a = 4'b0010; b=4'b0001;
	#10 a = 4'b1101; b=4'b0101;
	#10 a = 4'b0000; b=4'b1101;
	#10 a = 4'b1111; b=4'b1111;
	#10 a = 4'b0111; b=4'b0100;
	#10                       ;
	end
endmodule

 

 

 

ex)Lookup Table

 

module file

module boot_enc(xin, y,y2,neg) ;
	input	[2:0]	xin 		;
	output			y,y2,neg	;
	reg		[2:0]	tmp			;

	assign	y  = tmp[2]	;  // 출력을 3비트로 분리해 할당
	assign	y2 = tmp[1]	;
	assign	neg = tmp[0];

	always @(xin) begin
		case(xin)
 			0 	: tmp = 3'b000;
 			1,2	: tmp = 3'b001;    
 			3	: tmp = 3'b010;            
 			4	: tmp = 3'b011;            
 			5,6	: tmp = 3'b101;
 			7	: tmp = 3'b001;     
 		endcase
	end
endmodule

 

testbench file

module tb_booth_enc;
	reg	[2:0]	xin	;
	wire y, y2, eng	;
	integer 	i	;
    
	booth_enc U0(xin, y, y2, neg)  ; // booth_enc를 인스턴스로 불러옴
	
	initial begin
		xin = 0 ;
		for(i=1 ; i < 16 ; i = i+1)
			#20 xin = i ;
 	end
endmodule

 

 

 

simulation 결과

 

 

 

 

 

 

Comments