산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

Verilog 모듈

module 특정 기능을 구현하는 Verilog 코드 블록입니다. 모듈은 다른 모듈에 내장될 수 있으며 상위 모듈은 입력 및 출력 포트를 사용하여 하위 모듈과 통신할 수 있습니다.

구문

모듈 module 안에 넣어야 합니다. 및 endmodule 키워드. 모듈 이름은 module 바로 뒤에 지정해야 합니다. 키워드 및 선택적 포트 목록도 선언할 수 있습니다. 포트 선언 목록에 선언된 포트는 모듈 본문 내에서 다시 선언할 수 없습니다.

  
  
	module <name> ([port_list]);
		// Contents of the module
	endmodule
	
	// A module can have an empty portlist
	module name;
		// Contents of the module
	endmodule

  

모든 변수 선언, 데이터 흐름 문, 함수 또는 작업 및 하위 모듈 인스턴스(있는 경우)는 module 내에 정의되어야 합니다. 및 endmodule 키워드. 동일한 파일에 이름이 다른 여러 모듈이 있을 수 있으며 임의의 순서로 정의할 수 있습니다.

<노스크립트> dff ports

모듈 dff는 3개의 입력 포트 d, clk, rstn 및 1개의 출력 포트 q가 있는 D 플립플롭을 나타냅니다. 모듈의 내용은 D 플립플롭이 다양한 입력 조합에 대해 어떻게 작동해야 하는지 설명합니다. 여기에서 입력 d는 활성 로우 리셋이기 때문에 rstn이 하이인 경우 클록의 양의 에지에서 항상 출력 q에 할당됩니다.

  
  
// Module called "dff" has 3 inputs and 1 output port
module dff ( 	input 			d,
							input 			clk,
							input 			rstn,
							output reg	q);
			
	// Contents of the module	
	always @ (posedge clk) begin
		if (!rstn)
			q <= 0;
		else 
			q <= d;
	end
endmodule

  

하드웨어 도식

이 모듈은 합성 중에 다음 디지털 회로로 변환됩니다.

<노스크립트>

모듈 외부에는 코드를 작성할 수 없습니다!

모듈의 목적은 무엇입니까?

모듈은 특정 동작 특성을 구현하고 합성 중에 디지털 회로로 변환되는 설계 단위를 나타냅니다. 입력 조합은 모듈에 제공될 수 있으며 해당 출력을 제공합니다. 이것은 동일한 모듈을 허용합니다. 더 복잡한 하드웨어를 구현하는 더 큰 모듈을 형성하는 데 재사용됩니다.

예를 들어, 위에 표시된 DFF를 연결하여 시프트 레지스터를 형성할 수 있습니다.

  
  
module shift_reg ( 	input 	d,
										input  	clk,
										input 	rstn,
										output 	q);
			
	wire [2:0] q_net;
	dff u0 (.d(d), 				.clk(clk), .rstn(rstn), .q(q_net[0]));
	dff u1 (.d(q_net[0]), .clk(clk), .rstn(rstn), .q(q_net[1]));
	dff u2 (.d(q_net[1]), .clk(clk), .rstn(rstn), .q(q_net[2]));
	dff u3 (.d(q_net[2]), .clk(clk), .rstn(rstn), .q(q));
	
endmodule

  

하드웨어 도식

dff 인스턴스는 Verilog RTL 모듈에 설명된 대로 와이어로 함께 연결됩니다.

<노스크립트>

더 큰 디자인 블록을 형성하기 위해 더 작은 블록에서 구축하는 대신 그 반대도 수행할 수 있습니다. 각각이 특정 기능을 구현하는 모듈로 표시될 수 있도록 간단한 GPU 엔진을 더 작은 구성 요소로 분해하는 것을 고려하십시오. 아래 표시된 GPU 엔진은 각각 특정 기능을 수행하는 5개의 서로 다른 하위 블록으로 나눌 수 있습니다. 버스 인터페이스 장치는 외부에서 설계로 데이터를 가져와서 다른 장치에서 처리하여 명령을 추출합니다. 라인 아래의 다른 유닛은 이전 유닛에서 제공한 데이터를 처리합니다.

<노스크립트> gpu modules

각 하위 블록은 module로 나타낼 수 있습니다. 다른 모듈과의 통신을 위한 특정 입력 및 출력 신호 세트와 각 하위 블록은 필요에 따라 더 미세한 블록으로 더 나눌 수 있습니다.

