본문 바로가기
개발 Tools/Verilog HDL

Verilog HDL 구문들 ( assign, always, case, initial, 반복문, time scale, self-cheacking test bench, @, 블록문 )

by 전컴반 2022. 2. 15.
반응형

조합 회로와 순차 회로를 구현하는 구문을 크게 2가지로 나눌 수 있다. assign과 always구문이다. 

 

 

assign 

 

- 조합회로 대부분의 경우 assign을 사용한다

- 조건 ? 참 : 거짓의 문장을 자주 사용한다

- 출력의 연결은 wire문으로 지정해줘야 한다.

 

 

always 

 

한 번만 실행되는 것이 아니라, 조건이 만족할 때마다 동작한다. 조건에는 에지와 레벨이 있다.

 

- if , else, case 등등과 같은 구문은 always 구문 안에서만 사용해야 한다.

- @ 는 ~~ 할 때라고 해석하면 된다.

- sensitivity_list 신호가 변할 때, "..."를 하라는 의미다. 그래서 모든 입력에 대해서는 "*"를 적어준다.

- 초기화 값을 정의하기에 좋다.

- 반드시 reg로 출력을 정의해야 한다.

 

always @ (sensitivity_list) begin
	....
end

 

begin과 end는 { }의 역할을 한다.

 

예를 들어 inverter를 2가지 구문으로 구현할 수 있다.

 

// assgin
wire out;
assign out = ~in

// always
reg out;
always@(in)
    out = ~in;

 

 

case 문

 

- 조건과 일치하는 경우에 대해 실행된다

- 일치하는 조건이 없다면 default가 실행된다

- default가 없으면 이전에 값을 유지한다.

 

 

 

initial 구문

 

- 시뮬레이션이 시작될 때, (테스트 벤치에서) 한 번만 실행되는 구문이다.

- blocking을 사용한다 == 나열된 순서대로 실행

- 논리 합성이 지원되지 않는다. 이유는 동작 시간을 정할 수 없기 때문이다.

- 초기화와 같은 동작을 한다.

 

initial begin
   clk =0;
   reset =0;
end

 

 

지연시간 기호  # 

 

DUT에선 사용하지 않는다.

 

wire #10 last; //  10 nano 지연

assign #20 one = a & b; // 20 nano 있다가 a와 b를 &해라  

always #5 clk = ~clk; //  5 nano 있다가 클럭을 반전시켜서 넣어라, 주기가 10 nano

 

 

이벤트 기호 @

 

always 없이 테스트 벤치에서 단독으로 사용 가능하다. @을 한글로 번역하면 ~~ 할 때 정도로 볼 수 있다.

 

initial begin
    @(posedge clk);
    #5 addr = 8'h9a;

 

clk이 상승 에지가 될 때까지 기다리다가, 5 nano 있다가 addr에 값을 저장하라는 의미다.

 

 

반복문

 

forever : 무한히 반복

repeat : 지정 횟수만큼 반복

while : 조건에 따라 반복

for : 변수에 의해 반복

 

alwyas 또는 initial 구문에서만 사용 가능

 

for (a = 3'b000; a < 3'b111; a = a+1)
    #10;

    

 

self-cheacking test bench

 

미리 예상되는 출력 값을 작성해 놓고 결과와 비교하는 것,

 

 

블록문

 

{} 같은 애들,

begin end : 나열된 순서에 의해 순차적으로 실행,

fork join :  동시에 실행된다. 종료 시점은 시간적으로 마지막에 실행되는 시점이다, 시물레이션 파형 생성에 유용하다. 

 

아래 코드는 똑같은 코드다.

 

 

timescale

 

`timescale 10ns / 1ns에서 10ns = 단위, 1ns = 정밀도, 해상도로 본다. 

바로 예를 보면,

 

`timescale 10ns / 1ns

# 1.55 set = 0;
# 2.325 set = 0;

 

1.55는 10ns 단위이다. 이걸 1ns로 바꾸면 15.5ns인데 정확도에서 1ns까지만 쓰라고 했으니 소수점은 반올림해서 16ns의 딜레이가 생긴다.

2.325도 1ns로 바꾸면 23.25ns인데 정확도에서 1ns까지만 쓰라고 했으니 소수점은 버림 한다.

 

 

 

반응형

댓글