2023년 7월 20일 목요일

[주간 강좌] 병행 시뮬레이션(Co-Simulation) (2023-07-26)

[주간 강좌] 병행 시뮬레이션(Co-Simulation)

일시: 2023년 7월 26일
장소: 전자정보대학관 211-2
시간: 오전 10시 30분 (90분)

내용

1. 병행 시뮬레이션(Co-Simulation)의 필요성

  • 추상화 수준(abstraction level)의 혼재
    - 언어의 차이
    - 구체성의 차이
  • Gajski-Kuhn Y-chart [그림출처: 1 , 2]
    3-Domains: Behavioral / Structural / Physical
  • Transition tools between Domains and Abstraction Levels
    - Refinement & Abstraction
    - Generation & Extraction
    - Synthesis & Analysis
    - Optimization
  • Concerns in each abstraction level
    - Architecture: IP availability, Needs on the market
    - Functionality & Algorithm
    - Number of Clocks & Data-path bit-width
    - Clock skew & violation
    - Die size & Power consumption
    - Clock & Thermal distribution
    - Test automation

  • Design Flow
    Lowering Abstraction Level

2. 추상화 수준이 혼재될 수 밖에 없는 이유

  • Design Under Test: Register-Transfer Level
  • Test Environment: Transaction Level
    - 실제와 근접한 테스트 입력
    - 방대한 테스트 입출력 및 검사
    - 완성되지 않은 DUT
    - 테스트 환경 구축
3. 예제: SR-FlipFlop의 행위 모델 [예제 다운로드]

  • HDL 모델을 시험하는 3가지 방법
    - 대화창 명령
    - HDL 테스트 벤치
    - 상위수준 언어사용
  • SystemC/C++ 로 하드웨어 기술 예
  • 도구 사용법
    - QuestaSim 사용법
    - VisualStudio C++ 에서 SystemC 모델 컴파일 옵션

4. 예제: 이미지 처리 RTL 모델 [예제 다운로드]

  • 시뮬레이터의 속도
    - 트랜잭션 수준 테스트
    - 가속기 / 에뮬레이터
    - FPGA Proto-Typing

5. 예제: Apple ][ [예제 다운로드]

  • CPU 6502 in Verilog (Synthesizable RTL)
  • Memory model in SystemC/C++
  • Testbench in SystemC/C++
  • Screen App. in C++ with SDL2 multimedia library
  • PIPE (Inter-Process Communication) between SystemC & Screen App.

-----------------------------------------------------------------

6. 결론

  • Verilog
    - 모양이 다른 컴퓨팅 언어 중 하나
  • SystemC/C++
    - 시스템 수준 모델링 도구
  • 추상화 수준이 혼재된 SoC 설계에서 병행 시뮬레이션(co-simulation)은 필수 

-----------------------------------------------------------------

[참고]

  1. AI Can't Design Chips Without People, EETimes [Link]
  2. SystemC Quick Reference Card [Link]
  3. Verilog Quick Reference Card [Link]
  4. Verilog Quick Reference Guide(2001) [Link]

-------------------------------------------------------------------

예제1:

Module boundary:


Verilog:

module SR_ff_Behavioral(s,r,clk,reset,q,q_bar);
input s,r,clk,reset;
output q,q_bar;
......
endmodule

 SystemC(C++)

class SR_ff_Behavioral : public sc_foreign_module
{
public:
    sc_in<bool> clk;
    sc_in<sc_logic> s, r, reset;
    sc_out<sc_logic> q, q_bar;

    SR_ff_Behavioral(sc_module_name nm)  // Constructor
        : sc_foreign_module(nm, "SR_ff_Behavioral"),
    {
    }

    ~SR_ff_Behavioral()
    {}
};

 -------------------------------------------------------------------------------

Verilog: Event sensitize

// Verilog
always @(posedge clk)   // Clock's edge
begin
    ......
end

SystemC(C++): Even & Call-Back 

// SystemC
SC_MODULE(SR_ff)
{
    ......
    SC_CTOR(SR_ff): // Constructor
    {
        SC_METHOD(SR_ff_Method);
        sensitive << clk;
    }
};

Member function, 

void SR_ff:: SR_ff_Method ()
{
    if (clk.read())
    {
    ......
    }
}

-----------------------------------------------------------------------

Binding signals

Verilog:

wire s1, r1, q1, q1_bar;
SR_ff_Behavioral U1(.clk(clk),
                    .reset(reset),
                    .s(s1),
                    .r(r1),
                    .q(q1),
                    .q_bar(q1_bar) );

SystemC(C++):

sc_signal<sc_logic> s1, r1;
sc_signal<sc_logic> q1, q1_bar;
SR_ff* U1_SR_ff;

SC_CTOR(sc_SR_ff_TB) : ... // Constructor
{
    U1_SR_ff = new SR_ff("U1_SR_ff");
    U1_SR_ff->clk(clk);
    U1_SR_ff->reset(reset);
    U1_SR_ff->s(s1);
    U1_SR_ff->r(r1);
    U1_SR_ff->q(q1);
    U1_SR_ff->q_bar(q1_bar);
}

------------------------------------------------------------

Behavior description

Verilog:

always @(posedge clk)   // Clock's edge
begin
    if (reset)  // Synchronous reset
        begin
        q = 1'b0;
        q_bar = 1'b1;
        end
    else
        begin
        case({s,r}) // Truth-Table
            {1'b0,1'b0}: begin q = q;    q_bar = q_bar; end
            {1'b0,1'b1}: begin q = 1'b0; q_bar = 1'b1; end
            {1'b1,1'b0}: begin q = 1'b1; q_bar = 1'b0; end
            {1'b1,1'b1}: begin q = 1'bx; q_bar = 1'bx; end
        endcase
    end // if~else
end // always()

SystemC(C++)

void SR_ff:: SR_ff_Method ()
{
    if (clk.read())
    {
        if (reset.read() == sc_logic('1'))
        {
            q.write(sc_logic('0'));
            q_bar.write(sc_logic('0'));
        }
        else
        {
            sc_lv<2> sr;
            sr = ((sc_lv<1>)s.read(), (sc_lv<1>)r.read());
            switch ((sc_uint<2>)sr) // Truth-Table
            {
            case 0: // s=0, r=0
                // DO NOTHING
                // q & q_bar: Keep previous values
                break;
            case 1:  // s=0, r=1
                q.write(sc_logic('0'));
                q_bar.write(sc_logic('1'));
                break;
            case 2:  // s=1, r=0
                q.write(sc_logic('1'));
                q_bar.write(sc_logic('0'));
                break;
            case 3:  // s=1, r=1
                q.write(sc_logic('x'));
                q_bar.write(sc_logic('x'));
                break;
            }
        }
    }
}

-------------------------------------------------------------------------

Blocking & Non-Blocking Assign

Co-Simulation Result

===========================================

예제2:

==============================================

예제3: Apple ][


댓글 없음:

댓글 쓰기