Books2011. 2. 26. 08:13

폴 부처 지음

"개발에도 정석이 있다면 디버깅에도 정석이 있다." 라는 관점에서 지어진 책이다. 

이 책은 실용주의라는 것으로 포장되어 있어서 구입을 했지만 (그런면에서는 나도 참 낚시질에 많이 당하는 편이다.)
실용주의라는 것 보다는 원칙주의에 가깝다. 원리 원칙에 맞는 디버깅을 해야 한다는 것을 강조하고 그에 관해서
원리 원칙대로의 접근법을 설명하고 있다.

디버깅 툴을 이렇게 써야 되요라고 하지 않고 
디버깅은 이런 정신 상태로 해야 해요 라고 설명하는 책인 것이다.

문제의 핵심
큰 그림
디버깅 비급

3부분으로 나누어서 설명하며,

제일 먼저 나오는 1부 문제의 핵심은  디버깅이 필요한 즉 버그가 있는 포인트를 찾아들어가는 방법과 원칙을 설명한다.
2부 큰 그림에서는  개발 조직내와 개발 조직 외부와의  의사소통과 개발에 대한 회사 정책을 다룬다. 
3부 디버깅 비급에서는 오랫동안의 경험에 따른 다양한 디버깅 방법론을 설명하고 있다.  
설명을 단순한 디버깅 방법론이라고 하였지만,  디버깅 정책이라던가 개발방법론과 엮어서 설명하고
회사나 팀의 운영 정책과 연관지어서 설명하기 때문에 전체를 볼 수 있는 시각을 기를 수 있다.

사실 디버깅은 개발자라면 누구가 부딪치는 숙명적인 문제이기 때문에
누구나 자신만의 노우하우를 가지고 수행한다.
결국 자신의 노우하우가  되고, 코딩시에 가이드까지 , 결국에는 설계시에 가이드 까지 제시해준다면
그것이야 말로 자신만의 규화보전이 될 것이다.

이 책은 저자가 자신의 경험을 바탕으로 만든 규화보전에 가까운 책이다.
다만, 어느정도 궤도에 오른 사람이 본다면,  정석적인 말을 나열한다고 느낄 수 있다.
바둑을 제외하고는 정석을 지키기 힘들기 때문에 정석일 수 있다. 

초보자나 중급자가 보고 디버깅에 관한 내용을 배우기에 좋은 책이다.
Posted by GUNDAM_IM
Hobby2011. 2. 25. 22:14
와우가 대격변을 시작했습니다.

이제 그동안 접었던 와우의 세계로 다시 들어갑니다.
하이잘에서 늑대족으로 시작을 했습니다.


2년만에 들어온 와우라 아직 낮서네요
가방 준다던 친구녀석은 테라로 가버리고 
쓸쓸히 와우을 혼자 하고 있습니다.


'Hobby' 카테고리의 다른 글

드디어 와우를 그만두기로...  (2) 2011.06.13
타이페이 공항에서 본 건담  (0) 2011.04.24
동인 게임 - 인테르메디오 프레스토  (0) 2010.07.25
TRON Legacy  (0) 2010.04.07
AileStrike GUNDAM 실사판 합성  (2) 2010.03.17
Posted by GUNDAM_IM
MAC Life2011. 2. 22. 08:51
최근까지는 데모를 멤버들이 하고 저는 뒤에서 딩가 딩가하는 역활이었습니다.
하지만 이제 멤버들이 모두 플젝에 투입되어서 데모를 제가 직접 하러 다녀야 하는 불상사가 발생되었네요 TT_TT

데모야 간단한데 문제는 Serial 포트로 컨트롤 하고 있기 때문에
데모하러 갈때 맥북 프로랑 PC NoteBook을 들고 다녀야 하는 사태가 발생했습니다.

그래서 맥북에 USB Serial 변환기를 연결해서 컨트롤 할 수 있도록 만들었습니다.
사용은 간단합니다.

아래 파일을 다운 받아서 맥북에 설치하고


연결하면 끝입니다.

사용은 여러가지 프로그램이 있지만 터미널에서 사용한다면

ls /dev/tty.*
을 입력하면 됩니다.

그러면 아래와 같이 디바이스 리스트가 쭈욱 뜹니다.

