Kim Seon Deok

[Verilog] Procedural assignment 본문

Verilog

[Verilog] Procedural assignment

seondeok 2022. 12. 8. 23:49

 

 

 

 

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

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

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

 

 

 

 

 

assignment

  • 연속 할당문(concurrent assignment)  net형 객체에 값을 할당(wire)  assign 문
  • 절차형 할당문(procedural assignment)  variable형 객체에 값을 할당(reg, integer)  behavioral modeling 구문 중 initial, always 구문 내부에 있는 문장들을 말함
    • blocking 할당문 →  = 를 사용
    • nonblocking 할당문 →  <= 를 사용
  • 절차형 연속 할당문(procedural continuous assignment : PCA) → assign-deassign문, force-release문

 

 

 

procedural  assignment (절차형 할당문)

 

procedural = 절차의 → 여러 개의 할당문이 순차적으로 실행되어야 한다. 순서가 영향을 미친다.

variagleble형 객체(reg, integer)에 값을 할당한다.

 

지연을 갖지 않으며 다음 절차형 할당문에 의해 값이 갱신될 때까지 변수에 할당된 값을 유지

always, initial 등의 프로시저 내부에서 사용된다.

할당문의 순서가 시뮬레이션 결과에 영향을 미칠 수 있다.

 

module proc_assignment(clk, a, b, out) ;
	input clk, a, b ;
	output     out  ;
	reg     out, c  ;
    
    always @(posedge clk) begin
        c = a & b ;   // blocking assignment
        out <= c  ;   // nonblocking assignment. 위의 코드와 순서가 바뀌면 안된다.
    end
endmodule

 

 

 

blocking 할당문 → = 를 사용

 

현재 할당문의 실행이 끝나고 난 후 그 다음의 할당문이 실행되는 순차적인 흐름을 갖는다.

앞 문장 실행이 종료될 때까지 뒷 문장 blocking

value = [delay or event operator]  expression  ;

 

initial begin
	rega  =  0 ;         // reg형 변수에 대한 할당
	regb[3]  =  1;       // 단일 비트에 대한 할당
	regc[3:5]  =  7;     // 부분 비트에 대한 할당
	mema[address]  =  8'hff ;       // 메모리 요소에 대한 할당
	{carry, acc} = rega + regb  ;   //결합에 대한 할당
end

 

 

 

 

nonblocking 할당문 → <= 를 사용

 

나열된 할당문들이 순차적 흐름에 대한 blocking 없이 정해진 할당 스케줄에 의해 값이 할당된다.

할당문들은 우변이 동시에 평가된 뒤 문장의 순서나 지정된 지연 값에 따른 할당 스케줄에 의해 좌변의 객체에 값이 갱신된다.

동일 시점에 변수들의 순서나 상호 의존성에 의해 할당이 이루어져야 하는 경우에 사용된다.

 

value  <=  [delay or operator]  expression  ;

 

// nonblocking
module non_blk1 ; 
	output out ;
	reg a, b, clk ;
  
	initial begin
		a = 0;
 		b = 1;
 		clk = 0;
	end
 
 	always  clk  =  #5  ~clk ;

	always @(posedge clk) begin
		a <= b  ;
		b <= a  ;
	end
endmodule



// blocking
module non_blk1 ; 
	output out ;
	reg a, b, clk ;
  
	initial begin
		a = 0;
 		b = 1;
 		clk = 0;
	end
 
 	always  clk  =  #5  ~clk ;

	always @(posedge clk) begin
		a = b  ;
		b = a  ;
	end
endmodule

nonblocking은 클럭의 상승엣지가 들어올 때마다 a <= b, b<= a 동시에 수행한다.

우변의 b, a값을 동시에 확인하고 좌변 a,b에 각각 값을 할당한다.

a,b값 변화는 다음과 같다.

a 0 1 0 1 0 1
b 1 0 1 0 1 0

 

 

blocking은 클럭의 상승엣지가 들어올 때마다 위 코드 a = b를 실행하고 나서 b = a를 순차적으로 실행한다.

상승엣지가 들어올 때마다 b값이 a에 할당되고, 그 a 값이 b값에 할당된다.

a 0 1 1 1 1 1
b 1 1 1 1 1 1

 

 

 

 

 

 

'Verilog' 카테고리의 다른 글

[Verilog] if 문, case 문  (0) 2022.12.09
[Verilog] Behavioral modeling  (0) 2022.12.09
[Verilog] Concurrent assignment  (0) 2022.12.08
[Verilog] Gate level modeling  (0) 2022.12.08
[Verilog] Operator  (0) 2022.12.08
Comments