




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
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 DSP Design [2]
앞서의 글에서 공개된 아키텍쳐를 이용해서 만드는 것이 좋다고 말씀드렸습니다.
공개된 아키텍쳐 중에서 당장 눈에 뛰는 것은 4가지 입니다.
- OpenCores 와
- SUN Sparc Processor
- Core-A
- MIPS-I
각각의 프로세서를 간략하게 정리하였습니다.
Damjanl Lampret 라는 사람이 만든 OpenCores에서 공개한 프로세서로서 32비트 및 64비트까지 지원하는
명령어 세트를 가지고 있습니다.
오픈 코아는 명령어 자체가 걸려있는 것이 아닌것으로 생각되어, 구현 해도 큰 문제는 없을 것으로 생각합니다.
다만 현재 있는 것도 잘 되어 있어서 큰 문제는 없고, 실제 사용한 적도 있기 때문에
굳이 구현할 필요까지는 없을 것 같습니다.
무엇보다 공짜인데.. 라는 생각이 강한 오픈 코아이기 때문에 개인적으로는 위화감이 있습니다.
요게 맘에 들긴 합니다.
뭣보다도 정식 라이센스도 가능하고, 컴파일러와 O/S도 다 갖추고 있기 때문에 구현후에 좋습니다.
선에서 구할 수 있는 것은 T1과 T2프로세서 입니다.
T2는 서버를 원칩에 담겠다는 개념으로 만들어서 코드네임도 “NAIAGARA"로 명명했습니다.
결과물을 보면 물량전에서 절대 지지 않는 울트라 리스크 러쉬라고 할까요 ?
그런 정도의 엄청난 물량을 가지고 있습니다.

T1도 잘 만들었고 실제 이넘에서 프로세서 하나를 떼서 사업화 하겠다던 회사도 있었습니다.
그후에 소식은 못들어서 또 역사의 물결 속으로 사라진게 아닌가 하는 의구심도 듭니다.
하여튼 개인적으로는 이러한 레지스터 윈도우 방식은 참으로 좋은 아이디어로 생각합니다.
일정 수준까지의 함수의 호출에서는 스택을 건드리지 않고 파라미터와 내용을 전달하기 때문에
속도가 아주 빠릅니다.
다만 일정 수준을 넘어가면 Exception이 발생하고, 그 후에 다시 처리하는 것이 조금 시간이 걸린다는 단점이 있습니다.
개인적으로는 Embedded IP에서 게이트 카운트에 압박을 벗어나는 시대이므로, 용량이 좀 되는 어플리케이션에서는 좋은 어프로치라고 생각합니다.
작년 여름께 발표된 것으로, 특허청과 국내 대학 연합에서 만들어서 발표한 아키텍쳐입니다.
아키텍쳐가 공개된는지는 모르겠습니다만, 명령어 세트를 구하는 것은 쉬운 것이라서
구현이 가능한 범주에 넣었습니다.
NOP를 명령어 비트에 집어넣은 발상으로 만들었기 때문에 Data forwarding이 필요 없다는
개념을 가진 아키텍쳐로 보입니다.
컴파일러와 시뮬레이터가 아직 완전하지 않은것으로 보여 이 부분에 대한 보완이 시급한 것 같습니다.
하지만, 이제 시작이고 국내에서 EISC외에 새로운 아키텍쳐가 나왔다는 점에서 의미가 있다고 생각합니다.

위의 사진은 도시바에서 만든 MIPS-4400입니다.
MIPS WIKI페이지에서 옮겼습니다.
ARM과 쌍벽을 이루면서, 미국에서 자존심을 걸고 지켜주는 프로세서이죠
프로세서 아키텍쳐 바이블 서적인 Computer Organization and Design: The Hardware/Software Interface 에서 설명하는 구조입니다.
프로세서 공부하시는 분들은 모르는 사이에 한번 공부한 아키텍쳐죠..

