ASIC SoC2011. 3. 8. 00:02

ZYNQ-7000



드디어 자이링스에서 ZYNQ-7000 디바이스 라인이 발표되었습니다.
다 아시는것 처럼 작년부터 계속  자이링스  내부적으로 나오네 마네로 알려진 디바이스입니다.
ARM-A9이 들어간 제품군이 준비되고 있다는 소문이었는데 드디어 이번에 나왔습니다.


800MHz급의 A9프로세서에  NEON FPU Architecture를 포함하고 있습니다. 그외에 다양한 IP를 포함하고 있으니
남은것은 유저의 Design을 쉽게 포함 시킬 수 있는 디자인 플랫폼을 제공하는 것입니다.

가장 중요한 것이 개발 플랫폼입니다. 
특히 Xilinx는 예전에 극악의 EDK를 발표한 전과(?)가 있어서 이번에는 기대가 됩니다.
최초의 EDK를 테스트 의뢰를 받아서 한적이 있는데 사용중에 잘못 연결했을때에 UNDO조차 안되는 플랫폼에  기절했었습니다.
그떄 이후 거의 사용할 생각을 안했었습니다.
이번에는 좋은 개발 플랫폼으로 잘 만들었기를 바랍니다.

FPGA에서 SoC로 가는 서비스

그리고 재미있는 포인트는 저렇게 만든 Platform을 SoC로 바꾸어 줄 수 있는 서비스를 제공하는가 입니다.
양산을 어떤 방법으로 지원할 것인가에 대한 것인데요,
 FPGA만으로 양산할 것인가 아니면 알테라의 하드 카피 같은 서비스를 지원하여
양산 가격을 가격을 낮출 수 있도록 해줄것인가 등등.. 이래저래 관전 포인트가 많습니다.

전례로 보면, Xilinx는 정책적으로 FPGA에만 올인하고 하드카피 서비스를 제공하지 않는 정책을 펴왔기 때문에 
당장 그렇게 쉽게 SoC로 가는 Service를 제공할 것 같지는 않습니다. EasyPath라는 서비스도 있지만 이는 Hardcopy와는 조금 틀리게 Test vector를 컨트롤해서 양산 단가를 조금 낮추는 기술입니다.

FPGA Traning Kit 솔루션 회사들...
   
저 디바이스가 나오면  사용할 사람들 중에서 관심을 가질만한 회사가 FPGA Traning Kit관련 솔루션을 제공하는 회사입니다.

   FPGA Traning Kit Solution 회사들은 좀더 재미있을것 같습니다. 그동안 여러가지 트레이닝 키트에 ARM을 연결하는 과정에서 매우 복잡하였습니다.  ARM에서 제공하는 CoreTile B/D를 연결하는 것이 일반적인 솔루션이었는데  그렇게 하여도 AHB와 AXI등의 연결에서 조금 실제와 틀린 부분이 있어서 고민을 하였습니다. 하지만 이제는 아예 대놓고 ARM이 FPGA에 들어간 상태이니 나머진는 어떤 방법으로 교육용 과정을 준비하는가만 고민하면 쉽게 됩니다.

  그만큼 만들기가 쉬워졌습니다.

  그러니 반대로 이야기한다면, 업체간에 변별력을 유지하기가 쉽지 않을 것으로 보입니다.
  타사와의 차이점을 제공하는 것은 결국 교육용 플랫폼으로서의 교보재 준비일것 같습니다.
  그외에는 S/W지원 수준이 문제가 되겠네요

  
가격은 ?
   이런 디바이스에게 가격을 묻는것은 실례곘죠 ?
   감히 어따 대고 가격을 묻는거야 ? 어따 대고 질문질이야 라는 말을 지금 하는것 같습니다
    그래도 그만큼 저렴하게 나와서 많이 사용해볼 수 있으면 합니다.

   ATMEL에서도 ARM9+FPGA 솔루션으로 만들어서 판적이 있는데 
   요새도 그 명목이 유지되는지는 모르겟습니다. 나올 때는 기대가 컸고 많이 사용하기를 바랬지만,  
    너무 저렴한게 유지(?) 하기 위해서 FPGA 용량을 많이 줄이는 바람에 가격도 성능도 어정쩡한 제품이 되어 버렸습니다.
    
   가격 정책을 발표한 자료를 보면 수량이 많다면 15불 밑으로도 가능합니다 라고 발표하고 있습니다.
   http://www.computertimes.co.kr/news/articleView.html?idxno=30556
   이정도 가격이면 엔트리 디바이스일테니 가장 낮은 성능 (용량)의 가격이겠고 실질적인 가격대는 좀더 두고봐야 하곘습니다. 
    당연한 이야기이지만,  가격 조건에서 수량이 많다면에 방점이 크게 찍힐것 같습니다.

기존의 프로세서랑 관계는
   가격이 15불이면 좋을것 같은데 또 그렇지도 않습니다.
   요새 하도 좋은 프로세서들이 저렴하게 시중에 돌아다니기 때문에 15불이면 일부에서는 비싸다는 소리를 들을 수 있겠습니다.

   그럼 그에 걸맞는 우수한 또는 고유한 성능의 엔진을 FPGA부에 넣어서 그만큼의 가치를 창출해야 하는데 
   FPGA 부에서 그정도의 부가가치를 창출할 만큼 큰 또는 우수한 성능을 넣을 수 있는가가 관건이 될 것 같습니다.
  
    요새 프로세서 성능이 하도 좋다보니까 
   단순한 Performance는 웬만큼 빠른 ARM으로도 즉 S/W로도 대치가능할 수 있습니다.
    어정쩡한 FPGA기능은 잘못하면 S/W에 먹힐 수 있는 위치에 존재합니다. 
    그만큼 요새 프로세서 기술이 발달되어 있습니다.
    SoC쟁이들도 먹고 살기 힘든 세상이 되었습니다. TT_TT + OTL
   
