CPU의 opcode를 효율적으로 디자인하는 방법은 무엇입니까?


12

Logisim에 간단한 16 비트 CPU를 구축 중이며 ALU를 준비하고 있고 원하는 opcode를 가지고 있습니다. 이제 다른 하위 회로 (예 : 논리, 산술)에 모든 제어 와이어 (코딩을 구성하는)가 입력으로 필요하지는 않지만 가능한 한 적게 명령에 적합한 코딩을 찾기가 정말 어렵습니다. 효율적인 opcode 디자인에 도움이되는 전략이나 방법이 있습니까?

미리 thx


1
ALU를 먼저 구축하고 필요한 제어 와이어를 확인하십시오. 그런 다음 "현재 명령"레지스터에 직접 연결하십시오. 메모리 액세스 제어 논리 및 기타 주요 클래스의 opcode에 대해서도 동일합니다. 그런 다음 남아있는 비트를 사용하여 활성화 된 서브 회로를 선택하십시오.
user253751

1
Ken Chapman의 8 비트 프로그래밍 가능 상태 머신 KCPSM (PicoBlaze)의 원본 문서도 있습니다. 지침을 선택하고 ISA를 디자인 한 방법을 설명합니다. dc.uba.ar/materias/disfpga/2010/c2/descargas/…
Paebbels

답변:


9

다른 명령어 세트를 연구하는 것이 좋은 방법이라고 생각합니다.

작은 것은 TI의 MSP430이고 약 22 개의 명령어가있는 16 비트 프로세서입니다.

http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf

Atmel AVR을 살펴보면 아주 작은 명령어 세트가 있습니다.

작은 프로젝트에서 VHDL에서 간단한 명령어 세트 (14 명령어)로 간단한 32 비트 프로세서를 개발하려고했습니다.

http://www.blog-tm.de/?p=80

현재의 자유 시간으로 인해 완전히 완료되지 않았습니다. 명령어는 구현되었지만 두 개는 테스트되지 않았으며 일부 상태 플래그가 누락되었을 수 있습니다.


그러나 실제 인코딩이 무엇인지, 왜 이것이 이와 같이 선택되었는지 알 수있는 것을 찾지 못했습니다.
Benjoyo

당신은 REPO에 인코딩 실제로 사용을 찾을 수 있습니다 github.com/TM90/MISC_Processor/raw/master/Documentation/...를 . 명령 디코더의 논리가 최소화되는 방식으로 이러한 인코딩을 선택하는 이유.
TM90

7

명령어 코딩에 대한 ARM 접근 방식을 연구하십시오 (그러나 복제하지는 마십시오). 접두사 방향이 무겁고 (Dzarda가 권장하는 허프만 트리 접근 방식과 같음) 레지스터의 명령 선택 부분의 위치가 매우 균일합니다.

상상력이 없지만 신뢰할 수있는 접근 방식은 16 비트가 넘는 모든 제어 신호 를 열거 한 다음 Karnaugh-map 스타일 논리 최소화를 시도하는 것입니다.


나는 제어 신호에 의해 당신이 의미하는 바를 실제로 얻지 못합니다.
Benjoyo

ARM에서 찾고 좋아하는 것은 조건 필드입니다.
Benjoyo

제어 신호는 다양한 멀티플렉서에 대한 입력이며 CPU 부분간에 데이터를 직접 전달할 수 있습니다.
pjc50

16 비트 아키텍처의 경우 ARM의 명령어 인코딩이 적절하지 않다고 생각합니다. Mayby thumb2가 더 좋습니다. 그러나 나는 약간 낭비 적이지만 MIPS 인코딩 방식은 간단하고 이해하기 쉽다.
phuclv

4

일단 Logisim에서 8 비트 명령 길이 코어로 4 비트 CPU를 시도했습니다. CPU보다 단순한 상태 머신으로 끝났습니다.

찾아야 할 임의의 것

  • 허프만 나무
  • 고정 길이 또는 가변 인코딩?
  • 단일 주소 공간을 가진 폰 노이만 디자인입니까, 아니면 별도의 데이터 / 프로그램이있는 하버드 스타일입니까?

허프만 나무에 관한 Computerphile의 훌륭한 비디오 :

https://www.youtube.com/watch?v=umTbivyJoiI


허프만 코딩은 고정 길이 인코딩에서 작동하지 않습니다.
Benjoyo

@ Benjoyo 나는 가장 많이 사용되는 명령어의 변형에 여분의 비트가 사용되어 더 많은 기능을 제공하는 시나리오를 상상할 수 있습니다.
Dzarda

그러나 나는 이것이 어떤 종류의 최적화를 얻지 못합니다. 회로 설계에 도움이되지 않습니다. opcode에 허프만 코딩을 사용할 때의 목표는 무엇입니까?
Benjoyo

4

내가 수업을 위해 작성한 ISA는 다음과 같이 4 비트 op 코드를 가졌습니다. 1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store

이것은 단일 비트의 입력 신호가 어떤 로직 경로를 제어 할 수 있기 때문에 게이트를 구성 / 설계하기에 가장 쉬운 스타일 중 하나입니다. 또는 가장 많이 사용되는 기호를 허프만 코딩하고 고정 길이 연산 코드를 얻기 위해 제로 패드를 사용할 수 있습니다.