GUNDAM-NT:~ kevinim$ ls /dev/tty.*
/dev/tty.Bluetooth-Modem         /dev/tty.KevinImiPhone-Wirelessi
/dev/tty.Bluetooth-PDA-Sync      /dev/tty.usbserial-000014FA

일단 Serial 변환기 이름이 나타난 디바이스를 선택해서 포트를 열면 됩니다.

screen /dev/tty.usbserial-000014FA 115200

으로 열면 실행하는데는 문제 없습니다.

ZTERM이라는 어플로도 간단하게 연결할 수 있습니다.

http://homepage.mac.com/dalverson/zterm/

에서 다운받아서 설치하면 됩니다.


아래와 같이 설정한 뒤에 포트를 연결하면 됩니다.



최종 화면은 아래와 같습니다.

EZLinux B/D에 연결한 것입니다.






Posted by GUNDAM_IM
Books2011. 2. 20. 16:47

소프트웨어 개발의 모든것.
김 익환, 전 규현 지음

2008년에 1판이 나오고 2010년에 개정판이 나왔다.

이책은 얼마전에 읽은 글로벌 소프트웨어를 꿈꾸다.  의 전편에 해당하는 책이다.
즉 읽은 순서가 반대로 되어 있다. 

글로벌 소프트웨어를 꿈꾸다보다는 좀더 직접적이고 상세한 내용을 기술하고 있다.

당연히 저자는 김익환 님이며, 관련 분야에 오랬동안 근무한 경험을 바탕으로 책을 지었다.

책은 크게 두개의 파트로 나누어지는데
전반부는 소프트웨어 개발의 기초와
후반부는  소프트웨어 개발을 성공으로 이끄는 법
으로 나누어진다.

개발의 기초에 해당하는 것은 
- 이슈 관리와 버그 관리, 코드 관리 등의 기반 시스템을 논하고 있고
- 조직과
- 그러한 조직을 운영할 수 있는 개발 방법과 프로세스를 설정하는 것이 필요하다.


그외에는 회사에 대한 이야기로
사람과 문화에 대해서 이야기한다.

사람과 문화는 사실 개발의 기초 중에 기초이지만 쉽게 변경이 안되는 부분이다. 
아무리 좋은 시스템도 사람들이 진심으로 받아들이지 않고 운영되지 않으면 
없는것과 같거나 없느니만 못한 시스템이 되기 때문이다.

소프트웨어 개발을 성공으로 이끄는 법 을 설명하는 후반부에서는
개발 프로세스를 주로 설명하고 있다. 
개발 프로세서는 
  - 제품의 라이프 사이클과
  - 개발 단계별 계획
 - 프로젝트 활동 관리
등을 포커스를 두어서 설명한다.

특히 이 책에서 가장 중요하게 강조하는 것은 SRS 즉 Software Requirement Specification 이다.
개발의 근간이 되는 문서이며 프로젝트의 근간이 되는 문서이다.
프로젝트의 모든 의사소통과 결정은 이 문서에 기반하여 결정되고 운영된다.

수많은 문서를 만들어도 최신 버전과 일치하지 않으면 소용이 없다. 
따라서 반드시 이 문서만큼은 최신 버전과 일치시켜 가면서
개발하는 것을 주장하고 있다. 

이 책은 과연 다른 회사들은 어떻게 개발하고 관리하고 있는가에 대한 궁굼증으로 시작해서 구매한 책이다.
우리회사는 H/W를 설계하는 회사이지만 개발회사라는 점에서 같기 때문에 읽기 시작하였다.
H/W와 S/W의 몇가지 차이점을 생각하면서 읽으면 도움이 된다.

책에서는 개발 시스템이 근간이 된다고 표현했지만 
그것보다 더  근간이 되는 것은 멤버들의 자발적인 참여와 의지이다. 
얼마나 멤버들의 자발적 동의를 받아서 진행하는 문화인가가 핵심이된다.
아무리 좋은 시스템도 멤버들의 자발적인 참여 없이는 의미가 없게 된다. 

2010년에 개정판을 만들어낼 정도로 저자들은 새로운 트랜드에 맞추어서 설명하도록 노력하고 있다.
그리고,  이 책은 처음부터 끝까지 쭈욱 연결되어 읽어가는 책이 아니라 중요한 이슈에 대해서 참조를 위해 읽어가는 책이다.
중요한 포인트에 대해서 그때 그때 읽어가는 Reference 이다.

