ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 디지털시스템: 모듈 모델링 방식? 베릴로그 시뮬레이션?, Test Bench란?
    메모 및 기타 2020. 9. 15. 01:10

    < 모듈 모델링 방식(Module modeling styles) >

     

    1. Structural model 

     

    gate level과 switch level수준의 모델링이며

     

    게이트를 베릴로그 텍스트로 바꾼다.

     

    (즉, 회로를 다 그리고 사용하는 작업)

     

     

    2. Dataflow model

     

    boolean이나 단순한 산술식으로 만들고자 하는 디지털 시스템을 설계하는 방법

     

     

    3. Behavioral or algorithmic model

     

    기본 알고리즘을 이용해서 모델링한다.

     

    하드웨어 implementation을 신경쓰지 않고 모델링 할 수 있다.

     

    c같은 언어 같이 high-level language programming이  가능하다

     

     

    4. Mixed model

     

    앞서 말한 방식들을 혼용해서 사용하는 방식

     

     

    5. RTL(register-transfer level)

     

    RTL방식은 behavioral과 dataflow 모델을 합쳐서 synthesizable한 코딩을 하는 방식

     

    ※ Synthesis = HDL코드로 structural model로 바꾸는 것

    (즉 게이트 수준으로 바꿀 수 있다는 것을 의미)

     

     

    6. 계층 구조를 이용한 설계

     

    보이는 것부터 세부적으로 나누어 가면서 설계하는 방식

     

     

    4-bit adder는 개의 full adder로 구성되어 있다.

    → full adder는 2개의 half adder와 or게이트로 구성되어 있다.

    → half adder는 xor, and, or gate로 구성되어 있다.

     

     

     

     

     

    <Simulation>

     

    내가 만든 베릴로그 코드가 내가 원하는 방식으로 만들어졌는지 확인하는 과정

    Stimulus block을 만들어서 test한다.

     

    test도 마찬가지로 베릴로그 코드로 하며 테스트 코드가 작성되는 곳을

    테스트벤치(Test Bench)라 한다.

     

     

    1. Time scale for simulations

     

    Time scale이란 시간지연을 주기 위해 하는 약속

     

    'timescale time_unit/time_precision 와 같이 쓴다.

     

    만약 1ns/1ps라 했을 때 #15는 15ns뒤라는 의미다.

     

    time_precision은 해상도로 1ns/1ps라 했을 때 소수 셋째자리까지

    의미이다.

     

     

    2. System Tasks for Simulation

     

    1) $display

      변수 값들의 value를 보여준다.

     

    2) $monitor

      값이 바뀔때 신호를 모니터링한다.

     

    3) $monitoton

      모니터링 켜기

     

    4) $monitotoff

      모니터링 끄기

     

    5) $stop

      시뮬레이션 중지

     

    6) $finish

      시뮬레이션 끝내기

     

     

    < 예제 >

     

    4 bit adder를 모델링하고 테스트 벤치를 만들어보자

     

     

    1. 4 bit adder

    module four_bit_adder(x, y, c_in, sum, c_out);
    parameter N = 4;
    input [N-1:0] x, y;
    input c_in;
    output [N-1:0] sum;
    output c_out;
    assign {c_out, sum} <= x + y + c_in;
    endmodule

     

     

    2. Test bench

    `timescale 1ns/100ps
    module adder_tb;
    parameter N=4;
    parameter M = N*2;
    reg [N-1:0] a;
    reg [N-1:0] b;
    reg c_in;
    wire [N-1:0]sum;
    wire carry;
    for_bit_adder UUT(.a(x), .b(y), .c_in(c_in), .sum(sum), .carry(c_out));
    reg [2*N-1:0] I;
    intitial
    for(I = 0; I <= 2**M; I = I + 1)begin
    x[N-1:0] = I[M-1:N]; y[N-1:0] = I[N-1:0]; c_in = 1'b0;
    #20; end
    intitial #6000 $finish;
    initial
    $monitor($realtime, "ns %h %h %h %h", a,b,c_in,{carry,sum});
    endmodule

     

     

     

    반응형

    댓글

Designed by Tistory.