이런 종류의 최적화는 내가 지금 찾고있는 것입니다. 그러나 나는 5 비트 opcode를 가지고 있으며 회로에서 의미가 있도록 명령을 그룹화하는 데 어려움을 겪습니다.
Benjoyo

@ Benjoyo 당신은 상위 비트 세트와 함께 더 많은 ALU 명령을 가질 수 있습니다. 또한 내 점프 조건 범위는 매우 약했으며 대부분의 일반 분기에는 두 가지 지침이 필요합니다. 일반적으로 범주는 다음과 같이 생각했습니다. 수학 / 제어 / 메모리

3

한 가지 고려해야 할 것은 모든 형태의 다중 단어 명령어를 허용 할 것인지 아니면 다중 단어 명령어처럼 "동작"할 수있는 것을 허용 할 것인지입니다. 그럴 경우, 주 명령어 다음에 추가 명령어를 사용할지 또는 앞에 접두어를 사용할지를 고려할 수 있습니다. 접두사 및 후속 단어를 허용하면 인터럽트 처리의 복잡성이 증가 할 수 있지만 일반적으로 사용되는 것과 동일한 opcode 공간에 거의 사용되지 않는 명령어를 맞출 필요가 없습니다.

명령이 실행되기 전에 사이클에서 명령을 가져 오는 경우 다음 명령 단어를 건너 뛰거나 내용을 프로그램 카운터로 직접 전송하는 "조건부 분기"명령이있을 수 있습니다. 이러한 설계는 시퀀싱을 중단하기 위해 약간의 복잡성을 추가 할 수 있지만 훨씬 더 넓은 범위의 분기 조건을 허용하면서 "분기", "점프"및 "호출"명령에 대해 많은 양의 opcode 공간을 사용할 필요가 없습니다. 그렇지 않으면 가능한 것보다. 가져 오는 브랜치는 일반적으로 주소의 출처에 관계없이 명령어 자체를 실행 한 후 데드 사이클을 필요로하기 때문에 가져 왔지만 실행되지 않는 다음 단어에서 주소를 가져 오는 데 추가 비용이 들지 않습니다. 시각.

분기 명령어에서 대상 주소를 옮기면 얼마나 많은 opcode 공간을 차지하더라도 16 비트 opcode 형식은 여전히 ​​빡빡합니다. 접두사 지침을 사용하면 도움이 될 수 있습니다. 예를 들어 32 개의 레지스터를 원한다면 레지스터를 source1, source2 및 대상으로 독립적으로 지정할 수 있으므로 opcode에 15 비트가 필요하므로 총 2 개의 명령어를 사용할 수 있습니다. 별로 유용하지 않습니다. 반면에 세 피연산자 각각에 대해 32 개의 레지스터 중 하나를 사용할 수 있다면 좋을 것입니다. 접두사가 앞에 오는 ALU 연산이 8 개의 비트를 사용하여 두 개의 1 개의 레지스터를 선택하지만 접두어 바로 뒤에 오는 ALU 연산이 접두어의 일부 비트를 사용하도록하여 두 목표의 균형을 맞출 수 있습니다. 다음 지시에서 8 개로 상위 레지스터를 사용하는 명령어는 하나가 아닌 두 단어 / 사이클을 사용하지만 경우에 따라서는 그러한 트레이드 오프가 가치가있을 수 있습니다. 접두사를 사용하는 데있어 가장 큰 어려움은 접두사와 다음 명령어 사이에 인터럽트가 발생하는 것을 방지해야합니다. 그렇지 않으면 인터럽트가 발생하는 경우 접두사 이후의 명령어가 올바른 레지스터를 계속 사용해야합니다 (예 : 프로그램을 통해) -카운터 저장 로직은 마지막으로 실행 된 접두사가 아닌 명령어의 주소를 저장합니다]. 그러나 어떤 경우에는 그러한 상충 관계가 가치가 있습니다. 접두사를 사용하는 데있어 가장 큰 어려움은 접두사와 다음 명령어 사이에 인터럽트가 발생하는 것을 방지해야합니다. 그렇지 않으면 인터럽트가 발생하는 경우 접두사 이후의 명령어가 올바른 레지스터를 계속 사용해야합니다 (예 : 프로그램을 통해) -카운터 저장 로직은 마지막으로 실행 된 접두사가 아닌 명령어의 주소를 저장합니다]. 그러나 어떤 경우에는 그러한 상충 관계가 가치가 있습니다. 접두사를 사용하는 데있어 가장 큰 어려움은 접두사와 다음 명령어 사이에 인터럽트가 발생하는 것을 방지해야합니다. 그렇지 않으면 인터럽트가 발생하는 경우 접두사 이후의 명령어가 올바른 레지스터를 계속 사용해야합니다 (예 : 프로그램을 통해) -카운터 저장 로직은 마지막으로 실행 된 접두사가 아닌 명령어의 주소를 저장합니다].

여러 단어로 된 명령을 사용하면 디자인의 일부 측면이 더 어려워 지지만 다른 어려운 결정을 내릴 필요성이 줄어들 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.