MIPS의 클론 프로세서를 검토한다면 렉서라라는 회사에 대해서 알아야 합니다. 이것에 대해서는 아래 링크를 한번 읽어보시면 좋겠습니다.
(눈물 없이는 읽을 수 없는 글입니다.)
http://jonahprobell.com/lexra.html
LEXRA는 MIPS-I 클론을 만들었고, 특허를 피해가기 위해서 노력을 했습니다만, MIPS의 현질 공세에 밀려서 사라진 회사입니다. 저자는 MIPS가 Lexra에 대항했을 때의 그 노력으로 ARM에 대항했다면, 훨씬 좋은 결과를 만들었을 거라는 아쉬움을 이야기합니다.
MIPS-I에서 특허로 보호받는 부분은 명령어중 4개 정도 입니다. 그리고 이 명령어들은 Memory Miss Alignment에 대한 것들입니다.
이 것에 대해서는 우여 곡절이 많지만 하여튼 2006년 12월에 특허가 완전히 풀렸습니다.
관련해서 오픈 코아의 Plasma프로세서가 MIPS-I을 이용해서 구현했습니다.
http://www.opencores.org/projects.cgi/web/mips/overview
앞서 말씀드린 바와 같이 MIPS-I의 특허는 완전히 풀렸기 때문에 이것을 이용해서 프로세서를 만드는 것이 가능합니다.
어떤 것을 구현하는게 좋은지는 법적인 문제와 실제 문제 그리고, 프로세서의 개발 환경 문제도 검토해야 합니다.
그리고 컴파일러의 최적화 문제에 대해서 고민을 해봐야 하고 또, 프로세서의 용도에 따라서 선택해야 하는 문제입니다.
이번에 만들고 싶은 프로세서는 고성능 DSP프로세서이기 때문에 명령어 확장도 가능한 형태로 가야 합니다. 이 부분을 고려하여서 위의 4가지 아키텍쳐 중에서 하나를 선택해서 구현합니다.
---------
그외에 공개된 아키텍쳐가 있다면 좋겠습니다.
이 자료는 현재까지 알고 있는 아키텍쳐에 대해서 검토한 과정을 정리한 것입니다.
언제나 그렇듯 제가 알고 있는 부분과 사실과 틀릴수도 있습니다. ㅋㅋ
당신의 의견을 작성해 주세요.
박찬오 2010/03/23 23:32 편집/삭제 댓글 작성 댓글 주소
이거 기억납니다. mmu랑 cash 동작을 관찰 해보려고
다운 받았는데 아무리 봐도 없어 저자 한테 물어보니
그런 것 없이 명령어만 시뮬레이션이 된다고 해서 결국
arm 시뮬레이터로 리눅스 돌려보고 끝났습니다..-.- 엉뚱한 결말
GUNDAM 2010/03/23 23:59 편집/삭제 댓글 작성 댓글 주소
잘 다녀오셨는가 ?
안그래도 연락없길래..
무슨 일 있나 궁굼했는데
건강하게 다녀왔으면 회사에 한번 놀러와
dike 2010/03/30 01:25 편집/삭제 댓글 작성 댓글 주소
안녕하세요, 건담님.

