ASIC SoC2009. 12. 17. 13:17
오래간만의 컴파일러 빌드입니다.

1) binutils  설치하기


우선 binutils를 다운 받습니다.
커맨드는 아래와 같습니다.

cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src login
{enter "anoncvs" as the password}
cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src co binutils
  

빌드는 아래와 같이 합니다.

mkdir build
cd build
 ../binutils-2.20/configure  --target=mips-elf --prefix=/Volumes/ZGUNDAM/usr/lcao --with-gnu-as --with-gnu-ld
make all
make install

설치가 끝나고 확인하면 아래와 같습니다.

GUNDAMMACPRO:build kevinIm$ ls /Volumes/ZGUNDAM/usr/local/bin/
mips-elf-addr2line      mips-elf-ld             mips-elf-ranlib         mips-elf-strip
mips-elf-ar             mips-elf-nm             mips-elf-readelf
mips-elf-as             mips-elf-objcopy        mips-elf-size
mips-elf-c++filt        mips-elf-objdump        mips-elf-strings

패스가 추가되어야 하기 때문에

export PATH=$PATH:/Volumes/ZGUNDAM/usr/local/bin

으로 미리 추가해 둡니다.

2. gcc를 빌드하기



에서 gcc 최신 버전을 다운 받습니다. 이 글을 쓰는 시점에서는 4.4.2입니다.

다운받아서 압축을 풀고 빌드를 합니다.

mkdir build
cd build
../gcc-4.4.2/configure --target=mips-elf --without-headers --with-gnu-as --with-gnu-ld --disable-shared --prefix=/Volumes/ZGUNDAM/usr/local/ --with-newlib --disable-libssp

그러면 아래와 같은 오류가 발생합니다.

....
checking for correct version of gmp.h... no
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.
Try the --with-gmp and/or --with-mpfr options to specify their locations.
Copies of these libraries' source code can be found at their respective
hosting sites as well as at ftp://gcc.gnu.org/pub/gcc/infrastructure/.
.......

GMP 4.1과 MPFR2.32 이상 버전이 필요하다는 의미입니다.
MAC에서는 소스를 가지고 와서 빌드하는 것과 fink등을 이용해서 다운 받는것이 가능합니다.
여기선 그냥 다운 받는것으로 하고 진행합니다.

sudo port install gmp
--->  Fetching gmp
--->  Attempting to fetch gmp-4.3.1.tar.bz2 from ftp://ftp.dti.ad.jp/pub/GNU/gmp
--->  Verifying checksum(s) for gmp
--->  Extracting gmp
--->  Applying patches to gmp
--->  Configuring gmp
--->  Building gmp
--->  Staging gmp into destroot
--->  Installing gmp @4.3.1_1
--->  Activating gmp @4.3.1_1
--->  Cleaning gmp

GUNDAMMACPRO:build kevinIm$ sudo port install mpfr
--->  Fetching lzmautils
--->  Attempting to fetch lzma-4.32.7.tar.gz from http://distfiles.macports.org/lzmautils
--->  Verifying checksum(s) for lzmautils
--->  Extracting lzmautils
--->  Configuring lzmautils
--->  Building lzmautils
--->  Staging lzmautils into destroot
--->  Installing lzmautils @4.32.7_1
--->  Activating lzmautils @4.32.7_1
--->  Cleaning lzmautils
--->  Fetching mpfr
--->  Attempting to fetch patch01 from http://distfiles.macports.org/mpfr/2.4.1
--->  Attempting to fetch patch02 from http://distfiles.macports.org/mpfr/2.4.1
--->  Attempting to fetch patch03 from http://distfiles.macports.org/mpfr/2.4.1
--->  Attempting to fetch patch04 from http://distfiles.macports.org/mpfr/2.4.1
--->  Attempting to fetch mpfr-2.4.1.tar.lzma from http://distfiles.macports.org/mpfr/2.4.1
--->  Verifying checksum(s) for mpfr
--->  Extracting mpfr
--->  Applying patches to mpfr
--->  Configuring mpfr
--->  Building mpfr
--->  Staging mpfr into destroot
--->  Installing mpfr @2.4.1-p4_1
--->  Activating mpfr @2.4.1-p4_1
--->  Cleaning mpfr


