Kim Seon Deok
[Verilog] Behavioral modeling 본문
- 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 |