사실 일반 벤쳐에서 A9을 써서 28n급으로 디자인할 기회는 거의 없습니다.
그런 분이 계시다면 복받으신분입니다. 전생에 많은 음덕을 쌓으신분이나 가능합니다.
FAB비용과 다른 비용을 합치면 웬만한 회사 하나를 가뿐히 날리는 효과를 쉽게 얻을 수 있기 때문입니다. 
하지만, 간접적으로 나마 그런 기회를 가질 수 있다면
엔지니어로서는 좋은 기회가 되겠습니다.




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

Optimized Mapping  (0) 2011.05.20
2의 보수 곱셈과 Coner case  (0) 2011.04.04
나에게 프로세서란..  (0) 2011.03.01
Mac book Pro의 thunderbolt  (0) 2011.03.01
자이링스 세미나에서 회사 제품 전시..  (0) 2011.02.26
Posted by GUNDAM_IM
ASIC SoC2011. 3. 1. 21:08
애증이 남아 있는 분야이다. 

더 멋지게 만들 수 있었는데 그렇지 못한것에 대한 아쉬움이 남아 있는 물건
잘 만들어서 수천만명에게 재미 있는 물건이 될 수 있었는데 그렇게 안되어서 아쉬운 물건

컴파일러를 더 잘 만들고 포팅하고 싶었는데 못한  물건
멋진 IDE로 꾸며주고 싶었는데 안된 분야
우아한 O/S를 머리에 올려주고 싶었는데 오욕의 월계관을 쒸워주고 끝난 분야

이번에 다시 설계하게 되었다.

전에는 3년 했었던것 같은데 이번에는 2년 반 정도 하니까.. 

거의 10년만에 다시온 기회

잘 설계해서
어여쁜 IDE로 잘 치장해서
똘똘한 컴파일러를 잘 붙여서
스마트한 디버거를 잘 설계해서
우아한 O/S를 잘 붙여서

무엇보다 이번에는 스스로에게 미련이 남지 않게 잘 만들어 보고 싶다.
Posted by GUNDAM_IM
ASIC SoC2011. 3. 1. 13:21
이번에 새로 발표한 MACBook Pro의 Thunder bolt 컨트롤러입니다.


분해된 맥북 프로와


Thunderbolt controller입니다.
10G까지 지원한다는 환상의 I/O

자세한 스펙이 궁굼한데 아직 구할 수 가 없네요
일단 Package만 봐도 가격이 만만찮은 솔루션이 될 것 같네요 

인텔 관련 사이트는 아래 링크에서 확인 할 수 있습니다.

http://www.intel.com/technology/io/thunderbolt/index.htm

아래 사진은 인텔에서 광고한 그림입니다.


Posted by GUNDAM_IM
ASIC SoC2011. 2. 26. 08:51
자이링스 세미나에서 회사 제품을 전시했습니다.
관계자와 관련 회사 분들이 많이 도와주셔서 전시가 가능했습니다. 
요새 반응이 좋은 제품으로 전시하였습니다.


보드는 2대 전시
원래는 3대 전시해야 하는데 한대가 커스터머가 보안을 요구해서 전시를 못하였습니다.
그게 좀 아쉽긴 하지만, 비밀은 지켜주어야 하기 때문에.. 


사람들 볶작거리는 사진은 안찍었습니다.


자이링스 박경윤 이사님과 회사 전민근 상무님의 대담...

나중에 해외 전시회에 나갈 계획인데
미리 연습 삼아서 준비했습니다.

다른곳에 휴인스는 오랫동안 준비해와서인지 착착 준비물을 풀어놓고 세트를 만드는데
금새 근사한 전시 부스가 만들어지더군요.
그런 경험과 준비는 오랫동안 이루어진 것이라 쉽지 않겠습니다만, 
우리도 준비해야죠

막상 준비하여 보니 많은 준비 부족과 아쉬운점이 속출했습니다.
특히 다음에는 단순히 카메라로만 디피하지 말고 걸그룹으로 도배를 해야 하겠다는 생각이 들었습니다.
옆에 부스의 일본 형님들은 소녀시대와 카라로 계속 광고를 하니까 최소한 관심을 끌긴 하더군요

우리도 카라와 원더걸스다...

전시회에 참관이 아닌 참가로 나간것은 정말 오래간만이었습니다.


Posted by GUNDAM_IM
ASIC SoC2011. 2. 16. 12:55
http://www.veripool.org/wiki/verilator

항상 그렇듯이 Bug Fix가 이루어진 버전입니다.

VerilatorVerilator 3.811 Released

Wilson Snyder이(가) 약 4시간 전에 추가함

Verilator 3.811 2011/02/14

  • Report errors on duplicated or empty pins, bug321. [Christian Leber]
  • Report error on function call output tied to constant. [Bernard Deadman]
  • Throw UNUSED/UNDRIVEN only once per net in a parametrized module.
  • Fix internal error on functions called as SV tasks. [Bernard Deadman]
  • Fix internal error on non-inlined inout pins. [Jeff Winston]
  • Fix false BLKSEQ on non-unrolled for loop indexes. [Jeff Winston]
  • Fix block comment not separating identifiers, bug311. [Gene Sullivan]
  • Fix warnings to point to lowest net usage, not upper level ports.
  • Fix error on constants connected to outputs, bug323. [Christian Leber]
Posted by GUNDAM_IM
ASIC SoC2011. 2. 14. 21:11
최근에 FPGA로 칩을 양산하는 것에 대해서 생각을 해본것을 정리한다.

FPGA로 양산을 한다는 것은  여러가지 고려할 포인트가 있을 것이다.
- 여기에서는 양산 가격 및 볼륨등은 고려에서 제외한다. (회사의 판단에 따른 비밀스런 포인트.. ㅋㅋ)
- 그리고 두번째로는 Horizontal Market을 전제로 한다. 특정 회사에 필요한 솔루션이 아니라 
  시장에 필요한 솔루션임을 전제로 한다.