최상위 모듈이란 무엇입니까?

최상위 모듈은 포함 다른 모든 모듈. 최상위 모듈은 다른 모듈 내에서 인스턴스화되지 않습니다.

예를 들어, 설계 모듈은 일반적으로 최상위 테스트벤치 모듈 내에서 인스턴스화되므로 입력 자극을 제공하여 시뮬레이션을 실행할 수 있습니다. 그러나 테스트벤치는 다른 모든 것을 캡슐화하는 블록이므로 최상위 모듈이므로 다른 모듈 내에서 인스턴스화되지 않습니다. .

최상위 디자인

아래에 표시된 디자인 코드에는 design이라는 최상위 모듈이 있습니다. 디자인을 완성하는 데 필요한 다른 모든 하위 모듈이 포함되어 있기 때문입니다. 하위 모듈은 mod1 내부의 mod3 및 mod2 내부의 mod4와 같이 더 많은 중첩된 하위 모듈을 가질 수 있습니다. 어쨌든 mod1과 mod2가 인스턴스화될 때 이 모든 것이 최상위 모듈에 포함됩니다. 따라서 디자인은 완전하며 디자인의 최상위 모듈입니다.

  
  
	//---------------------------------
	//  Design code
	//---------------------------------
	module mod3 ( [port_list] );
		reg c;
		// Design code
	endmodule
	
	module mod4 ( [port_list] );
		wire a;
		// Design code
	endmodule
	
	module mod1 ( [port_list] );	 	// This module called "mod1" contains two instances
		wire 	y;
	
		mod3 	mod_inst1 ( ... ); 	 		// First instance is of module called "mod3" with name "mod_inst1"
		mod3 	mod_inst2 ( ... );	 		// Second instance is also of module "mod3" with name "mod_inst2"
	endmodule

	module mod2 ( [port_list] ); 		// This module called "mod2" contains two instances
		mod4 	mod_inst1 ( ... );			// First instance is of module called "mod4" with name "mod_inst1"
		mod4 	mod_inst2 ( ... );			// Second instance is also of module "mod4" with name "mod_inst2"
	endmodule
	
	// Top-level module
	module design ( [port_list]); 		// From design perspective, this is the top-level module
		wire 	_net;
		mod1 	mod_inst1 	( ... ); 			// since it contains all other modules and sub-modules
		mod2 	mod_inst2 	( ... );
	endmodule

  

테스트벤치 최상위 수준

테스트벤치 모듈은 설계의 기능을 확인하기 위한 자극을 포함하고 있으며 주로 시뮬레이션 도구를 사용한 기능 검증에 사용됩니다. 따라서 디자인은 인스턴스화되고 테스트벤치 모듈 내에서 d0이라고 불립니다. 시뮬레이터 관점에서 테스트벤치는 최상위 모듈입니다.

  
  
	//-----------------------------------------------------------
	// Testbench code
	// From simulation perspective, this is the top-level module
	// because 'design' is instantiated within this module
	//-----------------------------------------------------------
	module testbench; 												
		design d0 ( [port_list_connections] ); 	
		
		// Rest of the testbench code
	endmodule

  

계층적 이름

모듈이 서로 내부에서 인스턴스화될 수 있을 때 계층적 구조가 형성되므로 최상위 모듈을 루트라고 합니다. . 주어진 모듈 내의 각 하위 모듈 인스턴스화는 서로 다른 식별자 이름을 가져야 하므로 신호에 액세스하는 데 모호함이 없습니다. 계층적 이름은 점 .로 구분된 이러한 식별자 목록으로 구성됩니다. 계층 구조의 각 수준에 대해 특정 신호에 대한 계층적 경로를 사용하여 모든 모듈 내에서 모든 신호에 액세스할 수 있습니다.

  
  
	// Take the example shown above in top level modules
	design.mod_inst1 					// Access to module instance mod_inst1
	design.mod_inst1.y 					// Access signal "y" inside mod_inst1
	design.mod_inst2.mod_inst2.a		// Access signal "a" within mod4 module
	
	testbench.d0._net; 					// Top level signal _net within design module accessed from testbench

  

verilog

  1. Verilog 튜토리얼
  2. Verilog 연결
  3. Verilog - 호두 껍질에
  4. Verilog 할당
  5. Verilog 차단 및 비 차단
  6. Verilog 기능
  7. Verilog 작업
  8. Verilog 계층적 참조 범위
  9. Verilog 클록 생성기
  10. Verilog 수학 함수