ASIC SoC2009. 7. 28. 09:16

합성


이번에는 합성을 하여 보겠습니다.

타겟 FPGA는
 자이링스 V5LX330을 타겟으로 진행하였습니다.
 
 LUT 활용율은 0.3% 정도가 됩니다.

사용자 삽입 이미지
 속도는 PAD부분이 포함되어서 정확하지는 않습니다만, 대략 150~200MHz까지 뽑을 수 있을것 같습니다.
 
크기는 꽤 스마트하게 나옵니다.
모토에서 말하듯이 가장 작은 32Bit RISC 프로세서라는 말이 실감이 나는 크기입니다.
생각해보면 Stack Based Architecture이기 때문에 내부 레지스터 파일이 거의 없다는 것이
이러한 크기를 가지고 옵니다.

ASIC으로 합성해보면

1만 게이트가 조금 안되게 나옵니다.
속도를 주고 합성을 하면 2만게이트 근처까지 올라가는 것 같습니다.
90n에서 속도가 500~800MHz까지 나오는것 같은데, 메모리 인터페이스의 문제가 있을터이니, 조금 낮게 잡고 운용하면 될것이라 생각합니다.
보다 정확한 사항은 이리저리 테스트를 해보아야 정확하게 얻을 수 있을 것입니다.

끝으로


우연히 본 Evaluation Kit에 들어있는 프로세서이고,

요새 세상에 Stack Based Architecture라는게 조금 뜬금없어서,
한번 이리저리 테스트를 해보았습니다. 시뮬레이션 한것도 있는데 따로 정리할 시간이 없네요. 에궁..

한때 세상을 풍미할 뻔 했던 JAVA Processor도 이런 구조인데,
아무래도 퍼포먼스의 문제가 있어서 잘 사용하지 않는 구조입니다.
요새는 프로세서가 작은것이 미덕이 아니고, 프로세서가 저전력인것이 미덕인 세상에 살고 있습니다.
한때는 7000Gate네 10000게이트네 하면서 머리 싸매며 만들던 시절이 있었지만, 50000게이트라도 좋으니
잘 움직이고, 적당히 빠르면 좋습니다.

그리고 이 프로세서의 S/W까지 분석을 해야 하는데
이 프로세서의 퍼포먼스가 그렇게 높지 않은것 같아서, 한번 합성해보고 시뮬해보는 정도에서 끝냈습니다.
(역쉬 귀차니즘.. 굳이 S/W까지 할 필요가 없을듯.. 해서.. )


Posted by GUNDAM_IM
ASIC SoC2009. 7. 23. 09:18
ALZPU의 인터페이스에 대해서 간략하게 정리하였습니다.


I.O는 아래와 같습니다.

사용자 삽입 이미지
크게 ROM/RAM/IO/System 으로 해서 4개 군으로 분류하여서 정리할 수 있습니다.
이름만 보아도 대충 다 아는 것들이어서 따로 정리할 필요는 없겠습니다.

시스템 구성의 예는 별도 폴더에 있습니다.
ROM/RAM/UART등을 붙여둔것인데,  아래에서 찾을 수 있습니다.

ALZPU/ZPU/HDL/ALZPU/V4/DESIGNS/BENCHMARK
alzpu_system.vhd

UART 는 Tx만 하게 되어 있습니다.  흠.. 뭔가 불안한건가 ?

파일이 시스템 구성 파일입니다.
시스템 구성은 다음과 같습니다.

사용자 삽입 이미지
UART/TIMER등을 기본적으로 가지고 있습니다.
나머지는 일반적인 인터페이스입니다.

slave select 2/4/8이 있고요.. 이 중에서 4 짜리를 사용했습니다.
뒤에 붙은 숫자는 당연히 Slave의 개수를 의미하겠죠.

alzpu_slaveselect.vhd 파일에 보면

  ........
  slave_sel <= master_in.addr(address_bits-1 downto address_bits-2);
  .......

이란 코드가 있고요.. address_bits의 크기에 따라서.. slave_select가 결정이 됩니다.
예를 들어서 16비트 어드레스를 쓴다면,

  ( 15 downto 14 )

가 되어서

0x0000 : Slave 0
0x4000 : Slave 1
0x8000 : Slave 2
0xC000 : Slave 3

이 됩니다.

alzpu_system.vhd 코드에 보면

...
  ioss: alzpu_slaveselect4
    generic map (
      address_bits => alzpu_rom_num_bits+1,
      slave0_address_size => alzpu_ram_num_bits,
      slave1_address_size => alzpu_ram_num_bits,
      slave2_address_size => alzpu_ram_num_bits,
      slave3_address_size => alzpu_ram_num_bits
    )
    port map (
      master_in => iosi,
      master_out => ioso,

      slave_in_0 => uart_si,    -- 0x8000 00
      slave_out_0  => uart_so,
      slave_in_1 =>  open,     -- 0xA000 01
      slave_out_1  => dummy_so,
      slave_in_2 => timer_si,   -- 0xC000 10
      slave_out_2 => timer_so,
      slave_in_3 => open,       -- 0xE000 11
      slave_out_3 => dummy_so
  );
