MAC Life2013. 9. 24. 10:19

요새 별걸 다하다 보니 STEP 파일을 보게 되었습니다.

(대학교때이던가 Form-Z를 쓰면서 CAD를 좀했었는데 여기서 ..)


STEP파일은 오토캐드 같은 프로그램들 끼리 데이터를 교환하기 위해서 만든 포멧입니다.

주로 기구 제조나 건설 등에서 사용합니다.


인벤터 퓨전이 Autodesk사에서 공개한 Step File Viewer입니다.




https://itunes.apple.com/us/app/autodesk-inventor-fusion/id529580720?mt=12



간단한 Viewer로 쓰기에는 용량이 많이 크지만 뭐.. 공짜라는 장점이 좋습니다.

AudoDesk에 익숙하면 사용하기에는 좋습니다.





Posted by GUNDAM_IM
ASIC SoC2010. 11. 13. 11:22
이번에는 verilator로 실행하여서 vcd파일을 덤프하는 것을 만들어 보겠습니다.

일단 verilator로 c++ 소스 코드를 빌드할 때 이전과 차이점은  --trace 옵션이 붙습니다.

verilator --cc  --trace --exe dff_sync_reset_main.cpp  dff_sync_reset.v

위와 같이 실행하여서 Makefile과 c++ 코드를 만들어 냅니다.

testbench격인  dff_sync_reset_main.cpp 역시 수정해야 합니다.

#include <stdlib.h>
#include<iostream>

#include <verilated.h>          // Defines common routines
#include "verilated_vcd_c.h"
#include "Vdff_sync_reset.h"               // From Verilating "top.v"

......

