카테고리 없음

[디지털 시스템] 1. 첫 verilog module 작성

Dalcomi20 2021. 9. 12. 21:36

Verilog는 Hardware를 표현하는 데 널리 사용되는 Hardware Description Language이다.

Verilog로 간단하게는 flip-flip으로 부터, 복잡하게는 컴퓨터까지 design할 수 있다.

Verilog라는 언어로 디지털 시스템을 만들려면 verilog file을 컴파일하고,

우리가 어떻게 어떻게 동작해야 된다고 지시한 'behavioural description'을

하드웨어를 구성하는 단위들의 조합으로 표현해주는 synthesizer 기능을 해주는 도구가 필요하다.

 

XILINIX사의 Vivado는 그러한 프로그램이다.

Vivado는 위에서 언급한 synthesizing 뿐만이 아니라,

만들어진 모듈의 schematic을 그려주고, simulation을 할 수 있는 다양한 기능을 지원한다.

대학생이라면, 학교 계정으로 무료로 다운받아보자:

 

https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/2020-2.html

 

Downloads

Vivado, Vitis, Vitis Embedded Platform, PetaLinux, Device models

www.xilinx.com

Vivado를 다운받아 설치하면 된다. 버전은 나는 2020.2를 사용하고 있다.

최신 버전은 2021.1까지 나왔는데 뭐가 다른지는 필요하면 찾아보자.

 

아래 코드는

D-flip-flop (dff) 모듈 4개를 이어 만든 shift register의 코드이다.

 

`timescale 1ns / 1ps


module dff(
    input d,
    input clk,
    input rstn,
    //q is stored!!
    output reg q
    );
    
    //update the stored value q on rising edge.
    //here we dont have a real clock,, just a name.
    always@(posedge clk) begin
        if(!rstn) q <= 0;
        else q <= d;
    end
endmodule

//we can chain flip flops to make a shift register
module shift_reg( input d,
                input clk,
                input rstn,
                output q
);
    //internal signal for chaining q into d of next stage.
    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

module은 디지털 시스템에서 독립적인 기능을 담당하는 단위이다.

module은 hierarachy를 이루며 복잡한 시스템을 만든다.

이 코드에서 shift_reg module은 4개의 dff module의 instance (u0 - u4)를 사용하고 있다.

 

각 module은 input과 output ports들이 있다. 이들은 module이름 뒤에 ( ) 안에 그 이름이 정의된다.

 

verilog data types

verilog에는 wire와 reg라는 데이터 타입이 있다.

(보다 넓게 wire는 net에 속하고, reg는 variable에 속하는데, wire와 reg만 잘 써도 충분하다)

wire는 진짜 전선처럼 그것이 연결된 끝의 값에 따라 바로 그 값으로 drive된다.

따라서 module의 input은 아무 말 안해도 wire로 정의된다.

즉 위의 input definition들은 input wire <name_of_port> 으로 생각할 수 있다.

 

reg는 register의 앞글자를 따왔는데, 단어 그대로 값을 저장할 수 있다.

output이나, module 내부에서 값들을 저장하기 위해서만 쓰일 수 있다.

reg에 값을 assign할 때에는 initial 또는 always block 안에서

'=' (blocking assignment)와 '<='(non-blocking assignment)을 쓴다.

reg 변수는 한번 assign된 값을 다음 assignment 전까지 계속 들고 있다.

always

 

always@(<sensitivity list>)는 @뒤에 명시된 event가 발생할 때마다 해당 블록이 실행된다는 뜻이다.

dff 모듈에서는 posedge clk 이벤트에 begin... ...end로 둘러싸인 코드가 실행되는데,

posedge는 뒤에 오는 신호가 LOW에서 HIGH로 변하는 event를 뜻한다.

자매품으로 negedge도 있다. 얘는 HIGH에서 LOW로 변할 때를 캐치한다.

 

dff의 동작은 간단하다. rising edge에

rstn signal이 assert되어있으면 reg q에 0을 assign 하고,

그렇지 않으면 q에 d의 값을 assign하여 저장하는 것이다.

 

Instantiation and hooking it up!

<module_name> <instance_name> (.<port name> <what to connect to that port>, ...)

 

	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));

shift_reg에서는 4개의 dff instance를 사용한다.

각 instance의 이름은 u0, u1, .. u3로 주었다.

( )안에는 어떻게 instance에 module에 쓰이는 신호들을 연결할지 적어준다.

 

예를 들어, .q(q_net[0]) 는 dff port 목록에 정의된 q port에 shift_reg module에서 정의된

q_net wire묶음의 0번째([0]) wire를 연결 한다는 뜻이다.

 

elaborated design

verilog 파일을 다 작성했으면,

Flow 메뉴 > elaborated design을 실행하여 아래와 같은 schematic을 볼 수 있다.

각 submodule은 그림의 + 버튼을 누르면 자세히 볼 수 있다.

하나의 dff블록을 확대하여 본 것이다.

내부에서는 MUX와 REG를 사용하고 있음을 볼 수 있다.

실제로 복잡한 combinatonal logic이라도

optimize된 gate들의 조합으로 이렇게 자동으로 synthesize 해준다.

우리는 synthesis를 걱정하지 않고, 이 회로가 어떻게 동작해야 할지,

행동(behaviour)을 명세하는데에만 신경쓰면 되니 편하다.

 

 

reference

https://www.chipverify.com/verilog/verilog-syntax

 

Verilog syntax

Lexical conventions in Verilog are similar to C in the sense that it contains a stream of tokens. A lexical token may consist of one or more characters and tokens can be comments, keywords, numbers, strings or white space. All lines should be terminated b

www.chipverify.com

이 사이트에 verilog문법이 잘 설명되어있다.