건담님 포스팅을 보고 mips cross compiler 환경을 맥에서 구성하여서
현재 공부를 하고있는 학생입니다..^^
물어볼게 있어서 염치불구하고 이렇게 질문드립니다.
제가 gcc 3.4.4 에 toolchain 잘 구성하고 mipsel-unknown-linux-gcc -S test.c
이런식으로 컴파일을 하면 잘 되고, 인스트럭션들도 .s 안에 잘 생성되는듯 싶습니다.
그런데 제가 배우는 책과 인스트럭션이 상이한부분이 많아서요,
NOT 을 원래 0과 nor 하여 수행하는데 제 SPIM 에서는 xor 랑 비교한 후 다른 작업을하고..
i(n>1) 과 같은 것도 slt->beq 를 거치지 않고 바로 bgtz 로 가버리네요..
제 요지는 현재 컴파일러가 만들어주는 인스트럭션들은 MIPS 용 인스트럭션은 맞지만
버젼이 다르거나.. 하는 문제가 있다는 겁니다. (제가 배우는 책하구요.)
제 책은 대학교재로 쓰이고있어서 가능하면 이수준으로 맞추고 싶은데 혹시 여기에 대해서 조언해주실수 있나요..?
기다리겠습니다 . 감사합니다.
GUNDAM 2010/03/30 09:04 편집/삭제 댓글 주소
질문하신 요지는 현재 배우시는 책하고 , 컴파일러에 의해서 생성되는 어셈블러하고 틀리는 문제여서, 이를 맞추고 싶으시다는 의미로 이해가 됩니다.
현재 배우시는 책이 어떤것인지 잘 모르겠습니다만,
컴파일러를 가지고 아키텍쳐를 바꾸어가며, 테스트를 해보니 모두 0과 NOR를 해버리고 있습니다.
이 경우에 해당되는 지는 모르겠으나, 일반적인 경우에도 Compiler의 지속적인 성능 개선으로 인해 컴파일러의 버전이 틀려지면, 같은 C 코드를 넣어도 틀린 어셈블러가 생성이 되는 경우가 있습니다. 따라서 교재가 쓰여진 시점의 Compiler를 구하신다면 같은 어셈블러를 생성할 가능성이 있을 것 같지만, 통상 교재는 몇년 전의 버전이므로, 지금의 컴파일러로는 같은 코드가 나오기 힘들다고 생각됩니다.
문의하신 내용을 보면 어느정도 어셈블러를 이해하고 계신듯 한데 그러면 필요에 따라서 어셈블러로 직접 코딩하는 것이 한 방법일 듯 합니다.
도움이 안되는 답변을 드립니다.
dike 2010/03/30 09:57 편집/삭제 댓글 작성 댓글 주소
앗, GUNDAM 님, 답변감사합니다.
건담님GCC 에서는 0 과 NOR 를 한다는 말씀이신가요?
제 컴파일러는 현재 !a 과 같은 라인을 컴파일할 때
xori $2,$2,0x0
sltu $2,$2,1
이렇게 컴파일을 하고있습니다.
컴파일커맨드는 mipsel-unknwon-linux-gnu-gcc -S file.c
이런식으로 하고 있는데요,
제가 무엇을 잘못해서 저렇게 어셈블러가 나오는 것일까요? ^^;
건담님 컴파일러처럼만 컴파일 되면 됩니다 ..ㅎㅎ
GUNDAM 2010/03/30 12:20 편집/삭제 댓글 주소
제가 질문을 잘못 이해 했는것 같습니다.
~a와 !a는 당연히 틀립니다.
~a는 logical not을 의미하고
!a는 relational not을 의미합니다.
즉 전자는 논리연산할 때에 NOT이 되고
후자는 관계연산을 의미하는 NOT입니다.
전자로 할 경우에는 원하시는 대로 0과 nor을 하게 되고
후자로 할 경우에는 작성하신 코드대로 sltu를 하게 됩니다.
if ( a < 0 ) 과 같은 의미가 되겠네요
int foo( int a )
{
return ~a;
}
int foo2( int a )
{
return !a;
}
를 넣고 컴파일 해보시면 아래와 같이 나옵니다.
.file 1 "test2.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.text
.align 2
.globl foo
.set nomips16
.ent foo
.type foo, @function
foo:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
.set noreorder
.set nomacro
j $31
nor $2,$0,$4
.set macro
.set reorder
.end foo
.size foo, .-foo
.align 2
.globl foo2
.set nomips16
.ent foo2
.type foo2, @function
foo2:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
.set noreorder
.set nomacro
j $31
sltu $2,$4,1
.set macro
.set reorder
.end foo2
.size foo2, .-foo2
.ident "GCC: (GNU) 4.4.2"
과 같습니다.
당연한 이야기이지만 컴파일 하실떄 -O2로 하시는거죠 ?
dike 2010/03/30 20:30 편집/삭제 댓글 작성 댓글 주소
아!!!! 그렇군요!! 잘나옵니다!
제가 이번에 막 공부를 하는 입장이라서요, ㅎㅎㅎ
크 정말정말 감사합니다 더욱 열심히 공부할 마음이 생기네요. ㅎㅎㅎ
아 그런데 제가 그냥 optimazition option 안주고 컴파일하는데요,
-O2 옵션을 주니까 제가 공부한 부분을 넘어서는 것들이 나오는거같아요
lw $25,%call16(fact)($28) 이런거같은..
그냥하면 문제가 있나요? ㅠ ㅎㅎ
GUNDAM 2010/03/31 09:36 편집/삭제 댓글 주소
-O2를 주고 안주고의 문제는 개인 취향의 문제이지만, Assembler와 C코드의 문맥상 흐름을 일치시킬려면 가능하면 주는 게 좋습니다.
안그러면 같은 작업이지만 메모리로 데이터를 카피하고 또 올리고 (바느질 한다고 표현하기도 합니다.) 하는 작업을 하기 때문에, 문맥 흐름을 파악하는데 곤란한 경우가 많습니다. 어셈블러 한두 줄이면 될 코드를 열 몇줄동안 준비하고 반복한다고 생각하시면 됩니다.
Assembler의 문법 문제는 한 두번 공부 하시면 해결 될 문제여서,
Assembler와 C간의 상관 관계를 파악하는데에는 -O2를 주시고 하시는게 좋습니다.