물론 한두권의 책을 읽었다고 해서 다른 회사가 어떤 형태로 개발해 가는지 알 수 있는 것은 아니지만, 아직도 다른 회사들은 어떤 강점을 가지고 개발을 진행하고 있을까 역시 읽어도 궁굼해진다.

--------------
이 책에 대한 새로운 시각의 글이 있습니다.
나름대로 제가 놓친 부분에 대한 의견도 있어서 링크를 걸어 둡니다.


'Books' 카테고리의 다른 글

소리바다는 왜?  (0) 2011.02.27
실용주의 디버깅  (2) 2011.02.26
아빠와 떠나는 유럽 미술 여행  (0) 2011.02.20
디퍼런트 - 넘버원을 넘어 온리 원으로~  (0) 2011.02.16
인상파, 파리를 그리다.  (0) 2011.02.04
Posted by GUNDAM_IM
Books2011. 2. 20. 16:34

  "아빠와 떠나는 유럽 미술 여행"

  저자는 40일동안 아들을 데리고 유럽을 한바퀴 돕니다.
  40일이면 어느정도의 시간이냐 하면 애기를 데리고 유럽을 한바퀴 돌면서 전시회나 박물관을 두루 돌아볼 수 있는 시간인것이 이 책에서 확인할 수 있었습니다.

저자는 아들과 함께 그리고 책에서는 자주 등장하는 편이지만, 얼굴은 거의 안보이는 후배와 함께 40일간 유럽을 돌면서
아들에게 유럽의 미술을 설명합니다. 
따라서 아버지의 관점에서 아들에게 유럽 미술을 계속 설명하고 있습니다. 

유럽 미술사야 뭐 다른 책에서도 많이 읽을 수 있으니 
이 책이 가지는 의미는 아들 (자식)을 데리고 유럽을 이런 코스로 여행할 수 있다는 점과
아이들에게 미술 그림을 설명할 수 있는 방법을 알려준다고 할 수 있습니다.

그리고 여행 코스에서 미처 생각못하였던 중요 포인트를 미리 체크해 볼 수 있습니다.
- 단기간의 여행은 애기들과 다녀오지만 40일이라는 초장기간 여행은 애기들도 저도 쉽지 않은 도전이 될 것 같습니다.

무엇보다 저도 애들이 좀 크면 한달 정도 유럽 여행하면서 미술사를 이야기하고 싶은데 딱 이책이 저보다 먼저 (한 5년 먼저 ??)
했다는 점에서 앞서 진행한 분의 내공이 궁굼하여 구매해서 읽어보았습니다.
- 미술사에 대한 내공이야 당연히 엄청난 분인듯.. 

그리고 책의 말미에서 아들이 자신이 본 내용을 따로 정리한것을 보여주었습니다.
그정도면 이 여행의 목적을 달성했다고 생각하기에 충분한 것 같습니다.

미술품을 본 감성은 표현되는 것이 아니라 녹아들어가는 것이기 때문에, 
아이에게 녹아들어갔다는 것만으로도 행복해질 수 있는 책입니다. 

'Books' 카테고리의 다른 글

실용주의 디버깅  (2) 2011.02.26
소프트웨어 개발의 모든것.  (0) 2011.02.20
디퍼런트 - 넘버원을 넘어 온리 원으로~  (0) 2011.02.16
인상파, 파리를 그리다.  (0) 2011.02.04
글로벌 소프트웨어를 꿈꾸다.  (0) 2011.02.02
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
Books2011. 2. 16. 09:35


이 책은 저자의 화려한 경력과 YES24에서의 화려한 타이틀 페이지를 차지한 만큼 뭔가 기대감을 가지고 읽기 시작한 책이지만, 
중간쯤 부터는 지루해지는 책입니다.

프로덕트의 카테고리등을 세분화시켜서 나누어 갈수록 결국 차별화가 어려워진다는 관점에서 이야기를 출발합니다.
이의 부작용으로 구매층 (소비자) 역시 제품의 브랜드에 대한 충성도가 낮아지고  제품별로 상이한 자세(관점)을 취하게 되므로
이를 어떠한 방법으로 넘어갈 것인가를 설명하고 있습니다.