그러면 설치가 된다. 설치된 위치는 /opt/local입니다.
이 위치를 반영하여서 다시 아래와 같이 커맨드를 넣습니다.

GUNDAMMACPRO:build kevinIm$ ../gcc-4.4.2/configure --target=mips-elf --without-headers --with-gnu-as --with-gnu-ld --disable-shared --prefix=/Volumes/ZGUNDAM/usr/local/ --with-newlib --disable-libssp --with-gmp=/opt/local --with-mpfr=/opt/local  --enable-languages="c"

make all

그러면 한참 컴파일을 합니다.

그러다가 다음과 같은 오류를 냅니다.

gcc  -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE  -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wold-style-definition -Wmissing-format-attribute   -DHAVE_CONFIG_H  -o cc1-dummy c-lang.o stub-objc.o attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o c-ppoutput.o c-cppbuiltin.o c-objc-common.o c-dump.o c-pch.o c-parser.o  c-gimplify.o tree-mudflap.o c-pretty-print.o c-omp.o dummy-checksum.o \
          main.o  libbackend.a ../libcpp/libcpp.a ../libdecnumber/libdecnumber.a ../libcpp/libcpp.a ./../intl/libintl.a -liconv  ../libiberty/libiberty.a ../libdecnumber/libdecnumber.a   -L/opt/local/lib -L/opt/local/lib -lmpfr -lgmp
Undefined symbols:
  "_iconv_close", referenced from:
      __cpp_destroy_iconv in libcpp.a(charset.o)
      __cpp_destroy_iconv in libcpp.a(charset.o)
      __cpp_convert_input in libcpp.a(charset.o)
      __nl_free_domain_conv in libintl.a(loadmsgcat.o)
  "_iconv", referenced from:
      _convert_using_iconv in libcpp.a(charset.o)
      _convert_using_iconv in libcpp.a(charset.o)
......


이 오류는 다음과 같이 커맨드를 넣어서 해결한다.

sudo port deactivate libiconv
/sw/bin/fink update libgettext3-dev

이후에 make를 하면 잘 진행된다.

make all
make install

테스트를 하면

GUNDAMMACPRO:build kevinIm$ mips-elf-gcc --help
Usage: mips-elf-gcc [options] file...
Options:
  -pass-exit-codes         Exit with highest error code from a phase
  --help                   Display this information
  --target-help            Display target specific command line options
  --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]
                           Display specific types of command line options
  (Use '-v --help' to display command line options of sub-processes)
  --version                Display compiler version information
  -dumpspecs               Display all of the built in spec strings
  -dumpversion             Display the version of the compiler
  -dumpmachine             Display the compiler's target processor
  -print-search-dirs       Display the directories in the compiler's search path
  -print-libgcc-file-name  Display the name of the compiler's companion library
  -print-file-name=<lib>   Display the full path to library <lib>
  -print-prog-name=<prog>  Display the full path to compiler component <prog>
  -print-multi-directory   Display the root directory for versions of libgcc
.......

3) Newlib 컴파일 하기

다운로드는 다음 커맨드로 받습니다.
  cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src login
  {enter "anoncvs" as the password}
  cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src co newlib

../src/configure --target=mips-elf -prefix=/Volumes/ZGUNDAM/usr/local --with-gnu-as --with-gnu-ld

이후에

make all
make install

을 하면 됩니다.


확인은 아래와 같이 합니다.
GUNDAMMACPRO:build kevinIm$ ls /Volumes/ZGUNDAM/usr/local/mips-elf/lib/

cfe.ld          ddb.ld          ldscripts       libidt.a        libnullmon.a    pcrt0.o
crt0.o          el              libc.a          liblsi.a        libpmon.a       pmon.ld
crt0_cfe.o      idt.ld          libcfe.a        libm.a          lsi.ld          soft-float
ddb-kseg0.ld    idtecoff.ld     libg.a          libnosys.a      nullmon.ld
GUNDAMMACPRO:build kevinIm$



 