우선 당장 생각할 수 있는 장점은 진입 장벽에서는 최소한 NRE가 줄어든다는 장점은 존재한다.
Chip의 개발 비용이 수억에서 수십억으로 올라가는 마당에 FPGA는 그야 말로 새발의 피다.

하지만  양산 가격이라던가 우리회사가 FPGA에 부여 할 수 있는 기능의 가치 등등을 
다 검토해야 한다는 부분에서는 오히려 Chip보다 더 어렵다

무엇보다 문제는 FPGA의 특성상 Chip의 제작 비용이 전혀없는 상황이므로, 
진입장벽이 생각보다 많이 낮을 수 있기 때문이다.

그럼 생각해볼 수 있는 진입장벽은 어떤것이 있을까 ?
아래 그림을 보자


기술적인 레벨이 아주 낮으면 즉 위의 그림에서 녹색 선이되면 누구나 설계할 수 있는 제품이 된다.
이런 제품은 먼저 들어가서 팔고 나오는 시장에서나 가능하다. (혹은 아무도 주목하지 않는 시장이 가능하다.)

FPGA의 특성상 FAB의 NRE는 장벽이 존재하지 않기 때문에 결국 쉽게 먼저 설계하는 사람이 진입하지만, 
나중에는 누구나 다 뛰어드는 시장이 된다.

기술적인 레벨이 높다 못해서 FPGA의 물리적인 특성을 넘어서는 경우 
- 예를들어서 요구되는 사양에서 필요한 Memory B/W가 FPGA에서 사용 가능한
   Memory B/W를 초과하는 경우에는 위의 그림에서 보라색 선이 된다.

이 경우에는 물리적으로 안되기 때문에 FPGA의 그레이드를 높이거나 한치수 큰 FPGA를 선택 할 수 밖에는 없다.
즉 동일한 디바이스로는 누구도 설계/양산 할 수 없는 영역이 되는 것이다.

물리적 성능의 한계에 부딪치면 FPGA에 요구되는 성능을  낮추는 것이 또다른 선택이다. 
이 경우는 위의 그래프의 Physical Limitation을 올린다는 의미이다.  
요구 성능을 낮추면 상대적인  FPGA의 물리적 한계 또한 올라가기 때문이다.

위에서 검은색 선은 물리적 한계에 근접하는 성능을 발휘해야 하는 경우이다.
이 경우는 정말 좋은것이 설계 자체는 어렵고 힘들지만, 진입 장벽이 존재한다는 것이다.

전제 조건이 우리가 극한까지 활용해야 한다는 것이지만, 그렇게 했다는 전제 하에서는 
어중이 떠중이가 시장에 들어오는 것이 쉽지 않기 때문에 그 자체가 기술적 장벽이 된다.

위의 상황에서는 부수적으로 거둘수 있는 효과 중 하나는 엔지니어의 자존심 문제도 걸리게 된다.
생각해보라 옆에 회사는 다 만들어서 잘 동작하는데 우리가 동일한 디바이스에서 못한다는 것은 
결국 우리의 기술력이 낮다는 것을  인정해야 하는 상황이되는 것이다. 
즉 이전에는 FAB이 틀려서 공정이 틀려서 등등의 핑계가 있지만, 
이제는 같은 경기장에서 같은 무기를 들고 같은 조건으로 싸우는데 핑계가 안된다.

결국 FPGA에 의한 양산은 
    FPGA의 물리적 성능 파악과 
   회사가 할 수 있는 기술적인 레벨의 한계 
   그리고 시장에서의 진입 장벽 등을 다 파악하고 있어야
가능한 것이 FPGA에 의한 시장 진입이 된다.

FPGA에 의한 시장 진입은 생각할 펙터가 의외로 더 많이 존재하는 방안이다.


Posted by GUNDAM_IM
ASIC SoC2011. 2. 9. 07:36

Building the example


최상위 레벨에 Makefile을 가지고 있습니다. 이것을 이용해서 빌드합니다.
빌드 타겟은 아래와 같습니다.

make simulate  
         요건 ICARUS를 위해서 준비된 것입니다.
make verilate
         이것이 Verilator를 위해서 준비한 것입니다.
make clean
        

Command files


cf-baseline.scr을 이용해서 빌드합니다.

다음과 같이 커맨드라인에서 넣어서 진행합니다.

make simulate COMMAND_FILE=cf-baseline-5.scr

일단 위의 것을 실행하기 전에
먼저 해야 할 것이 몇개의 환경 변수를 정의하는 것입니다.

$BENCH_DIR
  ~/orp_soc/bench/verilog.
  을 가리키도록 정의되어야 합니다.

$RTL_DIR
   ~/orp_soc/rtl/verilog
   을 가리키도록 정의되어야 합니다.


$BENCH_LOCAL
   ~/orp_soc/local/bench/verilog
  를 가리키도록 정의합니다.

$RTL_LOCAL
  ~/opr_soc/local/rtl/verilog
  를 가리키도록 정의합니다.

set_env.sh 파일로 아래와 같이 정의하여 둡니다.

GUNDAM-NT:embecosm-esp5-or1k-verilator-1.0 kevinim$ source set_env.sh
export BENCH_DIR=orp_soc/bench/verilog
export RTL_DIR=orp_soc/rtl/verilog
export RTL_LOCAL=local/rtl/verilog
export BENCH_LOCAL=local/bench/verilog

(주) 폴더의 위치는 사용자마다 틀리므로 참고해서 재구성하시기 바랍니다.
(주) 절대 위치가 아니라 상대 위치로 해야 하며 앞뒤에 /가 빠져야 잘 구성됩니다.

사용은  
   source set_env.sh
로 합니다.

Additional Flags

  VFLAGS라는 변수를 통해서 verilator에 필요한 정보를 전달할 수 있습니다.
   용법은 다음과 같습니다.

make verilate VFLAGS=-trace
  타겟 어플인 Dhrystone은 반복해서 몇번 돌아서 그 값을 추출하는 프로그램입니다.
  반복의 회수를 미리 정의할 수 있다면 편리합니다. 다음과 같은 방법으로 정의합니다.