int main(int argc, char** argv) {
            Verilated::commandArgs(argc, argv);   // Remember args

            Verilated::traceEverOn(true);
            VerilatedVcdC* tfp = new VerilatedVcdC;


            dff_sync_reset = new Vdff_sync_reset;             // Create instance

            dff_sync_reset->trace (tfp, 99);
            tfp->open ("./simx.vcd");

            dff_sync_reset->reset = 0;           // Set some inputs

            cout << "Start Simulation" << endl;

            while (!Verilated::gotFinish()) {
                if (main_time > 10) {
                    dff_sync_reset->reset = 1;   // Deassert reset
           .........
                main_time++;            // Time passes...

                tfp->dump (main_time);

            }
            dff_sync_reset->final();               // Done simulating
            //    // (Though this example doesn't get here)
            tfp->close();
            cout << "End Simulation" << endl;
}

추가되는 코드는 위와 같습니다.

먼저 헤더 파일로
#include "verilated_vcd_c.h"
을 읽어들이도록 합니다. 이것은 vcd 덤프를 위한 정보가 들어있습니다.

그리고 trace를 on하고
dump파일을 생성합니다.

            Verilated::traceEverOn(true);
            VerilatedVcdC* tfp = new VerilatedVcdC;
...
            dff_sync_reset->trace (tfp, 99);
            tfp->open ("./simx.vcd");

위에서 traceEverOn은 Trace를 항상 한다는 의미이고
dff_sync_reset->trace(tfp,99)는  최상위 모듈에서 밑으로 99개 depth까지 추적한다는 의미입니다.
거의 무한대겠군요

이후에

tfp->open(...)

을 호출하여 파일을 생성합니다.

            while (!Verilated::gotFinish()) {
                if (main_time > 10) {
                    dff_sync_reset->reset = 1;   // Deassert reset
           .........
                main_time++;            // Time passes...

                tfp->dump (main_time);

            }

무한 루프를 돌면서 한 턴이 끝나면 모두 save할 수 있도록 dump함수를 호출합니다.

이후에 시뮬레이션이 끝나면
            tfp->close();
으로 화일을 닫습니다.

이렇게 해서
simx.vcd
라는 파일을 얻어냅니다.
이것을 vcd 파일 볼 수 있는 프로그램인 gtkwave라던가 scansion에서 불러들이면 됩니다.

개인적으로는 맥스러운 GUI라면 Scansion인데 이 scansion에서 약간의 버그가 있습니다.
vcd파일에서 각 행의 시작열에 공백이 있으면 버그로 인식하게 됩니다.
이 프로그램은 잘 안팔려서 그런지 업데이트가 아주 느립니다.

요부분은 수작업으로 바꾸거나
스크립트로 바꾸면 됩니다.


=== Before ===
$version Generated by VerilatedVcd $end
$date Sat Nov 13 11:15:57 2010
 $end
$timescale 1ns $end

 $scope module TOP $end
  $var wire  1 $ clk $end
  $var wire  1 # data $end
  $var wire  1 & q $end
  $var wire  1 % reset $end
  $scope module v $end
   $var wire  1 $ clk $end
   $var wire  1 # data $end
   $var wire  1 & q $end
   $var wire  1 % reset $end
  $upscope $end
 $upscope $end
$enddefinitions $end


=== After ===
$version
   Generated by VerilatedVcd
$end
$date
    Sat Nov 13 10:51:15 2010
$end
$timescale
    1ns
$end

$scope module TOP $end
$var wire  1 $ clk $end
$var wire  1 # data $end
$var wire  1 & q $end
$var wire  1 % reset $end
$scope module v $end
$var wire  1 $ clk $end
$var wire  1 # data $end
$var wire  1 & q $end
$var wire  1 % reset $end
$upscope $end
$upscope $end
$enddefinitions $end
...

위와 같이 첫번째 열들부터 나타나는 공백을 모두 지우고 불러들이면 됩니다.

사용자 삽입 이미지

그리고 일일이 스크립트를 돌리기  귀찮으면verilator 소스 코드를 직접 수정하면 됩니다.
ident에 관한 일이므로 verilator 스타일로 보건데 한군데서 다 처리할 것 같아 뒤져보았습니다.

일단,
verilator source code가 있는 폴더에서 다음 파일을 찾아서 정리합니다.
.
...../verilator-3.804/include/verilated_vcd_c.cpp

이 파일에서 void VerilatedVcd::dumpHeader ()  함수가 헤더를 덤프해주는 함수입니다.
이 함수 내에 있는 printIdent(xxx) 함수 호출에서 xxx 부분을 몽땅 0으로 바꾸어 주면 됩니다.

=== before ===
354 행 :  printIndent(1);
=== after  ===
              printIndent(0);


382행
=== before ===
 printIndent(-1);
=== after ==
 printIndent(0);

392행
=== before ===
 printIndent(1);
=== after ==
 printIndent(0);


407행
=== before ==
printIndent(-1);
=== after ===
printIndent(0);

411행
=== before ====
printIndent(-1);
=== after ===
printIndent(0);

으로 변경합니다.
결론적으로 해당 함수의 printIdent는 모두 0으로 만들어버리면 ident가 VCD 파일에 들어가지 않습니다.
이제 새롭게 컴파일해서 설치하면 앞서의 scansion에서 파일 오픈할 때 일일이 헤더 부분을 수정할 수고를 덜어줍니다. 어차피 VCD파일 내부를 누가 보겠습니까 ?  IDENT가 없다고 상관없겠죠

이제 일일이 스크립트 돌릴 필요 없이 그냥 출력 파일을  scansion 에서 읽어들일 수 있습니다.







Posted by GUNDAM_IM
ASIC SoC2010. 11. 13. 10:26
이전에 정리한 글에서 tesebench에 해당하는 부분을 정리합니다.

verilator를 거쳐서 빌드한 소스코드에는 다음과 같은 파일들이 생성됩니다.

GUNDAM-NT:obj_dir kevinim$ ls
Vdff_sync_reset.cpp           Vdff_sync_reset.mk            Vdff_sync_reset__Syms.h       Vdff_sync_reset__verFiles.dat
Vdff_sync_reset.h             Vdff_sync_reset__Syms.cpp     Vdff_sync_reset__ver.d       Vdff_sync_reset_classes.mk

위의 코드에서 중요한 것은  헤더 파일인 Vdff_sync_reset.h 파일입니다.
내용을 보면

#ifndef _Vdff_sync_reset_H_
#define _Vdff_sync_reset_H_

#include "verilated.h"
class Vdff_sync_reset__Syms;

//----------

VL_MODULE(Vdff_sync_reset) {
  public:
    // CELLS
    // Public to allow access to /*verilator_public*/ items;
    // otherwise the application code can consider these internals.

    // PORTS
    // The application code writes and reads these signals to
    // propagate new values into/out from the Verilated model.
    VL_IN8(clk,0,0);
    VL_IN8(data,0,0);
    VL_IN8(reset,0,0);
    VL_OUT8(q,0,0);

    // LOCAL SIGNALS
    // Internals; generally not touched by application code

    // LOCAL VARIABLES
    // Internals; generally not touched by application code
    VL_SIG8(__Vclklast__TOP__clk,0,0);
    //char      __VpadToAlign13[3];
....

코드의 중간에 입출력 신호로 clk,daa,reset,q가 선언되어 있는 것을 볼 수 있습니다.
대략 통밥으로 굴리면 매크로만 보아도 8비트  char 타입으로 선언된것을 알 수 있습니다. ㅋㅋ
전체적으로는 클래스를 선언하고 입출력 포트는 해당 타입에 맞는 변수로 선언하는 것을 알 수 있습니다.
-  원래 C++로 하면 이렇게 밖에 할 수 없죠..
입출력 변수들은  public 에 위치시키고 있습니다.

그러면 이렇게 선언된 입출력 변수들을 main에서 access하기위해서는
class의 public 변수 참조 방식을 그대로 사용합니다.

#include "Vdff_sync_reset.h"
...
Vdff_sync_reset *dff_sync_reset;
...
 dff_sync_reset = new Vdff_sync_reset;
....
                if (( main_time % 10) == 1) {
                    dff_sync_reset->clk = 1;       // Toggle clock
                }
                if (( main_time % 10) == 6) {
                    dff_sync_reset->clk = 0;
                }
...

위와 같이 합니다. 일단 header파일을 인쿨루드 한 후에
module의 포인터를 선언하고
new로 해당 모듈을 생성합니다.

나머진 모듈(클래스)의 public값 쓰듯이 작업하면 됩니다.

testbench 격인 C++코드는 아래와 같은 구조로 되어 있습니다.

double sc_time_stamp () {       // Called by $time in Verilog
        return main_time;
}
        
int main(int argc, char** argv) {
            Verilated::commandArgs(argc, argv);   // Remember args
            dff_sync_reset = new Vdff_sync_reset;             // Create instance
            
......
            cout << "Start Simulation" << endl;  

            while (!Verilated::gotFinish()) {
  ........
                main_time++;            // Time passes...
            }
            dff_sync_reset->final();               // Done simulating
            //    // (Though this example doesn't get here)
            cout << "End Simulation" << endl;
}

main_time 변수는 verilog에서 $time을 호출할 때 반환되는 변수입니다.
verilog에서 $time을 호출하면 sc_time_stamp를 호출하게 되고 이때 main_time을 반환합니다.

main함수는
  초기화 블럭과
  무한 루프 블럭으로 나누어집니다.
   
  초기화 블럭은 시스템의 입출력 값을 초기화 시키는 것을 먼저 하고
  무한 루프 블럭에서 이리저리 한 작업을 계속 하게 됩니다.
  지정된 조건에 부합되면 무한 루프를 빠져나오면 되고요,
  만약 Verilog 에서 $finish를 호출하게 되면

  Verilated::gotFinish()

  에서 true를 돌려주게 되어 루프를 빠져나가게 됩니다.
  이후 작업은 finsh작업에 해당합니다.








Posted by GUNDAM_IM
ASIC SoC2010. 11. 13. 10:11
맥을 가진자의 숙명으로 그런 저런 불편함을 감수하면서 살아가고 있는 중에
몇일전에 날라온 메일을 보다가 발견한것이 Verilog 시뮬레이터인 Verilator입니다.
VCS라던가 다른 넘들처럼 Cycle Based Simulation 을 진행하여
엄청 빠른것을 자랑하고 있습니다. 흠...
여타 RTL 시뮬레이터 보다 2~30배 빠르다는 둥 하여튼 열심히 이야기하고 있길래 한번 사용해보고 사용법을 정리하였습니다.

Verilator는 엄밀하게는 시뮬레이터가 아니고 Verilog, SystemVerliog 등을 SystemC나 C++등으로 변환시켜주는 툴입니다. 실행파일로 만들어주니까 빠르게 된다는 것을 장점으로 삼고 있습니다.


(1) 설치하기
   
     설치하려면 gmake등이 필요합니다.
     일단 gmake는
 
     su port install gmake

    하고 루트 암호를 넣어주면 잘 설치가 됩니다.
 
    verilator는 아래 사이트에서 다운 받습니다.

   http://www.veripool.org/

   압축을 풀고 다음과 같이 진행합니다.

   ./configure
   gmake
   make test
   sudo make install

   차례로 치면 컴파일과 설정이 됩니다.

   체크는  
   
   verilator --help

   하면 쭈욱 화면에 프린트가 됩니다.

(2) 빠른 부분에 대한 설명

   홈페이지에 보면 아래와 같이 되어 있습니다. VCS대비 1.5배 NC-Verilog 대비 3배 빠르다고 나옵니다.

  • Verilator is 90x faster than Icarus Verilog.
  • Verilator is 10-40x faster than Modelsim SE.
  • Verilator is 3x faster than NC-Verilog.
  • Verilator is 1.5x faster than VCS.
  • VTOC is 4x faster than Verilator.
  • VTOC is 50x faster than NC-Verilog.
  • VCS is 3x faster than Verilator.
  • VCS is 3x faster than NC-Verilog.
  • VCS is 10x faster than NC-Verilog.
  • VCS is the same speed as NC-Verilog.
  • CVer is the same speed as Icarus Verilog.
 
   이렇게 빠른것은 Verilog Simulator가 아니라 Verilog Compiler입니다.
   verilog 코드를 받아 들여서

   C++이나 SystemC, SystemPerl ( 이건 왜나오는건지.. ) 등으로 바꾸는 역활을 합니다.

(3) 사용법에 대해서는....
    
    두단계로 나누어서 작업합니다.
   
    일단 Verilog Code가 완성 된 뒤에
    testbench에 해당하는 main.cpp를 만들어 둡니다.

    (1) C++ 코드로 만들기
         verilator는 시뮬레이터가 아니라 verilog를 c++등으로 바꾸어주는 translator에 가깝습니다.
        
         verilator를 이용해서 C++을 만들어 가는 것이 첫번째 작업입니다.

    (2) C++ 코드 빌드하기
        만들어진 코드는 obj_dir 이라는 폴더에 생깁니다.
        이 폴더에 보면 make파일이 생성되는데 이 make파일을 이용해서 실행 화일을 빌드하는 것이
       두번째 작업입니다.
        
    
  사용될 verilog code는 아래와 같습니다.
  간단한 DFF의 예제입니다.

//-----------------------------------------------------
// Design Name : dff_sync_reset
// File Name   : dff_sync_reset.v
// Function    : D flip-flop sync reset
// Coder       : Deepak Kumar Tala
//-----------------------------------------------------
module dff_sync_reset (
data   , // Data Input
clk    , // Clock Input
reset  , // Reset input
q        // Q output
);
//-----------Input Ports---------------
input data, clk, reset ;

//-----------Output Ports---------------
output q;

//------------Internal Variables--------
reg q;

//-------------Code Starts Here---------
always @ ( posedge clk)
if (~reset) begin
  q <= 1'b0;
end  else begin
  q <= data;
end

endmodule //End Of Module dff_sync_reset

 인터넷에서 구할 수 있는 간단한 dff의 예제입니다.
 
 자세한 설명은 나중에 하고 testbench에 대한 코드는 아래와 같습니다.

#include <verilated.h>          // Defines common routines
#include "Vdff_sync_reset.h"               // From Verilating "top.v"

Vdff_sync_reset *dff_sync_reset;                      // Instantiation of module
unsigned int  main_time = 0;     // Current simulation time

double sc_time_stamp () {       // Called by $time in Verilog
        return main_time;
}
        
int main(int argc, char** argv) {
            Verilated::commandArgs(argc, argv);   // Remember args
            dff_sync_reset = new Vdff_sync_reset;             // Create instance
            
            dff_sync_reset->reset = 0;           // Set some inputs

            cout << "Start Simulation" << endl;  

            while (!Verilated::gotFinish()) {
                if (main_time > 10) {
                    dff_sync_reset->reset = 1;   // Deassert reset
                }
                if (( main_time % 10) == 1) {
                    dff_sync_reset->clk = 1;       // Toggle clock
                }
                if (( main_time % 10) == 6) {
                    dff_sync_reset->clk = 0;
                }
                dff_sync_reset->eval();            // Evaluate model
                //cout << "Output : " << hex << dff_sync_reset->q << endl;       // Read a output
                printf("SIM %010d : (reset) %d, (clk) %d, (data) %d , (q) %d\n", main_time ,                                                    dff_sync_reset->reset ,  
                                                  dff_sync_reset->clk,
                                                  dff_sync_reset->data,
                                                  dff_sync_reset->q );
                main_time++;            // Time passes...
 
                if( main_time == 20) dff_sync_reset->data = 1 ;
                if( main_time == 80) dff_sync_reset->data = 0 ;
                if( main_time > 100) break;

            }
            dff_sync_reset->final();               // Done simulating
            //    // (Though this example doesn't get here)
            cout << "End Simulation" << endl;
}

 verilog code의 파일명은 dff_sync_reset.v 이고
c++ 테스트 벤치 코드는 dff_sync_reset_main.cpp 으로 지정해 둡니다.

그리고 make파일을 만드는 명령은 아래와 같습니다.

verilator --cc  -exe dff_sync_reset_main.cpp  dff_sync_reset.v

--cc 옵션은 c++ 형태로 코드를 만들어 돌라는 의미입니다.
-exe 옵션은 실행 파일로 만들어 돌라는 옵션입니다.
       이 옵션이 없으면 .a 파일인 라이브러리 파일로 만들어집니다.
       이 옵션을 주게 되면 main() 함수를 찾게 되는데 이 것으 없으면 나중에 컴파일 시에 오류가 발생합니다.
       따라서 main()함수가 포함된 .cpp파일을  --exe 옵션 뒤에 명시합니다.

그러면 obj_dir 폴더가 만들어집니다.

GUNDAM-NT:test kevinim$ cd obj_dir/
GUNDAM-NT:obj_dir kevinim$ ls
Vdff_sync_reset.cpp           Vdff_sync_reset.mk            Vdff_sync_reset__Syms.h       Vdff_sync_reset__verFiles.dat
Vdff_sync_reset.h             Vdff_sync_reset__Syms.cpp     Vdff_sync_reset__ver.d        Vdff_sync_reset_classes.mk

해당 되는 폴더에 들어가면 위와 같은 파일들이 있습니다.

나머지 파일은 넘어가고 .mk 파일이 make 파일입니다.

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


GUNDAM-NT:obj_dir kevinim$ make -f Vdff_sync_reset.mk
g++  -I. -MMD -I/usr/local/share/verilator/include -I/usr/local/share/verilator/include/vltstd -DVL_PRINTF=printf -DVM_TRACE=0 -DVM_COVERAGE=0        -c -o dff_sync_reset_main.o ../dff_sync_reset_main.cpp
g++  -I. -MMD -I/usr/local/share/verilator/include -I/usr/local/share/verilator/include/vltstd -DVL_PRINTF=printf -DVM_TRACE=0 -DVM_COVERAGE=0        -c -o verilated.o /usr/local/share/verilator/include/verilated.cpp
/opt/local/bin/perl /usr/local/share/verilator/bin/verilator_includer Vdff_sync_reset.cpp > Vdff_sync_reset__ALLcls.cpp
g++  -I. -MMD -I/usr/local/share/verilator/include -I/usr/local/share/verilator/include/vltstd -DVL_PRINTF=printf -DVM_TRACE=0 -DVM_COVERAGE=0        -c -o Vdff_sync_reset__ALLcls.o Vdff_sync_reset__ALLcls.cpp
/opt/local/bin/perl /usr/local/share/verilator/bin/verilator_includer Vdff_sync_reset__Syms.cpp > Vdff_sync_reset__ALLsup.cpp
g++  -I. -MMD -I/usr/local/share/verilator/include -I/usr/local/share/verilator/include/vltstd -DVL_PRINTF=printf -DVM_TRACE=0 -DVM_COVERAGE=0        -c -o Vdff_sync_reset__ALLsup.o Vdff_sync_reset__ALLsup.cpp
      Archiving Vdff_sync_reset__ALL.a ...
ar r Vdff_sync_reset__ALL.a Vdff_sync_reset__ALLcls.o Vdff_sync_reset__ALLsup.o
ar: creating archive Vdff_sync_reset__ALL.a
ranlib Vdff_sync_reset__ALL.a
g++    dff_sync_reset_main.o verilated.o Vdff_sync_reset__ALL.a    -o Vdff_sync_reset -lm -lstdc++  2>&1 | c++filt

  이상 없이 빌드 되었으면 실행하면 됩니다.

GUNDAM-NT:obj_dir kevinim$ ./Vdff_sync_reset
Start Simulation
SIM 0000000000 : (reset) 0, (clk) 0, (data) 0 , (q) 0
SIM 0000000001 : (reset) 0, (clk) 1, (data) 0 , (q) 0
SIM 0000000002 : (reset) 0, (clk) 1, (data) 0 , (q) 0
SIM 0000000003 : (reset) 0, (clk) 1, (data) 0 , (q) 0
SIM 0000000004 : (reset) 0, (clk) 1, (data) 0 , (q) 0
SIM 0000000005 : (reset) 0, (clk) 1, (data) 0 , (q) 0
SIM 0000000006 : (reset) 0, (clk) 0, (data) 0 , (q) 0
....

대충 움직이는 것을 확인해 볼 수 있습니다.

다음번에는 wave로 덤프하는 것을 추가해보도록 하겠습니다.


        

    

Posted by GUNDAM_IM
MAC Life2010. 7. 2. 21:47
이번에 그동안 쓰던 맥 북 프로 17"를 회사에 반납하고 새로 맥 북 프로 15" 버전을 받았습니다.

Apple-IIe -> Newton Message Pad 130 -> MAC Book Pro 15" 초기형 -> MAC PRO -> MAC BOOK PRO 17"-> iPad -> MAC BOOK PRO 15"

1주일 넘게 사용하면서 느낀 점은

데이터 백업이 만만찮기는 하지만 그래도 잘 되었다는 점 입니다.

1. 타임머쉰으로 백업해두면 파일을 한두개 찾거나 복원하는 것은 쉽지만,
    전체 하드를 복원하는 것은 쉽지 않더라 하는 점...
    생각 이상으로 어렵더군요.. 헤멨습니다.

2. 노트북 끼리 데이터 옮기는 것..
    OSX는 초기 부팅시에 데이터를 다른 OSX에서 옮기는 것을 지원해 줍니다.
    이른바 마이그레이션입니다.

    요 기능을 이용하면 데이터를 그대로 살려서 가지고 올 수 있습니다.
    
    문제는 생각한것 보다 불안정하다는 거였습니다.
    FireWire 케이블로 하지 않고 그냥 Ethernet 케이블로 마이그레이션을 하니
    진행 중간에 링크가 끊어지는 경우가 빈번해서 고생했습니다.
    황당한것은 1394로 연결하면 안정성이 확보된다는 글을 보고 1394연결 케이블을 사러 애플 매장에 갔더니 맥북 프로용 1394 연결 케이블이 없더군요    그럼 왜 1394를 밀고 있는건지.. 에구

  3. 천신만고 끝에 데이터를 옮겼는데 옮기고 보니 몇개 프로그램은 등록 번호가 실종되었습니다.
      
  4. 그래도 윈도우즈랑은 틀려서 프로그램 전체를 새로 설치하지 않아도 이전 프로그램이나 데이터를 거의 살려서 잘 쓰고 있습니다.  
 

그리고 17"와 15"의 차이점은

우선 17"는 허리가 아플 정도로 무거웠지만 15"는 어깨만 아프다는 점이 틀립니다.
그리고 17"는 화면이 커서 아주 좋지만, 15"는 2"차이긴 하지만 조금 좁아보입니다.
그동안 눈이 17"에 맞추어서 호사스럽게 호강했다는 뜻입니다. ㅋㅋ

문제는 15"의 배터리가 용량이 작아서인지 17"에서는 한참을 써도 될 정도로 배터리의 용량이 컸는데
15"는 배터리 줄어드는게 구멍뚫린 항아리 같은 느낌입니다.
그런 부분이 조금 아쉽습니다.

그리고 이번 버전의 전원 플러그인 맥세이프는 모양이 조금 바뀌었습니다.
전 버전들은 조금 불안하여서 연결 부분이 튿어졌는데 지금 버전은 그런 부분이 아예 없도록 알루미늄 통으로 감싸버렸습니다.  좀더 안전하여 졌다는 느낌입니다.

사용 내용이야 똑 같은거고 프로세서 속도를 느낄 만큼 심각한 프로그램을 돌리는 것도 아니어서 괜찮습니다.

 
Posted by GUNDAM_IM
ASIC SoC2010. 3. 21. 20:05
Computer archiecture 서적의 바이블인 Computer organization and design 에 보면
부록에서 SPIM이라는 MIPS Processor 시뮬레이터에 대한 언급이 나옵니다.

Assembler로 코딩한 것을 테스트 해 볼 수 있는 시뮬레이터입니다.
최신 버전이 8 이고 아래 사이트에 가면 다운로드 할 수 있습니다.


소스 코드로 다운로드할 수 있는데 빌드는 크게 어려운 점이 없으므로 쉽게 할 수 있습니다.

사용자 삽입 이미지

특징은 다른 시뮬레이텨들은 대부분 Binary 파일을 로드해서 사용하도록 되어 있는데 이 XSPIM/SPIM은 assembler파일을 로드해서 사용할 수 있도록 되어 있습니다.  그리고 다양한 OS에 포팅되어 있어서 리눅스는 물론이고 OSX까지 포팅되어 있습니다. MIPS 어셈블러를 테스트 해보고 싶은 분들에게는 좋은 출발점이 될 수 있는 프로그램입니다.

창을 열면 위와 같이 GUI창이 나오는데 마치 DDD를 보는 것 같은 느낌입니다.
용법은 대개 쉬워서 가운데 부분에 있는 버튼들을 잘 두들기면 됩니다.

실행 방법
  xspim assembler_file_name
입니다.

  예를 들어서 tt.endians.s 라는 어셈블러 파일을 실행하고 싶으면 다음과 같이 합니다.

  xspim tt.endians.s

그러면 다음과 같이 창이 나타납니다.
사용자 삽입 이미지
Step 커맨드 버튼을 눌르면 한 스텝씩 진행됩니다.
몇가지 System Function을 지원하는데 그중에 하나가 print문입니다.

tt.endians.s 파일은 아래와 같습니다.

......
        .data
saved_ret_pc:   .word 0         # Holds PC to return from main
m3:     .asciiz "The next few lines should contain exception error messages\n"
m4:     .asciiz "Done with exceptions\n\n"
m5:     .asciiz "Expect an address error exception:\n   "
m6:     .asciiz "Expect two address error exceptions:\n"
        .text
        .globl main
main:
        sw $31 saved_ret_pc

        .data
lb_:    .asciiz "Testing LB\n"
lbd_:   .byte 1, -1, 0, 128
lbd1_:  .word 0x76543210, 0xfedcba98
        .text
        li $v0 4        # syscall 4 (print_str)  <--
        la $a0 lb_
        syscall

        la $2 lbd_
        lb $3 0($2)
        bne $3 1 fail
        lb $3 1($2)
        bne $3 -1 fail
        lb $3 2($2)
        bne $3 0 fail
        lb $3 3($2)
        bne $3 0xffffff80 fail
.......
 
위에서 보는 것 처럼 $v0에 4를 넣고 (print str system call 번호입니다.)
$a0에 해당 스트링의 어드레스를 넣은 뒤에 syscall을 수행하면 위의 그림처럼 메시지가 출력됩니다.

디버깅시에 편한 용법입니다.

디버깅 창의 제일 밑에보면 수행되는 명령어 시퀀스를 하나씩 출력합니다.

SPIM Version 8.0 of January 8, 2010
Copyright 1990-2010, James R. Larus.
All Rights Reserved.
See the file README for a full copyright notice.
Loaded: /usr/local/lib/spim/exceptions.s
[0x00400000] 0x8fa40000  lw $4, 0($29)                   ; 183: lw $a0 0($sp) # argc
[0x00400004] 0x27a50004  addiu $5, $29, 4                ; 184: addiu $a1 $sp 4 # argv
[0x00400008] 0x24a60004  addiu $6, $5, 4                 ; 185: addiu $a2 $a1 4 # envp
[0x0040000c] 0x00041080  sll $2, $4, 2                   ; 186: sll $v0 $a0 2
[0x00400010] 0x00c23021  addu $6, $6, $2                 ; 187: addu $a2 $a2 $v0
[0x00400014] 0x0c100009  jal 0x00400024 [main]           ; 188: jal main <--
[0x00400024] 0x3c011001  lui $1, 4097                    ; 45: sw $31 saved_ret_pc
[0x00400028] 0xac3f0000  sw $31, 0($1)
[0x0040002c] 0x34020004  ori $2, $0, 4                   ; 52: li $v0 4 # syscall 4 (print_str)
[0x00400030] 0x3c011001  lui $1, 4097 [lb_]              ; 53: la $a0 lb_
[0x00400034] 0x342400a2  ori $4, $1, 162 [lb_]
[0x00400038] 0x0000000c  syscall                         ; 54: syscall
[0x0040003c] 0x3c011001  lui $1, 4097 [lbd_]             ; 56: la $2 lbd_
[0x00400040] 0x342200ae  ori $2, $1, 174 [lbd_]
[0x00400044] 0x80430000  lb $3, 0($2)                    ; 57: lb $3 0($2)
[0x00400048] 0x34010001  ori $1, $0, 1                   ; 58: bne $3 1 fail
[0x0040004c] 0x14230243  bne $1, $3, 2316 [fail-0x0040004c]
[0x00400050] 0x80430001  lb $3, 1($2)                    ; 59: lb $3 1($2)
[0x00400054] 0x3c01ffff  lui $1, -1                      ; 60: bne $3 -1 fail


00400014 에서 JAL을 하므로 00400024로 점프합니다. 이것은 main에 해당되는 어드레스입니다.
따라서 System Reset시에는 00400000부터 시작함을 알 수 있습니다.

해당되는 코드는

./CPU/exception.S

파일에 있습니다.  해당 파일을 보면

.......
# Standard startup code.  Invoke the routine "main" with arguments:
#       main(argc, argv, envp)
#
        .text
        .globl __start
__start:
        lw $a0 0($sp)           # argc
        addiu $a1 $sp 4         # argv
        addiu $a2 $a1 4         # envp
        sll $v0 $a0 2
        addu $a2 $a2 $v0
        jal main  <--
        nop

        li $v0 10
        syscall                 # syscall 10 (exit)

        .globl __eoth
__eoth:
.......

으로 되어 있어서 _start부터 리셋 스타트가 시작되고 있음을 알 수 있습니다.
여기서 jal main을 수행하므로 여기서 유저가 짠 프로그램으로 점프 하고 있습니다.

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

EMACS에 Verilog Mode 설치하고 활용하기  (2) 2010.10.30
사상 최강의 보드  (2) 2010.04.18
HD Quad Display/Processing Engine  (1) 2010.03.12
Sound Effect Processor  (0) 2010.02.01
[SC] Structure  (0) 2010.01.18
Posted by GUNDAM_IM
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
Hobby2009. 9. 23. 20:50
때떄로 GUI를 디자인할 일이 생기는 경우가 있습니다.
1년에 1~2회 정도는 GUI를 이것 저것 해야 하는 경우가 생기고 그것 때문에 신경을 써야 하더라구요

그때마다 M$사의 프로그램을 이용해서 해왔고
지금은 CURIO라는  MAC S/W를 이용해서 디자인을 합니다.
나름 산뜻하게 나오고, 사용법도 좋아서 애용하고 있습니다.
특히 이 프로그램은 자체적으로 PT로 바로 전환할 수 있는 점이 장점입니다.

이번에 우연히 발견한 프로그램은 좀더 원초적인 GUI Outliner 프로그램입니다.
백문이 불여 일견이라고 아래 사진을 보시면,

사용자 삽입 이미지
itunes를 손으로 그린것 으로 보이시게지만, 이것이 바로 이프로그램을 이용해서 GUI Outline을 잡은 것입니다.
Balsamiq사의 MockUp이라는 프로그램입니다.
$79에 파는 프로그램인데, 어쩌다 한번 정도 GUI 디자인하는 저보다는 자주 GUI를 디자인 하는 사람에게는 손으로 그린 이펙트가 좋기 떄문에 애용하면 좋을 것 같습니다.

사용자 삽입 이미지
 NAVI MAP을  GUI로 만든것입니다.

사용자 삽입 이미지
역시 iPHONE GUI를 도안한 화면입니다. ..

때때로 반듯반듯한 그림을 만들기 위해서
특히 칩의 Block Diagram을 3D를 이용해서 Block diagram으로 그리면 PT시에 이펙트가 정말 좋은데
이런 프로그램을 통해서 손으로 만든것 같은 블럭도 이펙트도 좋을 것 같습니다.

손으로 그린 GUI 효과는 애플 계열의 PT에서 많이 나오는데
볼때마다 편안하고 몰입감이 있다는 느낌을 줍니다.
이 프로그램은 그런 편안한 상태의 그림을 만들어 주기 떄문에 받아들이는 쪽에서 쉽게 받아들일 수 있는 좋은 효과를 얻을 수 있을 것 같습니다.

다양한 O/S를 지원하므로 O/S에는 큰 상관이 없이 사용할 수 있습니다.

'Hobby' 카테고리의 다른 글

[DQ9] 드디어 마지막 장으로....  (0) 2009.11.12
Dragon Quest IX 열랩하기  (0) 2009.11.05
건담 강림 3rd - 사진 정리  (0) 2009.09.02
건담 강림 2nd - 드디어 실물을 보러 갔습니다.  (0) 2009.08.31
이럴수가....  (0) 2009.07.17
Posted by GUNDAM_IM
MAC Life2009. 8. 7. 11:49
여기 SIGGRAPH에 와서 가장 기분 좋은 일은 생각 이상으로 많은 사람들이 맥을 쓴다는 것입니다.
원래 SIGGRAPH가 그래픽 전문 컴퍼런스인 점도 있겠지만, 이곳 전시장에서는 전체 컴퓨터 사용 인구중에서 맥을 사용하는 인구가 대략 과반수 이상이 맥을 씁니다.

대충 느낌으로 말한다면

맥북프로  40%  맥북 20% 그리고 나머진 윈도우 정도가 됩니다.

60% 정도 이상은 맥을 쓰고 있다는 의미입니다. 재미있는 점은 맥북에어가 하나도 안보인다는 점입니다.
아무래도 "가오"는 최고인데 성능 때문에.. 외면받는느낌일듯 합니다.


맥은 노트북을 열면 동일 네트웍에 뜬 맥을 보여줍니다.
아래 그림은 컨퍼런스 안에 있는 스타 벅스 커피샾의 네트웍에서 잡은 맥의 네트웍입니다.

사용자 삽입 이미지
정말 많이 잡히죠.. 동그란것은.. 윈도우이고 맥 그림이 나타나는 것은 전~~~~부.. 맥입니다.

사용자 삽입 이미지

중국 아저씨께서, 맥을 열심히 보고 있습니다.
사용자 삽입 이미지

뭔가 포스 있는 분이.. 맥으로 타이프를 치고 있습니다. 뒤에서 슬쩍 볼려고 했지만, 자세히는 보지 못했습니다.


사용자 삽입 이미지


두사람이 각각 맥으로 뭔가를 하고 있습니다.
이런 광경은 이곳에서 정말 흔합니다.

그리고 이런것만 있는게 아닙니다.
사용자 삽입 이미지

강의 자료중 상당부분이 맥으로 만들어왔더군요
눈의 가시같은 PPT도 가끔 있긴 하지만 대부분은 그림이나 폰트가 깔끔하게 나오는 맥을 이용해서 PT를 하고 있습니다.
  중간에 발표자가 바뀔때 나타난 화면이 맥 화면이었습니다.

우리나라에서는 마이너한 생활을 하는 맥이지만, 이곳에서는 나름 주류 생활을 하는 분위기여서 정말 좋습니다.
우리도 얼렁 이런 문화가 되어야 하는데...

'MAC Life' 카테고리의 다른 글

산호세 애플샵  (0) 2010.02.28
MAC에서 Perl/Tk 컴파일하기  (0) 2009.11.20
CUDA on MAC OS  (0) 2009.06.23
맥에서 프로파일링 하기  (0) 2009.06.18
OSX용 YUV Player 입니다.  (0) 2009.06.16
Posted by GUNDAM_IM
ASIC SoC2009. 7. 20. 09:52
이번에는 툴 체인을 빌드합니다.
언제나 그렇듯이 맥에서 빌드합니다.
빌드하다가 발생하는 에러는 이번 케이스의 경우에는 맥에 한정된 것으로 보입니다.
맥의 경우 폴더를 파일로 보여주기 때문에 (윈도우즈만 사용하시는 분은 이게 뭔말인지 잘 모르시겠지만.. )
발생하는 문제점입니다.

윈도우즈나 리눅스에서는 별다른 문제가 없을 것으로 생각됩니다.


(1) 툴 체인을 맥에서 빌드하기


hdl 관련된 툴 소스는 아래 명령어로 받을 수 있습니다.

git clone http://repo.or.cz/r/zpu.git

받으면 폴더는 아래와 같이 생성됩니다.


소스 코드는 다음과 같이 다운 받을 수 있습니다.
git clone git://www.ecosforge.net:8100/zpu/toolchain.git

다운 받으면 빌드를 하면 됩니다
다운 받은 폴더는 다음과 같은 구조로 되어 있습니다.

/toolchain/binutils
      /dejagnu
              /gcc
              /gdb
              /testresult

입니다.

빌드는 toolchain에서.. build.sh로 하면 됩니다.
이넘을 아예 제공해주더군요
이넘은 Binutils와 GCC를 빌드해줍니다.
GDB는 따로 빌드해야 합니다.

빌드를 하면 다음과 같은 오류가 발생합니다.


1.  binutils/bfd


configure: error: installation or configuration problem: C compiler cannot create executables.

make: *** [configure-bfd] Error 1


C 컴파일러가 워킹을 하지 못해서 발생한 오류입니다.


추적하여 가면 다음과 같은 명령어에서 동작을 하지 못함을 알 수 있습니다.


 gcc -o conftest.dSYM -g -O2   conftest.c  1>&5


중간에 conftest.dSYM을 만들어 내는데 이것이 문제입니다.


log 파일을 보면

checking for executable suffix

에서 dSYM을 찾아 붙입입니다.


테스트를 위해서 덤프 코드를 넣어서 수행해보면 아래와 같은 사항을 확인할 수 있습니다.


checking for executable suffix... (cached) .dSYM

[4] .dSYM


그럼 문제는 .dSYM이 만들어지는 것에 있네요.. 이것은 MAC에서 사용하는 파일-폴더 확장자입니다.


이 코드는 bfd/configure : 2441라인에서 시작하는 부분에 해당합니다.


코드를 확인해보면

시그윈이거나 윈도우즈 일때는 .exe를 붙이고

아닐때는 스크립트에 의해서 찾아서 붙이도록 되어 있습니다.


일일이 코드 고치기도 귀찮으니까

그냥 exeext 를 강제로 “”로 매핑시켜 버립니다.


그러면 컴파일이 진행됩니다.

진행되면서 같은 오류가 발생한는데 그때마다 강제 매핑을 하고 진행하면 됩니다.

몇군데 매핑시켜놓고 진행하면 mac에서도 잘 컴파일이 됩니다.

- 4군데 정도 되네요..


2.gcc를 빌드하다가..

..........

vmodsi4.o libgcc/./_mulsi3.o libgcc/./_xordi3.o libgcc/./unwind-dw2.o libgcc/./unwind-dw2-fde.o libgcc/./unwind-sjlj.o libgcc/./gthr-gnat.o libgcc/./unwind-c.o libgcc/./_eprintf.o libgcc/./__gcc_bcmp.o

make[2]: zpu-elf-ar: Command not found


에서.. 에러가 발생합니다.


env.sh를 실행을 시켰는데 아닌것 같습니다.

확인해 보니 실행하는게 아니고 source  하는거네요


source env.sh


로 해서 매핑시키고 다시 환경 변수를 확인해 보니 잘 들어갑니다.


set

.......


PATH=/sw/bin:/sw/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin:/usr/X11R6/bin:/Users/kevinim/Desktop/zylin/toolchain/toolchain/install/bin

......

다시 컴파일 하면 됩니다.





(2) 컴파일러 테스트


간단한 C 코드를 만들어서 테스트를 확인해 보도록 하겠습니다.

코드는 아래와 같습니다.

#include <stdlib.h>

main()
{
  printf("GUNDAM forever!!");
}

컴파일하여 어셈블러를 만들어보겠습니다.

Macintosh:test1 kevinim$ zpu-elf-gcc -S -O2 test.c


어셈블러 파일은 아래와 같습니다.

        .file   "test.c"
        .section        .rodata.str1.4,"aMS",@progbits,1
        .balign 4;
.LC0:
        .string "GUNDAM forever!!"
.text
        .globl  main
        .type   main, @function
main:
        im -1
        pushspadd
        popsp
        im .LC0
        storesp 4
        impcrel (printf)
        callpcrel
        loadsp 4
        im _memreg+0
        store
        im 3
        pushspadd
        popsp
        poppc
        .size   main, .-main
        .ident  "GCC: (GNU) 3.4.2"

Posted by GUNDAM_IM