책 자체는 딱딱한 마케팅 서적으로서 설명되지 않고, 
에세이집에 가까운 구어체 느낌으로 적어가고 있습니다. 그래서 읽기가 아주 쉽게 되어 있다는 점이 장점입니다.

역브랜드라던가 소비층의 세분화 개념등은 다른 책에서도 다른 형태로 설명하고 있기 떄문에 
새롭다고 볼 수 없고 결론도 충분히 예측할 수 있는 형태로 차별화가 중요하다 정도로 마무리 되는것도
약간 식상했습니다.

다만 새로운 요소를 설명하기 보다는 기존에 마케팅 서적에서 설명한 내용을 차례로 좀더 세분화시키는 것에 주안점을  둔것과 설명을 주변에서 쉽게 찾을 수있는것에 매칭시켰다는 점에서 이해가 쉬웠다는 것은 장점이 되겠습니다. 
어쩌면 이런 설명이 더 어려울 수 있다는 점은 동의합니다. 쉽게 읽히는 책일 수록 저자는 그만큼 고민하였을테니까요.

재미있는 마케팅의 성공 례로 소니 아이보를 들고 있습니다.
소니 아이보는 가정용 로봇이 아니라 사이버 애완견으로서의 포지셔닝을 한 덕에 부족한 기능이 오히려 사랑스러운 관점으로
자리 잡을 수 있도록 포지셔닝 했다는 것입니다.

 암튼 전반적인 내용에서는 광고만큼 기대치를 충족시키는 것은 아니었습니다.
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
Life is ..2011. 2. 13. 12:02
드디어 1년의 공부 결과를 발표하는 유치원 발표회 날입니다.
요새는 좋아져서 유치원에서 안하고 구청 회관을 빌려서 하더라구요

대부분 황금 돼지해에 낳은 애들이 많아서 유치원 반들이 많이 늘었습니다.

그래서 1부와 2부로 나누어서 발표회를 하였는데 1부는 둘째가 2부는 첫째가 발표를 하였습니다.

둘째는 발표회 내용을 비밀로 한다고 하여서 
그동안 절대 집에서 연습도 안하고 이야기도 안해서 몹시 궁굼해 했었습니다.
살짝 물어봐도 
"직접 와서 봐" 라며 이야기를 안해주는 둘째가 대견하기도 하고 .. 

하여튼 1부는 오후 3시반에 시작해서 미리미리 가서 제일 앞자리에 자리를 잡았습니다.
예전에 조금 늦게 가서 중간에 자리 잡았더니 첫째는 엄마 아빠를 못찾아서 울었습니다 . (TT_TT)
그래서 아예 제일 먼저 앞자리로 예약을 해 놓고 보았습니다.


제일 앞자리에 앉은 엄마 아빠 할머니를 발견하고 미소 짖는 둘째입니다.
역시 앞에 앉아야되..


원판은 아빠의 작품 
화장은 엄마의 작품이랍니다.

저 동작을 보여주지 않을려고 집에서 연습도 안하고 입도 뻥긋 안하고 한달 넘게 지냈습니다.

1부 공연의 피날레는 모두 모여서 
You raised me up을 부르는 겁니다. 자리 잡고 기다리는 둘째입니다


그리고 6시 반부터 2부 공연을 시작하였습니다.

첫째는 피터팬의 여주인공 웬디를 맡아서 준비했습니다.
원래 부끄럼쟁이라 말을 못할줄 알았는데
무대에서도 잘 하더라구요 흠.. 아빠의 영향을 받아서 무대 체질인듯..

여주인공 웬디랍니다.
그것도 영어로 대사를 합니다.
애들이 영어로 해봐야 잘 하겠습니까만은, 
하여튼 학부형들이 좋아하니까 유치원에서도 열심히 시키죠




회사에 반차를 내고 공연을 보러 갔습니다
"아빠 꼭 와야되" 한마디에 바쁜 약속 미루고 정리한뒤 본 공연이었습니다. 핫핫핫..

2부 공연이 끝나니까 9시를 넘네요
애들데리고 전통의 축하 장소인 짜장면 집으로 고고.. ( 아직은 애들이 어려서 짜장면 정도로도 서로 합의를 볼 수 있습니다.)

빨리 뉴타입으로 키워야지

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