make verilate NUM_RUNS=100

Building Base Line Simulation



Command File

Baseline simulation을 위한 커맨드 라인은 아래 위치에 있습니다.

sim/cf-baseline.scr

이 파일은 주로 인자와 사용할 파일의 목록이 포함되어 있습니다.

우선 첫 부분에 있는 것은 헤더 디렉토리들의 목록입니다. 다음과 같이 선언되어 있습니다.

+incdir+$BENCH_LOCAL
+incdir+$BENCH_DIR
+incdir+$RTL_LOCAL
+incdir+$RTL_LOCAL/or1200
+incdir+$RTL_DIR/or1200
+incdir+$RTL_DIR/dbg_interface
+incdir+$RTL_DIR/audio
+incdir+$RTL_DIR/ethernet
+incdir+$RTL_DIR/ps2
+incdir+$RTL_DIR/uart16550
+incdir+$RTL_DIR/ssvga
      

timescale.v에 필요한 시뮬레이션 타임을 설정하는 정보가 있는데 문제는 이 파일이 여러군데에 존재할 수 있다는 점입니다. 그래서 $BENCH_DIR   에 있는 파일을 한번 참조하면 그 이후에는 해당 파일을 찾지 않습니다.

3개의 테스트 벤치 파일이 있습니다.
그중에 중요한 것은 ORPSoC Testbench와 l.nop를 지원하기 위한 모니터 모듈입니다.
위의 것은 아래에서 찾아 볼 수 있습니다.

$BENCH_LOCAL/orpsoc_bench.v
$BENCH_LOCAL/or1200_monitor.v
      
최상위 DUT 모델은    orpsoc_fpga_top 입니다. 버스에 대한 것도 인스턴스를 만들어 진행하므로
이에 대한 정보는 다음과 같은 파일들에서 찾아 볼 수 있습니다.

$RTL_LOCAL/orpsoc_fpga_top.v
$RTL_DIR/tc_top.v 
 

Running the baseline simulation

이제 길고도 길었던 설명이 정리되고 진짜 시뮬레이션을 해보는 시간이 왔다.
시뮬레이션은 다음과 같이 커맨드를 넣어서 진행합니다.

make simulate COMMAND_FILE=cf-baseline.scr NUM_RUNS=1000
이제 위의 코드대로 넣으면 시뮬레이션을 할 수 있습니다.

GUNDAM-NT:embecosm-esp5-or1k-verilator-1.0 kevinim$ make simulate COMMAND_FILE=cf-baseline.scr NUM_RUNS=1000
cd local/sw && make
cd utils   && make
gcc -o bin2c -O2 -Wall bin2c.c
gcc -o bin2srec -O2 -Wall bin2srec.c
gcc -o bin2flimg -O2 -Wall bin2flimg.c
gcc -o bin2hex -O2 -Wall bin2hex.c
cd support && make
or32-uclinux-gcc -mhard-div -O2 -c -o support.o support.c
make[2]: or32-uclinux-gcc: No such file or directory
make[2]: *** [support.o] Error 1
make[1]: *** [all] Error 2
make: *** [software] Error 2

흐.. 그러고 보니 OpenRISC용 컴파일러를 설치하지 않았습니다. 이것을 설치하고 다시 합니다.



위의 링크를 참조하여 설치한 뒤에 다시 시작합니다.
앞의 명령어를 넣으면 진행이 잘 될것 같은데 뜻밖의 오류가 발생합니다.