....
이 됩니다.

따라서, 자동으로 설정됩니다.

나머진 코드를 보면 쉽게 알 수 있습니다.
(대충 넘어가는 분위기로.. 마무리 하는게 아니라, 코딩이 알기 쉽게 되어 있어서 그렇습니다. TT;;; )




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
ASIC SoC2009. 7. 16. 16:27
이번에는 종류를 정리해 보도록 하겠습니다.

(1)  ZPU4 SMALL



에서 찾을 수 있습니다.

가장 작은 프로세서 종류이고 최소한의 명령어만을 가지고 있습니다.
크기와 간단성에 중점을 둔 프로세서 입니다.
내부에 듀얼포트 램을 써서 데이터와 코드를 넣어서 동작시킵니다.

주요 용도는 하드웨어 상태머쉰용도입니다.

3 State로 동작합니다.

fetch -> Decode -> execute

입니다. 파이프라인 형태로 동작하지 않으므로 당연히 3단계 상태로 움직입니다.
일반 8051이 6단계/12단계로 움직이는데 3단계정도야 양호하죠


(2) ZPU4 Medium



에 있고 싱글포트 메모리 인터페이스를 가지고 있습니다.
따라서 데이터와 코드 그리고 I/O를 싱글포트 메모리 인터페이스를 통해서 운용할 수 있습니다.

명령어 세트가 더 많기 때문에 메모리 인터페이스 밴드대역폭이 zpu_core_small 보다 작아도 전체 퍼포먼스는 높습니다.

(3) Pipelined ZPU

파이프라인 버전의 ZPU 입니다.
다운은 다음 명령으로 다운을 받을 수 있습니다.

git clone git://repo.or.cz/zpu/alzpu.git

관련 페이지는 아래 페이지 입니다.

http://repo.or.cz/w/zpu/alzpu.git

이 버전의 ZPU를 다운 받으면 나머지 ZPU들도 함께 다운 받을 수 있습니다.
그냥 이 버전으로 다운 받아도 될것 같습니다.

이 버전의 ZPU가 정상 동작하는지에 대해서는 확인을 해 봐야 합니다.
인터넷에는 그에 대한 정보가 아직 올라온 것이 없네요


(4) ZEALOT

프로토스의 질럿인지는 모르겠습니다.


2가지 버전이 있으며 Small과 Medium 버전이 있습니다.

이 버전은 Salvador E. Tropea.에 의해서 제작되고 관리됩니다.

주요한 특징은

(5) ZY2000


에서 찾을 수 있습니다.

ZPU4에다가 Wishbone I/F를 가지고 있습니다. 그리고 풀셋으로  페리페럴을 가지고 있습니다.
-  ZPU
- DRAM
- soft-MAC
- Wishbone bridge
- GPIO
등을 포함하고 있습니다.

(6) Verilog 버전

에 가면 베릴로그 버전의 프로세서 모델을 찾을 수 있습니다.

어떤 버전이 좋은지는 검토를 해봐야 알겠습니다만,
파이프라인이 잘 동작한다면 차라리 그쪽이 좋지 않을까 합니다.
다만, 새로운 명령어 추가에 문제가 있을 수 있겠네요




Posted by GUNDAM_IM
ASIC SoC2009. 7. 13. 20:50

(0) 동기


   최근에 작은 프로세서에 대해서 검토해 봤습니다.
   조건은
   - 작아야 하며,
   - 그래도 C가 지원되에어 하며
   - AHB 정도는 나오거나 쉽게 붙을 수 있어야 한다
   - 소스 코드를 구할 수 있어야 하며
  - 라이센스에서 GPL이 없는 것이어야 한다는 것입니다.
 
   좀 조건이 까다로운가 싶기도 하네요.. 하지만
  저런 조건이 되어야 이리저리 사용할 수 있습니다.

  이리저리 찾다가 생각보다 작은 프로세서 하나를 찾았습니다. ZPU입니다.
  잘 아시겟지만, 오픈코아에 있는 프로세서 입니다.
  사실 저도 거기에 있는줄은 알았지만,  오픈코아의 특성상 반신반의 하였습니다.
  엔지니어의 원칙,
       내가만든 코드도 안믿는데 남이 만든 코드를 믿겠느냐. 라는.. 불신론에 가까운 생각을..
  가지고 있어서..
  우연히 다른 프로젝트를 검토하다가 외국 모 회사의 개발 환경을 검토하는 중에 해당 프로세서를 사용한 예제를 주고 있는 것을 발견하고  유심히 한번 보았습니다.
 