'ASIC SoC' 카테고리의 다른 글

Sound Effect Processor  (0) 2010.02.01
[SC] Structure  (0) 2010.01.18
PERL TIP  (0) 2009.12.05
Timing Chart  (0) 2009.11.08
SystemC에서 main() 함수 넣기  (0) 2009.11.04
Posted by GUNDAM_IM
ASIC SoC2009. 12. 5. 10:29
1. Perl Script에서 환경 변수를 가지고 오기
    많은 파일을 동시에 사용하면서, 설정을 하여야 할 경우 실행 옵션으로 주는 것이 편합니다.
    하지만, 패스같은 것들은 그냥 환경변수에 세팅해 놓고 PERL 스크립트에서 환경 변수를 받아들여서
    패스로 사용하는 것이 편합니다.
    아래는 그에 대한 예입니다.

     $WORK_ROOT = $ENV{"WORK_ROOT"};
     print STDOUT "[MSG AAAA] $WORK_ROOT\n";  

    실행 결과는 아래와 같다.

     [MSG AAAA] /home/GUNDAM/work_code
   
2. 스타트 옵션에서 -I로 패스를 지정할 수 있습니다.
   그런데 이것이 상대 패스로 지정되면, 시작하는 폴더가 유저마다 틀릴 경우,  귀찮게 됩니다.
    그리고 절대 패스로 해두면, 개발 환경을 다른데로 옮겼을때, 다시 귀찮게 됩니다.
   이런것을 해결하는 방법이  환경 변수를 설정해서 지정하면 해결됩니다.

   export PERL5LIB=/home/GUNDAM/PerlScript/
 
