Kim Seon Deok

[Verilog] Behavioral modeling 본문

Verilog

[Verilog] Behavioral modeling

seondeok 2022. 12. 9. 00:28

 

 

 

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

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

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

 

 

 

 

 

behavioral modeling

입출력관계를 정의하는 방식으로 모듈을 정의한다.

조합논리 회로와 순차 논리회로의 설계 그리고 모델링된 회로의 simulation을 위한 testbench작성에 사용된다.

(모델링된 소스코드 합성을 거쳐 gate-level netlist로 변환)

  • always 구문
  • initial 구문

 

 

 

always 구문

 

always   [@(sensitivity list)]    begin

        blocking 또는 nonblocking문   ;

end

@는 event operator로 감지신호 변화가 있는지 감지한다.

@(sensitivity list)는 always문의 실행을 제어한다.

sensitivity list에 나열된 신호들 중 하나 이상 이벤트가 발생하면 always 내부에 있는 begin ~ end 블록의 실행이 트리거된다.

@(sensitivity list)가 생략되면 무한한 시간. 항상을 의미한다. → 조건없이 계속 반복한다는 뜻

begin ~ end 블록은 절차형 문장들로 구성된다. → procedural assignment

begin ~ end 블록은 blocking ( = ), nonblocking( <= )할당문에 따라 실행방식이 달라진다.

시뮬레이션이 진행되는 동안 무한히 실행이 반복된다.

 

module dff(clk, din, qout) ;
	input   clk, din       ;
	output  qout           ;
	reg     qout           ;

	always  @(posedge clk)    // 클럭의 상승엣지가 들어올 때마다
		qout <= din        ;  // nonblocking문. din을 qout에 할당
endmodule

 

 

 

always 구문의 sensitivity list → @(sensitive_list)

  • 조합회로 모델링

@(.....) 내부 감지신호들이 모두 나열되어야 한다.

만약 특정신호가 빠졌다면 synthesis는 진행되겠지만, 빠진 신호의 변화를 감지할 수 없어 always 구문 안으로 들어가서 값을 결정할 수 없다.

함축적인 감지신호 표현으로 @( * )을 사용할 수 있다.

 

// 조합회로
module mux21_bad(a,b,sel,out) ;
	input  [1:0]  a,b  ;
	input		 sel   ;
	output [1:0]  out  ;
	reg    [1:0]  out  ;

	always  @(a or b)  // 감지신호 목록에 sel 빠짐
		if (sel = 0)
			out = a ; 
		else
			out = b ;
endmodule

감지신호 목록에 sel이 빠졌기 때문에 시뮬레이션을 하면 원하는 결과가 나오지 않는다.

따라서 조합회로를 구현할 땐 감지신호 목록에 입력값을 모두 포함시켜주어야 한다.

 

 

 

  • 순차회로 모델링

synchronous set / reset을 가질 때 → @(.....) 내부 감지신호에 clk 신호만 포함되어야 한다. (set / reset이 클럭의 엣지에 영향을 받기 때문에 굳이 표시할 필요가 없다)

asynchronous set / reset을 가질 때 → @(......) 내부 감지신호에 clk 신호, set / reset 신호 포함되야 한다. (클럭의 엣지와 무관하게 set / reset이 발생하기 때문)

 

module dff_sync_rst(clk, d, rst_n, q, qb) ;
	input   clk, d, rst_n  ;  //res_n 은 reset
	output  q, qb          ;
	reg     q              ;

	assign  qb  = ~q       ;

	always  @(posedge clk)   // clk만 포함되어있으니까 synchronous!
	begin
		if(!rst_n)    // rst_n이 1이 아니라면. 0이라면
			q <= 1'b0   ;   // nonblocking
		else          // rst_n이 1이라면
			q <= d      ;
	end
endmodule

 

 

 

always구문이 testbench에서 사용될 경우

 

simulation 진행에 시간에 대한 제어가 포함되어야 한다.

시간에 대한 제어가 포함되지 않으면 무한 루프로 인식해 deadlock에 빠지게 되어 simulation이 진행되지 않는다.

 

// 잘못된 방식
always           // @( ) 없음. 시간에 대한 제어 없음. 무한루프에 빠짐
	clk = ~clk ; // clk 일정시간지나면 반전됨
 

// 올바른 방식
initial 
	clk = 1'b0      ;   // always문 안의 자료형 초기화
always
	#20  clk = ~clk  ;  // 20ns마다 클럭 반전. 클럭주기는 40ns

always 문 안에 들어가는 자료형은 always문 작성 전에 reg형으로 선언해주어야 한다.

그런데 reg clk ; 를 하게 되면 초기값이 unknown으로 선언되기 때문에(reg, time, integer는 default 초기값이 x이다.)

클럭의 반전이 일어나면 unknown, unknown, ,,,상태가 반복되기 때문에 한번만 수행되는 initial문을 이용해 clk값을 초기화 해준다.

 

 

 

 

 

initial 구문

 

simulation 이 실행되는 동안 한번만 실행된다.

initial 구문 내부는 procedural assignment문으로 구성된다. 

논리합성이 지원되지 않는다. testbench에만 사용가능하다.

 

initial  begin

        blocking 또는 nonblocking 문   ;

end

 

initial begin
	    din = 6'b000000 ;
	#10 din = 6'b011001 ;  // 10ns 지나면 값 바꿈
	#10 din = 6'b011011 ;  // 10ns 지나면 값 바꿈
	#10 din = 6'b011000 ;  // 10ns 지나면 값 바꿈
	#10 din = 6'b001001 ;  // 10ns 지나면 값 바꿈

 

 

모듈을 구현할 때 initial 문이 always 문 앞에 반드시 있어야 하는 것은 아니다. initial문과 always문 내부에서만 문장의 순서가 중요하지, initial문과 always문의 순서는 뒤바뀌어도 문제가 되지 않는다.

 

 

 

 

 

 

'Verilog' 카테고리의 다른 글

[Verilog] 반복문  (0) 2022.12.09
[Verilog] if 문, case 문  (0) 2022.12.09
[Verilog] Procedural assignment  (2) 2022.12.08
[Verilog] Concurrent assignment  (0) 2022.12.08
[Verilog] Gate level modeling  (0) 2022.12.08
Comments