(1) 라이센스


  GPL 라이센스 문제는 생각보다 복잡합니다.
  사용상에 아무런 제약이 없지만, 문제는 링크된 모든 코드를 오픈해야 한다는 점 때문입니다.
  프로그램상의 링크된 코드를 하드웨어로 재 해석한다면 붙어있는 모든 IP를 의미합니다.
  - 아직 이부분에 대해서는 판례나 정보가 정확하게 정의된 것이 없어서 구체적으로 어떻게까지
    공개되어야 하는지 명확하지가 않습니다.
    인터넷에서도 이에 대해서 많은 토론을 진행하고 있습니다.

  개인으로 할때야 아무런 문제가 없지만
  회사차원에서 할 때에는 이런 GPL이 적용된 코드를 사용하면,
  자사 설계 아이피를 모두 오픈해야 하는 곤란한 문제가
  발생합니다.  그래서 GPL 라이센스가 붙은 IP를 사용하는 것은 상당히 조심스러워집니다.

  예전에 OpenCore 프로세서도 발표는 GPL로 하였지만, 저자가 적용한 라이센스의 의미는 모두 사용하라는 것이지 모두 공개하라는 의미는 아니였다는 글을 포스팅한적도 있습니다. 하지만, 저자가 회사를 만들면서, 공개에 관련된 모든 글들이 슬그머니 사라지면서, 그 글도  슬그머니 사라져 버렸죠.

  스팍 T1을 잘라서 만든 SRISC도 이 GPL을 따라갑니다.
  - 만드신 분들도 크게 돈을 목적으로 하지 않는것 같아서  그분들은 크게 문제는 없습니다만,...

  그래서 최소한의 조건은 BSD라이센스여야 한다는 점입니다.
  - 사용은 공짜로 , 링크된 부분은 공개는 안해도 되는 라이센스 조건입니다.

  이번에 찾은 ZPU는 Architecture는 GPL이어서 만약 아키텍쳐에 대한 수정이 가해지면
  모두 공개하여야 합니다. 대신에 코드에 대해서는 BSD라이센스를 사용하여서 사용상에
 큰 문제인 링크된 코드를  오픈하라는 문제는 없어지게 됩니다.
 

(2) 소스 코드 다운 받기


아래 사이트에서 다운 받을 수 있습니다.
http://opensource.zylin.com/zpudownload.html

툴은 리눅스와 윈도우/시그윈 버전을 다운 받을 수 있습니다.

프로세서 소스코드는

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

으로 다운 받을 수 있습니다.

툴 체인은 SRC로도 다운 받을 수 있습니다.
- 제 경우 맥을 쓰므로 새로 빌드를 하였습니다. 이것은 다음 번에 정리하도록 하겠습니다.

툴 체인은 toolchain 폴더로
프로세서는 zpu 폴더에 다운 받게 됩니다.

(3) ZPU Processor 폴더 구조


zpu /misc /arm7
/ddrsdram
/wishbone
/wip (EMPTY Folder)
/zpu /docs
관련 문서를 보관하는 폴더입니다.
zpu_arch.html 파일을 읽으면 됩니다.
하위 폴더로 presentation이 있는데, PT 자료를 포함합니다.
/hdl
프로세서 HDL 코드가 들어 있습니다.
자세한 폴더 내용은 다음 절에서 정리합니다.
/roadshow
예제 프로그램들이 들어 있습니다.
/sw
시뮬레이터와 간단한 샘플 예제가 들어 있습니다.

(4) ZPU Architecture

ZERO Operand 아키텍쳐입니다.
쉽게 말씀드리면  JAVA 프로세서와 같은 Stack Based CPU입니다.
따라서 명령어는 8비트로 됩니다.


위의 코드를 보면 5를 스텍에 넣고
loadsp 20으로 하여서 SP+20의 값을 읽어서 스텍 최상층에 넣습니다.
다시 ADD 명령으로 2개의 최상층 스텍 값을 읽어서 더한 후에 다시 스텍에 넣습니다.

스텍에 계속 읽고 쓰므로 느리긴 하지만, 나름대로, 간편한 구조여서 프로세서의 크기를 줄이는데
일조를 합니다.

이런 아키텍쳐이므로 수학연산을 하기위해서 쓰는 것은 좀 무리가 있겠습니다.
다만, 간단한 제어용으로 사용하는데에는 좋을 것 같습니다.

사실 요즘은 맘만먹으면 구할 수 있는 프로세서가 많이 있습니다.

Altera의 NIOS,
Xilinx의 picoblaze등등

그런 상황에서 ZPU의 장점이 뭔지 생각해봐야 할 부분인듯 합니다.

좋은 점은 아주 작으므로, 초기 시스템 세팅에 필요한 동작을 수행할때 사용하면 좋을 것 같습니다.
최근에 모 프로젝트에 8051을 검토하였습니다만, 이정도 급이면 쓸만할 것 같습니다.

자료를 보면 eCOS도 포팅되어 있기 때문에 적당한 수준의 제어용 어플리케이션까지는
응용이 가능할것 같습니다. - 다만, uCOS-II가 더 낳지 않을까 생각합니다.

이런 프로세서가 타겟으로 하는 종류의 어플리케이션에서는 취향 문제가 더 크게 작용하게 마련입니다.
어떤 프로세서를 쓰더라도 다른 사람이 크게 관심을 가지지 않기 때문이죠

- 다음번에는 ZPU의 변형에 대해서 정리해보겠습니다.

Posted by GUNDAM_IM