위에서 사용하는 환경 변수 PERL5LIB은 PERL 실행시 기본으로 모듈을 검색하는 @INC패스에 포함되지
않은 경우 추가로 찾을 수 있도록 패스를 추가할 수 있는 환경 변수입니다.
3. 문자열 내에 괄호 ( ( ) 가 있을 경우
정규식 표현을 이리저리 해보았지만 잘 안되었는데
[ ]으로 둘러 싸면 인식을 한다.

$target_line2 = "do[(]\"\/check\/tools\/scripts";

으로 설정한다.


요새 뜬금없이 PERL을 쓰면서  정리하고 있는 것입니다.

'ASIC SoC' 카테고리의 다른 글

[SC] Structure  (0) 2010.01.18
[MIPS] OSX에서 MIPS C Compiler를 빌드하기  (0) 2009.12.17
Timing Chart  (0) 2009.11.08
SystemC에서 main() 함수 넣기  (0) 2009.11.04
SystemC에서 배포가능 버전 만들기  (0) 2009.11.01
Posted by GUNDAM_IM
ASIC SoC2009. 11. 8. 22:08
학생들을 대상으로 강의한 다는 것은 많이 많이 어려운 점이 있습니다.

제가 실력이 없어서 가리키기가 힘든 것도 있습니다.

가리키기 어려운 부분이 많이 있지만, 그중에서도 경험자들에게는 당연시되는 부분인 Protocol이나 Timing Chart를 해석하는 것이 처음 배우는 학생들에게는 가리키는 것도 배우는 것도 어려운 부분인듯 합니다.  
   매년 이런 부분은 학생들 보고 알아서 준비하라는 다소간 무책임한 형태로 넘어갔지만, 올해는 한번 잘 설명해볼려고 자료를 만들어 봤습니다. 쉽게 쉽게 설명할려고 글은 최대한 배제하고 만들었습니다.

  부족한 부분은 실제 버스 프로토콜을 설명하는 부분과,
  진짜 시간에 대한 설명등이 필요하지만,
 
  그것까지 만들기에는 게을러서.. 건너 뛰었습니다.
  나머진 다음번에 추가시키겠지만, 아마 올해가 마지막 강의가 될것이어서...  더이상의 업데이트는 없겠습니다.
    

부족한 자료이지만, 참고하시기 바랍니다.

GUNDAM


'ASIC SoC' 카테고리의 다른 글

[MIPS] OSX에서 MIPS C Compiler를 빌드하기  (0) 2009.12.17
PERL TIP  (0) 2009.12.05
SystemC에서 main() 함수 넣기  (0) 2009.11.04
SystemC에서 배포가능 버전 만들기  (0) 2009.11.01
취업 씨즌이 시작되었군요  (0) 2009.10.27
Posted by GUNDAM_IM
ASIC SoC2009. 11. 4. 21:56

SystemC는 sc_main에서 시작합니다. 보통은 여기서 부터 초기화를 하고 진행하면 되지만

경우에 따라서는 곤란한 경우가 존재합니다.  대표적인것이 특정 그래픽 라이브러리를 함께 사용하고자 할 경우 오류가 발생하게 됩니다. 이는 Multi Thread 환경에서 발생하는 오류입니다.


이를 해결하기 위해서는 해당 라이브러리의 Multi Thread Support 기능을 잘 조정해 주어야 하는데 이 역시 코딩할 때나 컴파일 할 때 신경을 써야 하는게 많으므로 현실적인 해결책이 아닙니다.


그래서 main 함수에서 multi thread에 들어가기 전에 초기화 시키는 방법을 사용하는데 문제는 systemC가 main 함수를 wrapping하여서 sc_main을 제공한다는 점입니다. 그래서  계속 오류가 발생하는 데요.. 이를 해결하기 위해서는 main 함수를 새로 만들어 주어야 합니다.


표준안에 따르면 SystemC는 sc_elab_and_sim 을 호출하여서 시작합니다. 그리고 별도로 main함수를 제공할 수 있도록 되어 있습니다.


과정은 아래와 같습니다.


main.cpp에서 main함수가 있으면 이 함수를 먼저 호출하게 됩니다.

그리고 이 함수의 내에서 sc_elab_and_sim 을 호출하여 systemc의 영역으로 들어갑니다.
sc_elab_and_sim는 sc_main을 다시 호출하도록 정의 되어 있습니다.


아래 코드는 그에 대한 예제입니다.


#include "systemc.h"

//#include <iostream>



int main (int argc, char * argv[]) {

printf("This is  Main Function\n ");

sc_elab_and_sim(argc,argv);

}


int sc_main (int argc, char * argv[]) {

    // insert code here...

    std::cout << "Hello SystemC!\n";

    sc_start();

    return 0;

}



실행 결과는 아래와 같습니다.

This is  Main Function


             SystemC 2.2.0 --- May 25 2008 11:34:05

        Copyright (c) 1996-2006 by all Contributors

                    ALL RIGHTS RESERVED

Packaged for MacOS by Logic Poet: http://www.logicpoet.com


Hello SystemC!



1. 한가지 주의 할 점은 위의 코드에서 main 함수가 가장 먼저 나와야 한다는 점입니다.
name space에 관계된 부분인데, 별도의 키워드를 지정하면 되긴 하지만, 일단은 제일 쉬운 방법중 하나는  코드의 제일 처음에 나오도록 (심지어 변수도 다 뒤에서 정의하도록 한다.) 배열을 정리하면 호출하게 됩니다

'ASIC SoC' 카테고리의 다른 글

PERL TIP  (0) 2009.12.05
Timing Chart  (0) 2009.11.08
SystemC에서 배포가능 버전 만들기  (0) 2009.11.01
취업 씨즌이 시작되었군요  (0) 2009.10.27
SystemC : Module을 인스턴스 할 때에 파라미터 전달 하기.  (0) 2009.10.21
Posted by GUNDAM_IM
ASIC SoC2009. 11. 1. 22:26
SystemC와  Verilog의 가장 큰 차이점 중에 한가지는 배포본 만들기에 있습니다.

C/C++은 각각의 Class에 필요한 함수와 변수등을 Header파일에 선언하고 함수 등을 선언 한 뒤에
cpp파일에서 구현하게 됩니다.

비록 배포 버전에서는 cpp파일을 object로 바꾸어서 전달할 수 있지만 header파일을 찬찬히 보면,
세부 사양은 알 수 없더라도, 어떤 방식으로 구성되어 있는지 등은 알 수 있습니다.  
SystemC도 엄밀하게는 C++위에서 구성되어 있어서 마찬가지로 이런 문제점이 발생합니다.

IP의 생명인 보안성 부분에서는 상당히 취약하다고 할 수 있습니다.  

그래서 귀찮지만 Pointer로 받아서 구현하는 방식을 취합니다.
이 방식은 ME C++에서 설명한 방식입니다만, SystemC에서 응용할 줄은 몰랐습니다.

PIMPL Idiom 구현 방식입니다. 말 그대로 Pointer로 받아서 구현하는 것이므로,  Pointer IMPlementation 구현 방식입니다.

일종의 Pointer Wrapper 방식이라 할 수 있습니다.

사용자 삽입 이미지
위와 같이 DesignModule을 설계하였으면 이것을 그냥 배포하는 것은 곤란하므로
DesignModule_wrapper를 쒸워서 내부 설계 정보를 최대한 Hidden 시켜서 배포하게 됩니다.

Wrapper가 가지는 조건은 다음과 같이 됩니다.

당연하게 포트가 같아야 합니다.
   - 나중에 실제 모듈로 대치하게 된다면 포트 이름도 같이 해두는게 당연히 좋습니다.


그럼 아래와 같이 예를 들어 보겠습니다.

설계한 모듈은

DesignModule이라고 한다면 header파일과 cpp파일을 가지고 있습니다.

DesignModule.h

SC_MODULE(DesigModule)
{
// Port Declaration
PortA ;
PortB ;
PortC ;
// 이하는 뭔가 중요할 것만 같은 .. 중요해야 되는 디자인 정보.. T__T;;
......
......
}

DesignModule.cpp
.....


이것을 쒸울 Wrapper는

DesignModule_Wrapper.h

class DesignModule; // 미리 클래스라고 알려주어서 컴파일 시에 오류가 생기지 않도록 한다.

SC_MODULE(DesignModule_Wrapper)
{
// Port Declaration
        SC_CTOR(DesignModule_Wrapper){
DesignModule_Wrapper_port();
        };
//
private :
DesignModule * pDesignModule;       // 이렇게 하위 클래스의 포인터를 선언해서 받아온다.
virtual ~ DesignModule_Wrapper();  // 포인터로 선언해서 나중에 new 연산으로 할당
                                                                     //  할 것이므로 Destructor에서 반드시 Delete해 주어야 한다.
                void DesignModule_Wrapper_port();

}

DesignModule_Wrapper.cpp

#include "DesignModulle.h"

DesignModule_Wrapper::DesignModule_Wrapper_port()
{
   pDesignModule = new DesignModule;

   pDesignModule->PortA(PortA);
   pDesignModule->PortB(PortB);
   pDesignModule->PortC(PortC);

}

......
DesignModule_Wrapper ::~ DesignModule_Wrapper()
{
delete pDesignModule;
}

 





DesignModule.h파일을 DesignModule_Wrapper.cpp파일에서 불러들인다는 점이 중요합니다.
즉, 실제 디자인에 관련된 정보는 DesignModule.h파일에 있으며 이 것을 Wrapper용 Header File에서 Include하지 않음으로서 Compile 시에 Dependency를 제거해 주는 것이 목적이 됩니다.

따라서 최종 사용자는

DesignModule_Wrapper.h


DesignModule_Wrapper.o
DesignModule.o

3개 파일을 받게 되는 것입니다.
물론 Obj들은 Lib으로 묶어 버리면 2개 정도 파일만 가면 되는 것이어서 큰 문제가 없이 잘 됩니다.

최종 유저에게 오픈되어 있는 정보는 DesignModule_Wrapper.h 파일 뿐이므로 실제 디자인 내부 정보는 오픈되지 않습니다.

이 방식은 Wrapper를 거치는 방식이므로, 실제 동작시에는 느려진다고 합니다.
어느정도까지 느려질 지는 테스트 해보지 않아서 잘 모르겠습니다.

Posted by GUNDAM_IM
ASIC SoC2009. 10. 27. 10:59
해마다 이맘때 쯤이면,
환절기 감기가 찾아오듯이 들리는 소리는, 좋은 사람 소개시켜 돌라는 청탁아닌 청탁입니다.

주변에서 이런 이야기가 자주 들리기 시작하면, 아.. 드디어 취업 시즌이 다가 왔구나. 하고 생각하게 됩니다.

그리고 올해도 어김없이 취업 시즌이 다가왔습니다.
여기저기 경기가 풀릴려나 하면서 사람을 찾기 시작합니다.  
이른바 Self Scout  모드로 탐침을 세우고 다니는 사람들이 눈에 띄기 시작합니다.

이제 우리 회사도 사람을 충원하기 위해서 공고를 내고 면접을 보고 해야 합니다.
올해도 0명 모집을 위해서 열심히 노력해야 합니다.

그런데 생각해보면 채용 기준은 아주 아주 간단합니다.  결코 엄격하거나 턱없이 높은 수준이 아닐것 같은.. 단순한 수준이랍니다.

F.S.S에 나오는  다이버와 기사의 힘을 함께 가진 바이어의 수준을 요구하는 것이 아니고 그냥
C언어 할 수 있고 Computer Architecture만 이해하면.. 입니다.
(게다가 게임이나 애니 좋아하면 금상 첨화.. 대화가 잘 통할 것 같다는 사심이 약간 들어간 기준입니다.)

말하자면 견습 기사 수준..
 
그런데 그런 "견습 기사" 분들 찾기가 쉽지 않은것 같습니다.

  우리만 그러면 아.. 우리 회사가 얼렁 키워서 강남으로 진출 해야지 하겠는데  그런 지리적인 요소만은 아닌듯 합니다.  우스개 소리로 가위바위보 해서 이긴사람이  상대방 회사에서 한명씩 데리고 오기로 하자는 말을 할 정도로 다른 회사들도 심각하니.. 말입니다.

이제 취업 시즌을 시작하면, 공고를 내고 채용까지 매주 3~4명 면접 보아야 하는 장기 레이스가 시작됩니다.
올해는 단기로 끝나면 좋겠는데.. 하는 즐거운 생각을 해봅니다.

아니면 회사끼리 흑기사 제도를 도입해 볼까.. 라는 공상도 해보기도 합니다만,
에후.. 현실은 그렇지가 못하니.. 실현 확률 0%...



Posted by GUNDAM_IM
ASIC SoC2009. 10. 21. 12:55

SystemC에서 Module을 생성할 때에 파라미터를 전달하는 방법이 가끔 필요합니다.

같은 모듈을 인스턴스로 생성시키지만, 특정 파라미터를 바꾸어서 동작을 틀리게 할 경우에 유용하게 사용할 수 있습니다.


이런 경우에 아래와 같이 구성하면 됩니다.


#if 0

SC_CTOR(AXI_TestMaster)  {

// main function

SC_CTHREAD(AXI_TM_entry,CLK.pos());

}//end of SC_CTOR

#else

SC_HAS_PROCESS(AXI_TestMaster);

AXI_TestMaster(sc_module_name nm, char * filename = "Default.tsq") : sc_module(nm) {

// main function

FileName = filename;

SC_CTHREAD(AXI_TM_entry,CLK.pos());

}

#endif


........
사용 예
      AXI_TestMaster AXI_TM0("TestMaster0.cfg");
      AXI_TestMaster AXI_TM1("TestMaster1.cfg");
      AXI_TestMaster AXI_TM2("TestMaster2.cfg");

각각의 모듈이 기본적인 동작은 같지만 운용 방법을 조금 씩 틀리게 할 경우 위와 같이 준비하여 두면 편리합니다.

이 방식에 대한 참고 사이트는 아래와 같습니다.

http://www.doulos.com/knowhow/systemc/faq/
 

'ASIC SoC' 카테고리의 다른 글

SystemC에서 배포가능 버전 만들기  (0) 2009.11.01
취업 씨즌이 시작되었군요  (0) 2009.10.27
SystemC에서 typdedef과 switch사이의 관계  (0) 2009.09.25
SystemC : Thread 2nd  (0) 2009.08.26
GTKWave 를 OSX에서 구동하기  (0) 2009.08.24
Posted by GUNDAM_IM
ASIC SoC2009. 9. 25. 09:26
SystemC언어로 설계하면 여러가지 편한점과 불편한 점이 있는데요
가장 불편한점은 누구 하나 속시원하게 해본적이 없다는 점입니다.

상위 수준 상위수준 하지만, 얼마 만큼의 상위수준까지가 합성이 되는지에 대해서 아직은 아는 사람이 없다는  부분이 또 걸리는 문제입니다. 결국 ERROR & TRY를 계속하면서 가는 수 밖에 없는 것 같습니다.


아직은 불편한 점도 많지만,
편한점은 몇가지 루틴만 이해하면 바로 설계에 들어갈 수 있다는 점이 장점입니다.

그런 점에서 보았을때 Typedef를 적절하게 이용하면 편리한 설계를 할 수 있습니다.
typedef + struct로 정의하는 것입니다. 이런 방식은 VHDL의 Record 타입과 비슷한 개념입니다.

몇가지 사항을 typedef로 정해서 진행하다 보면 쓸데 없는 오류에 봉착하는데요.. 아래에 그런 것에 대해서
한가지를 정리해 두었습니다.
진행하다가 더 나오면 그때 그때 정리하도록 하겠습니다.


SystemC에서 BUS는

sc_uint< bussize > busname;

으로 정의가 됩니다.

그런데 귀찮아서 이를 typedef로 정의하고 사용하면 에러가 발생합니다.

typedef sc_uint<32> tBUS_TYPE;

이라고 정의하고,

아래와 같이 함수에서 사용하면 에러가 발생합니다.

void classname::foo()
{
switch(BUS_TYPE)
{
....
.......
}
}


그래서

void classname::foo()
{

sc_uint<32> BUS_TYPE_int ;
BUS_TYPE_int = BUS_TYPE;

switch(BUS_TYPE_int)
{
case AHB :
....
case AXI  :
....
case WISHBONE :
....
}

}

위와 같이 로컬 변수로 받고 정의하면 에러가 없이 실행이 됩니다.
이것은 Signal로 선언되면 Signal Class로 다시 한번 상속되기 때문에,
container로 확장된 값과는 틀린 의미여서 switch로 사용할 수 없기 때문입니다.

좀더 직접적인 방법은 read() 메쏘드를 사용하는 것입니다.

switch(BUS_TYPE.read())
{
case AHB :
....
case AXI  :
....

이렇게 하면 후처리 작업이 필요 없이 정리할 수 있습니다.

'ASIC SoC' 카테고리의 다른 글

취업 씨즌이 시작되었군요  (0) 2009.10.27
SystemC : Module을 인스턴스 할 때에 파라미터 전달 하기.  (0) 2009.10.21
SystemC : Thread 2nd  (0) 2009.08.26
GTKWave 를 OSX에서 구동하기  (0) 2009.08.24
SystemC : Thread  (0) 2009.08.21
Posted by GUNDAM_IM
ASIC SoC2009. 8. 26. 05:57
SystemC에서는 3개의 Thread 모델링 방식을 제공하는데
어떤 것이 하드웨어적으로 맞는지에 대해서는 그 상황에 따라서 선택하는 것이 좋습니다.
하지만 합성을 목적으로 한다면, SystemC 합성 툴이 제시하는 문법에 따라서 정리하는 것이 나중에 번거롭게
두번 작업하지 않고 정리할 수 있습니다.

Forte에서 제공하는 자료에는 아래와 같은 형태를 권장하고 있습니다.
이해를 쉽게 하기 위한 그림이 아래와 같습니다.


사용자 삽입 이미지




위의 그림은 Verilog와 비교하여서 준비된 것입니다.
verilog와의 차이점은 verilog는 묵시적으로 내부에서 wait 구문이 존재하여서 always 블럭의 끝에 도달하면 wait 상태에 들어가는 것이 당연합니다. 하지만, CTHREAD에서는 wait()를 CTHREAD의 끝에서 명시해 두어야 합니다.
물론 그 중간에 넣어도 됩니다. 이런 경우 Multi Stage가 될 수 있습니다.

Posted by GUNDAM_IM
ASIC SoC2009. 8. 24. 04:41
앞에서 소개해 드렸던 Scansion은 아직 버그가 있어서 사용하는데 불편합니다.
간단한 버그인데도 수정이 안되는 것을 보면, 안정화 하기에는 시간이 많이 필요할 것 같습니다.
그래도 MAC GUI 스럽다는 장점때문에 사용을 하고 있읍니다.

일단 버그 없는 것을 쓴다면 당연히 GTKWave 이죠.
정확하게는 버그가 없다기 보다 버그가 없을 확률이 Scansion보다는 높다는 점이겠군요

맥에서 설치하는 방법은
2가지 방법을  중 하나를 선택해서 할 수 있습니다.

소스를 빌드하는 것과 mac ports를 사용하여 설치하는 것인데요
이래저래 손볼데가 많은 소스 빌드 보다는 mac port를 사용하면 쉽게 설치 됩니다.

1. 소스를 다운 받아서 빌드하는 것.

http://gtkwave.sourceforge.net/?ref=darwinports.com

에서 다운 받을 수 있습니다.

CVS를 통해서 다운 받으면 됩니다.
아래 내용을 그대로 진행합니다.

cvs -d:pserver:anonymous@gtkwave.cvs.sourceforge.net:/cvsroot/gtkwave login
[press enter]
cvs -z3 -d:pserver:anonymous@gtkwave.cvs.sourceforge.net:/cvsroot/gtkwave co -P gtkwave3


다운받아서 빌드하면 됩니다.

2.  mac port를 이용해서 다운 받는 것.

sudo port install gtkwave

위의 명령을 이용해서 설치하면 나름 열심히 빌드해서.. 진행합니다.

Password:
--->  Fetching expat
--->  Attempting to fetch expat-2.0.1.tar.gz from http://distfiles.macports.org/expat
--->  Verifying checksum(s) for expat
--->  Extracting expat
--->  Configuring expat
--->  Building expat
--->  Staging expat into destroot
--->  Installing expat @2.0.1_0
--->  Activating expat @2.0.1_0
--->  Cleaning expat
--->  Fetching gperf
--->  Attempting to fetch gperf-3.0.3.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/gperf
.........
--->  Staging gtk2 into destroot
--->  Installing gtk2 @2.14.5_0+x11
--->  Activating gtk2 @2.14.5_0+x11
--->  Cleaning gtk2
--->  Fetching gtkwave
--->  Attempting to fetch gtkwave-3.1.13.tar.gz from http://distfiles.macports.org/gtkwave
--->  Verifying checksum(s) for gtkwave
--->  Extracting gtkwave
--->  Configuring gtkwave
--->  Building gtkwave
--->  Staging gtkwave into destroot
--->  Installing gtkwave @3.1.13_0
--->  Activating gtkwave @3.1.13_0
--->  Cleaning gtkwave

설치가 끝나면 다음과 같이 실행합니다.

gtkwave -f wavefilename

다음은 실행한 결과 그림입니다.

사용자 삽입 이미지

UI가 MAC 스럽지 않기 때문에 맘에 안들지만, 그래도 버그는 없을 것으로 생각합니다.





'ASIC SoC' 카테고리의 다른 글

SystemC에서 typdedef과 switch사이의 관계  (0) 2009.09.25
SystemC : Thread 2nd  (0) 2009.08.26
SystemC : Thread  (0) 2009.08.21
Sound Engine Processor  (0) 2009.08.18
맥에서 SystemC 하기  (0) 2009.08.10
Posted by GUNDAM_IM