GUNDAM-NT:embecosm-esp5-or1k-verilator-1.0 kevinim$  make simulate COMMAND_FILE=cf-baseline.scr NUM_RUNS=1000
cd local/sw && make
cd utils   && make
make[2]: Nothing to be done for `all'.
cd support && make
or32-elf-gcc -I/opt/or32-elf/or32-elf/newlib-include -mhard-div -O2 -c -o support.o support.c
In file included from support.c:8:0:
support.h:45:20: error: macro "putc" requires 2 arguments, but only 1 given
support.h:45:6: error: 'putc' redeclared as different kind of symbol
make[2]: *** [support.o] Error 1
make[1]: *** [all] Error 2
make: *** [software] Error 2

putc가 따로 정의된 것이 있는데, 여기서는 시뮬레이션용으로 새롭게 만드는 것이라 인자가 틀리다는 내용입니다. 일단 해당 폴더로 이동해서
코드를 보면, 옵션에서 #ifdef등으로 처리되고 있는 것을 확인할 수 있습니다.
결과적으로 GCC를 빌드할 때 OR1K 옵션이 정의가 안되어 있어서
여기서 오류가 난것입니다. 뭐, 이제와서 돌아갈 수 는 없는일 강제로 여기서 고치도록 하겠습니다.
Makefile의 수정을 아래와 같이 합니다.

INC_PATH =  /opt/or32-elf/or32-elf/newlib-include
LOCAL_OPTION = ${INC_PATH} -DOR1K

이후 빌드 옵션에 아래와 같이 넣어줍니다.

...

support.o: support.c
        or32-elf-gcc ${LOCAL_OPTION}  -mhard-div -O2 -c -o $@ $?
....

그리고 빌드하면 잘 됩니다.

dhry 빌드

dhry를 빌드하게 되는데 여기서 또 오류가 발생합니다.

GUNDAM-NT:dhry kevinim$ make
or32-elf-ld -T ../support/orp.ld dhry-O0.o ../support/reset-nocache.o ../support/libsupport.a -o dhry-nocache-O0.or32
../support/libsupport.a(except.o): In function `_reset':
(.text+0x104): undefined reference to `_reset_except'
make: *** [dhry-nocache-O0] Error 1
...

통밥으로 보면 Reset_except는 reset을 받았을때 점프해가는 위치 즉 리셋 벡터를 의미합니다.
../support/reset.S 파일에서 reset exception 관련 루틴을 가지고 있으므로,
확인합니다.

....
        .section .stack
        .space 0x10000
_stack:

        .section .reset, "ax"

        .org    0x100
_reset_vector:
        l.nop
        l.nop
        l.addi  r2,r0,0x0
        l.addi  r3,r0,0x0
        l.addi  r4,r0,0x0
....

위의 코드를 보면 reset_vector에 연결되는데 여기에 넣어야 할 것 같습니다.
그래서 아래와 같이 수정합니다.

        .section .stack
        .space 0x10000
_stack:

        .section .reset, "ax"

        .org    0x100
        .global _reset_except
_reset_except:
_reset_vector:
        l.nop
        l.nop
        l.addi  r2,r0,0x0
        l.addi  r3,r0,0x0
        l.addi  r4,r0,0x0
.....

이후에 컴파일 하면 잘 됩니다.

최상위 폴더에서 다시 빌드하면 잘 되고 끝납니다.

GUNDAM-NT:embecosm-esp5-or1k-verilator-1.0 kevinim$ make simulate COMMAND_FILE=cf-baseline.scr NUM_RUNS=1000
cd local/sw && make
cd utils   && make
make[2]: Nothing to be done for `all'.
cd support && make
make[2]: Nothing to be done for `all'.
cd dhry    && make
or32-elf-ld -T ../support/orp.ld dhry-O0.o ../support/reset-nocache.o ../support/libsupport.a -o dhry-nocache-O0.or32
or32-elf-objcopy -O binary dhry-nocache-O0.or32 dhry-nocache-O0.bin
../utils/bin2hex dhry-nocache-O0.bin > dhry-nocache-O0.hex
or32-elf-ld -T ../support/orp.ld dhry-O2.o ../support/reset-nocache.o ../support/libsupport.a -o dhry-nocache-O2.or32
or32-elf-objcopy -O binary dhry-nocache-O2.or32 dhry-nocache-O2.bin
../utils/bin2hex dhry-nocache-O2.bin > dhry-nocache-O2.hex
or32-elf-ld -T ../support/orp.ld dhry-O2.o ../support/reset-icdc.o ../support/libsupport.a -o dhry-icdc-O2.or32
or32-elf-objcopy -O binary dhry-icdc-O2.or32 dhry-icdc-O2.bin
../utils/bin2hex dhry-icdc-O2.bin > dhry-icdc-O2.hex
cd sim/src && rm -f flash.in
cd sim/src && ln -s ../../local/sw/dhry/dhry-icdc-O2.hex flash.in
cd sim/run && time -p iverilog -c iv-processed.scr
/bin/sh: iverilog: command not found
real 0.09
user 0.00
sys 0.00
make: *** [simulate] Error 127
GUNDAM-NT:embecosm-esp5-or1k-verilator-1.0 kevinim$

제일 밑에 보면 iverilog등을 찾고 있는 것을 알수 있습니다.

http://www.embecosm.com/appnotes/ean6/html/ch03s08.html

을 보면

icarus로 한다면 simulate로 하고,
verilator로 한다면,

make verilate COMMAND_FILE=cf-baseline.scr NUM_RUNS=1000

커맨드로 해야 합니다.
위의 커맨드로 하면 다음과 같은 오류를 내고 멈춥니다.

GUNDAM-NT:embecosm-esp5-or1k-verilator-1.0 kevinim$ make verilate COMMAND_FILE=cf-baseline.scr NUM_RUNS=1000
cd local/sw && make
cd utils   && make
make[2]: Nothing to be done for `all'.
cd support && make
make[2]: Nothing to be done for `all'.
cd dhry    && make
or32-elf-ld -T ../support/orp.ld dhry-O0.o ../support/reset-nocache.o ../support/libsupport.a -o dhry-nocache-O0.or32
or32-elf-objcopy -O binary dhry-nocache-O0.or32 dhry-nocache-O0.bin
../utils/bin2hex dhry-nocache-O0.bin > dhry-nocache-O0.hex
or32-elf-ld -T ../support/orp.ld dhry-O2.o ../support/reset-nocache.o ../support/libsupport.a -o dhry-nocache-O2.or32
........
cd verilator-model && time -p make
......
verilator  -Mdir . -sc -f v-processed.scr
%Error: Need $SYSTEMC in environment
Probably System-C isn't installed, see http://www.systemc.org
%Error: Command Failed verilator_bin -Mdir . -sc -f v-processed.scr
make[1]: *** [Vorpsoc_fpga_top.mk] Error 10
real 3.43
user 0.07
sys 0.05
make: *** [model] Error 2
...


위의 오류는 systemc환경 변수를 설정 하지 않아서 생긴 문제입니다.
필요로 하는 systemc환경 변수는 아래와 같습니다.

export SYSTEMC=/Library/SystemC/systemc-2.2.0/

로 하고 실행하면 다음과 같은 오류가 또 발생합니다.

..
GUNDAM-NT:embecosm-esp5-or1k-verilator-1.0 kevinim$ make verilate COMMAND_FILE=cf-baseline.scr NUM_RUNS=1000
........
cd sim/src && ln -s ../../local/sw/dhry/dhry-icdc-O2.hex flash.in
cd verilator-model && time -p make
Makefile:121: OrpsocAccess.d: No such file or directory
Makefile:121: TraceSC.d: No such file or directory
Makefile:122: Vorpsoc_fpga_top__ALLcls.d: No such file or directory
Makefile:122: Vorpsoc_fpga_top__ALLsup.d: No such file or directory
Makefile:122: Vorpsoc_fpga_top__ver.d: No such file or directory
...

일단 오류의 원인을 확인해 보도록 하지요 TT_TT

디버깅 할 때 제일 먼저 고쳐야 할 것은
(1) 제일 먼저 나타나는 오류부터 수정합니다.  그것 때문에 그 오류 밑에서 나타나는 오류는 연쇄적인 오류가 많기 때문입니다.
(2) 알려진 오류 부터 수정합니다.
     잘 알고 있는 그리고 잘 알려진 오류가 대부분 또 발생합니다. 그래서 그것 부터 수정해나가면 빠릅니다.

이 경우 잘 알려진 (홈피에 있는) 오류부터 수정해 보도록 하겠습니다.

...
verilator  -Mdir . -sc -f v-processed.scr
%Error: ../orp_soc/rtl/verilog/mem_if/flash_top.v:210: syntax error, unexpected ')'
%Error: ../orp_soc/rtl/verilog/mem_if/sram_top.v:236: syntax error, unexpected ')'
...

verilog 파일 내에서 지원하지 않는 문법으로 발생된 오류입니다.

해당 위치에 가면 아래와 같은 코드를 볼 수 있습니다.
...
// synopsys translate_off
integer fflash;
initial fflash = $fopen("flash.log");
...

두가지 해결책이 있는데 하나는 아래와 같이 코드를 고치는 것입니다.

initial fflash = $fopen("flash.log", "w");
또하나는 이것보다 단순한 Flash Model로 바꾸는 것입니다.
해당 모델은

$RTL_LOCAL/mem_if/flash_top.v
에 있습니다. 이것을 컴파일 하도록 cf-baseline.scr을 수정하는 것입니다.
여기서는 후자로 가보도록 하겠습니다.

...// RTL files (mem_if)
//$RTL_DIR/mem_if/flash_top.v
$RTL_LOCAL/mem_if/flash_top.v
...
위와 같이 cf-baseline.scr을 수정한 후에 다시 컴파일 해 봅니다.
 
그러면 위의 오류는 없어지고 다음 오류를 볼 수 있습니다.

..
%Error: ../orp_soc/rtl/verilog/mem_if/sram_top.v:236: syntax error, unexpected ')'
..

같은 오류이니 같은 방법으로 수정합니다.

그 다음 오류는 아래와 같습니다.
...
%Error: ../orp_soc/rtl/verilog/ethernet/eth_wishbone.v:564: Unexpected "do": "do" is a SystemVerilog keyword misused as an identifier
...

키워드를 변수로 썻기 때문에 발생한 오류입니다.
쉬운 해결법은 변수 이름을 바꾸거나
아니면 verilog 버전 지원 옵션을 사용하는 것입니다.
후자의 방법으로 한다면 다음과 같이 옵션을 바꿉니다.

 make verilate COMMAND_FILE=cf-baseline.scr VFLAGS="-Wno-lint -language 1364-2001"

language 옵션이 그에 해당하는 옵션입니다. 이제 컴 파일 해보면 ...
warning이 많이 발생하면서 진행하고 끝납니다.

...
%Warning-COMBDLY: ../orp_soc/rtl/verilog/ps2/ps2_keyboard.v:353: Delayed assignments (<=) in non-clocked (non flop or latch) blocks should be non-delayed assignments (=).
%Warning-COMBDLY: ../orp_soc/rtl/verilog/ps2/ps2_keyboard.v:355: Delayed assignments (<=) in non-clocked (non flop or latch) blocks should be non-delayed assignments (=).
%Warning-COMBDLY: ../orp_soc/rtl/verilog/ps2/ps2_keyboard.v:360: Delayed assignments (<=) in non-clocked (non flop or latch) blocks should be non-delayed assignments (=).
...

대부분의 경고가 위와 같은 구문인데 확인을 해보변

...
 ps2_data_hi_z <= #1 0;
...

즉 타임 딜레이를 먹이고 있는데 이를 처리할 수 없다는 오류입니다.
CBS의 숙명이죠.. 그냥 패스
이 경고 메시지가 싫다면 다음과 같이 옵션을 추가합니다.

-Wno-COMBDLY 
그러면 다음과 같이 되는데 결과적으로 해당 오류 메시지를 덤프하지 않습니다.

 make verilate COMMAND_FILE=cf-baseline.scr VFLAGS="-Wno-lint -language 1364-2001 -Wno-COMBDLY "

같은 방식으로 나타나는 오류인
...
%Warning-UNOPTFLAT: Use "/* verilator lint_off UNOPTFLAT */" and lint_on around source to disable this message.
%Warning-UNOPTFLAT:      Example path: ../orp_soc/rtl/verilog/ps2/ps2_top.v:145:  TOP->v.ps2_top.rx_kbd_data_ready
%Warning-UNOPTFLAT:      Example path: ../orp_soc/rtl/verilog/ps2/ps2_translation_table.v:289:  ASSIGNW
%
...

위의 경고 메시지도 다음과 같은 옵션을 넣어서 없앨 수 있습니다.

-Wno-UNOPTFLAT
그러면 최종적으로 다음과 같이 나옵니다.

make verilate COMMAND_FILE=cf-baseline.scr VFLAGS="-Wno-lint -language 1364-2001 -Wno-COMBDLY -Wno-UNOPTFLAT "

위의 커맨드를 다시 실행하면
아래와 같은 오류 메시지가 나옵니다.

...
Vorpsoc_fpga_top.h:12:26: error: verilated_sc.h: No such file or directory
Vorpsoc_fpga_top.h:13:23: error: verilated.h: No such file or directory
...

Header File을 찾을 수 없다는 것입니다.
compile option에서 추가되지 않아서 그런것으로 보입니다.

이것은 환경 변수인 VERILATOR_ROOT을 설정해서 맞추어야 합니다.
.bashrc  파일에 다음 변수를 추가합니다.

export VERILATOR_ROOT=/Users/kevinim/Documents/Verilator/verilator-3.804

이후에 source 하고 다시 컴파일하면 아래와 같은 오류 메시지가 나타납니다.

....
OrpsocAccess.cpp:32:41: error: Vorpsoc_fpga_top_or1200_cpu.h: No such file or directory
OrpsocAccess.cpp:33:42: error: Vorpsoc_fpga_top_or1200_ctrl.h: No such file or directory
OrpsocAccess.cpp:34:40: error: Vorpsoc_fpga_top_or1200_rf.h: No such file or directory
OrpsocAccess.cpp:35:51: error: Vorpsoc_fpga_top_or1200_rfram_generic.h: No such file or directory
OrpsocAccess.cpp:36:41: error: Vorpsoc_fpga_top_or1200_top.h: No such file or directory
OrpsocAccess.cpp:37:46: error: Vorpsoc_fpga_top_orpsoc_fpga_top.h: No such file or directory
...
거의다 온 느낌이지만, 하여튼 오류는 죽어라나 나오는 군요


Posted by GUNDAM_IM
ASIC SoC2011. 1. 22. 16:01
현재 개발중인 SoC용 ProtoType Board FPGA  보드입니다.

Virtex-6중 구할 수 있는것 중 가장 크고 빠른것을 사용했습니다.
그레이드가 낮으면 나중에 P&R이 잘 안되어서 불필요하게 시간을 까먹기 때문에 미리 미리 빠른것으로 주문하였습니다.  그레이드가 높아질 수록 많이 비싸지지만, 인건비 생각하면 이 방식이 더 저렴하고(?) 효율적입니다.

당장의 손익계산서 때문에 선택을 잘못하면 나중에 반드시 누군가가 고생하게 되어 있더군요

작은 불꽃(?) 쇼가 있었지만,  한방에 동작중이니. 다행입니다.

보드가 A4 두장보다 더 커서 iPhone으로 찍으면 잘 안나오네요
나중에 다시 잘 찍어서 정리하고,이번에는 패스...

보드의 Layer나  사이즈에 제한을 받지않고 만들 수 있어서 다행입니다.

그동안 보드 노우하우가 쌓여서 이젠 이정도 보드는 2년차 직원이 해도 금방 하네요.
그만큼 울회사 교육이 빡셀런지도 모르겠습니다만, 하여튼 수고하셨습니다.
( 이 멘트는 검심의 스승 히코 세이쥬로를 연상케하는 멘트입니다. 다 나의 강하고 완벽한 트레이닝이 너를 성장시켰다는 ㅋㅋ)

사용자 삽입 이미지

Posted by GUNDAM_IM
ASIC SoC2010. 12. 23. 10:42
Module hierarchy and file organization

Distribution code organization

RTL 코드의 계층 구조는 아래와 같습니다.
사용자 삽입 이미지
기본 계층 구조는 ORPSOC에서 시작합니다. 테스트를 위한 패스는 ORPSOC_FPGA_TOP을 기준으로 시작합니다.
각각의 IP를 연결하는 BUS Connection은 tcop_top이고 나머지는 이름을 기준으로 유추하여 볼 수 있습니다.

testbench의 코드를 보면 탑레벨 module의 이름은  orpsoc 입니다.
그리고 앞서 설명한 l.nop명령어들의 동작을 반영하는 것이 or1200_monitor 모듈입니다.

Verilator model에서는 이러한 기능은 SystemC 모델로 제공됩니다.

이 강의에서 사용되는 모든 파일은 tar  파일로 제공됩니다만,
필요하면 opencore.org 에서 새로 받아서 사용할 수 있습니다. 이 경우에는 필요한 몇개 파일을 수정해야
합니다.

tar 파일은 아래 링크에서 다운 받을 수 있습니다.

http://www.embecosm.com/download/esp5.html

Distribution code organization


tar 파일을 풀면 몇개의 폴더가 보이게 됩니다.
그 구조는 아래와 같습니다.

Top level directory
    - Makefile
        main 프로젝트 파일입니다. verilator를 이용해서 프로젝트를 빌드 할 수 있도록 해 줍니다.
    - Testbench file
        orpsocmain.cpp , orpsocmain.h
        verilator를 위한 테스트 벤치 파일입니다.
        자세한 설명은 다음에 하기로 하고
        여기서는 그냥 이런 파일들이 Top Folder에 있다는 것만 알고 있으면됩니다.

orp_soc
     현재 ORPSoC 버전이 들어가 있습니다.
     이것은 www.opencores.org에서 구할 수 있는것과 같습니다.

local
     orp_soc의 shadow 폴더입니다. local로 수정할 파일을 이곳에 두게 됩니다.
     그리고 PATH변수에 의해서 Search 순서를 지정하여 두었기 때문에 이곳에서 바꾸게 됩니다.

sim
    icarus 시뮬레이터용 스크립트가 들어 있는 폴더입니다.
    *.scr  파일이 이 폴더 입니다.

sysc_modules
    systemc로 작성된 모듈들이 있으며, 이 모듈들은 테스트 벤치를 구성하는 일부 입니다.
    or1200monitorSC와  ResetSC가 들어 있습니다.

verilator-model
    이 폴더에는  verilator에서 사용하는 커맨드 파일과
    verilator model 내부의 시그널을 볼 수 있는 OrpsocAccess  가 있습니다.
    

Original ORPSoC Source code organization


  원래의 orpsoc의 소스 트리 구조는 orp_soc 폴더에서 찾아 볼 수 있습니다.
 
bench
   테스트 벤치 코드입니다.
   서브 디렉토리로 verilog를 가지고 있고 (사실 이것밖에 없습니다.) 이 폴더 내에 ORPSoC를 위한
    Verilog Code를 가지고 있습니다.  
    일단 두개의 헤더 파일을 찾아 볼 수 있습니다.
    bench_defines.v
      `define 들이 들어 있습니다.
    timescale.v
      `timescale에 대한 정의가 있습니다.

doc
   당연히 문서가 모여 있습니다.

rtl
   ORPSoC의 verilog code가 있습니다.

sw
   타겟 소프트웨어 입니다.
   이 코드들은 컴파일 되어서 내부의 Flash memory에 올려져서 운용됩니다.
   utils  폴더에 있는 파일들을 먼저 빌드해야 합니다.
   이 후에 support 파일을 빌드합니다.
   나머진 필요할 때 순서에 상관 없이 빌드하면 됩니다.


Modifications to the ORPSoC source code


local 폴더에는 앞서 설명하대로
원래의 코드를 수정하지 않고 이쪽에서 수정할 수 있도록 해주는 파일을 모아두었습니다.
그리고 PATH 순서를 바꾸어서 이쪽 파일들이 먼저  선택되도록 하였습니다.

(1) bench/verilog/bench_defines.v.
        half clock을 50nS로 정의해서 전체 동작을 10MHz로 되도록 만들어 두었습니다.

원래는 아래와 같이 되어 있지만 local  폴더에서 수정되어 있습니다.
........
//
// OR1200 clock mode
//
`ifdef OR1200_CLMODE_1TO2
`define CLK2_HALFPERIOD 25
`else
`ifdef OR1200_CLMODE_1TO4
Unsuppported
`else                  
`define CLK2_HALFPERIOD 50
`endif
`endif
..........

local 폴더의 bench_defines.v 파일은 아래와 같습니다.

.....
//
// Clock half period for simulation (10MHz)
//
`define BENCH_CLK_HALFPERIOD 50
....



(2) bench/verilog/or1200_monitor.v
   여러차례 설명한 l.nop xxxx 명령어로 내부 정보를 얻어내는 기능을 넣어둔 파일입니다.
   내부에 코드를 보면 쉽게 알 수 있습니다.

(3) bench/verilog/orpsoc_bench.v
    원래의 코드는 bench/verilog/xess_top.v 입니다.
   이 파일은 xilinx용 top 파일입니다.
   이 코드를 wrapping 하여서 ORPSOC용으로 테스트 벤치를 구성한 것이 이 파일 입니다.

(4) rtl/verilog/orpsoc_fpga_top.v
    Top 레벨의 FPGA 모델입니다.
    ORPSoC의 FPGA Top 파일이됩니다.

(5) rtl/verilog/orpsoc_fpga_defines.v
     rtl/verilog/xsv_fpga_defines.v를 다시 정의한 것입니다.
      주요한 내용은 주로
      `define TARGET_VIRTEX
    을 제거하여서 자이링스용 라이브러리를 사용하지 않도록 막아둔 것입니다.

(6) rtl/verilog/or1200_defines.v
    현재 사용하는 형태로 적합하도록 프로세서의 내용을 다시 설정하였습니다.
    주로 캐쉬나 MMU의 사용 여부를 설정하는데 사용합니다.
    그리고 나눗셈기등의 사용 여부를 결정합니다.

(7) rtl/verilog/ssvga/ssvga_fifo.v
         rtl/verilog/ssvga/ssvga_top.v
         rtl/verilog/ssvga/ssvga_dpram_4x8x16.v
         rtl/verilog/ssvga/ssvga_dpram_4x16x16.v
 
     ORPSoC 내에서 사용되는 메모리 블럭등에 대한 정의를 합니다.

Posted by GUNDAM_IM
ASIC SoC2010. 12. 2. 15:37

The Example Design



 

Memory Map

 
사용자 삽입 이미지

 메모리 맵은 위와 같습니니다.
 Instruction Memory (ROM)은 0x0400_0000에 위치합니다.
 부팅시에 부팅 코드를 SRAM으로 카피하고 움직이게 됩니다.

 Interrupt Assignments

 
 OpenRISC 1000은 프로그래머블한 인터럽트 코아를 가지고 있고, 외부에서 20개의 인터럽트를 연결할 수 있습니다. 그중에서 사용하는 인터럽트는 아래와 같이 배치되어 있습니다.

사용자 삽입 이미지

Test Bench Modeling of Peripherals


Peripherals들은 모델링이 되어 있지 않습니다
외부 포트들은 모두 적당한 값으로 매핑되어 둡니다.

ORPSoC의 트래킹은 OpenRISC 100의 l.nop 명령어를 활용하여서 내부 정보를 얻어냅니다.
l.nop 명령은 immediate 값을 가질 수 있는데 이 값에 적당한 값을 할당 함으로서 원하는 동작을 수행합니다.

여기서 사용하는 방식은 아래 테이블에 정리되어 있다.

사용자 삽입 이미지
 다른 l.nop의 인자는 모두 무시합니다.
 testbench 구현은 이 새로운 l.nop 명령을 활용하여 구현하게 됩니다.
 

Test Software Application


Test Application은 Dhrystone 2.1 벤치마크 프로그램을 활용합니다.
앞서 설명한 n.lop 명령을 활용하여 라이브러리 중 일부룰 수정하여서 필요한 정보를 프린트하거나 얻게 됩니다.

OpenRISC 1000의 l.nop 명령어 사용하기

앞서 설명했듯이 l.nop명령은 16비트의 immediate 값을 가지고 움직입니다.
이 값은 CPU에서는 무시되지만, 테스트 벤치에 의해서 모니터링 되고 사용됩니다.
이 ORPSoC에서는 이것을 이용해서 I/O를 제공하고, C Code가 운용될 때 내부 정보를 얻을 수 있는 컨트롤 함수의 기능을 구현하는 활용합니다.

l.nop 1  : 32'h1500_0001
    GPR3에 있는 값을 리턴코드로 하여 프로그램을 끝냅니다.
    C Lib 함수는 다음과 같이 구현됩니다.

void exit (int i)
{
  asm("l.add r3,r0,%0": : "r" (i));
  asm("l.nop %0": :"K" (NOP_EXIT));
  while (1);
}



l.nop 2  : 32'h1500_0002
    GPR 3의 값을  Hex로 덤프하여 줍니다.

l.nop 3  : 32'h1500_0003
    printf을 지원해 주지만 아직까지는 제대로 구현이 안되어 있다.

l.nop 4  : 32'h1500_0004
    LSB를 Character로 프린트 해줍니다.
    PUTC를 구현하는 것은 아래와 같습니다.

void putc(int value)
{
  asm("l.addi\tr3,%0,0": :"r" (value));
  asm("l.nop %0": :"K" (NOP_PUTC));
}
	  
   이것을 이용해서 나중에 printf등을 구현할 수 있을 겁니다.




Posted by GUNDAM_IM