KR101190937B1 - 연산 유닛, 프로세서 및 프로세서 아키텍처 - Google Patents

연산 유닛, 프로세서 및 프로세서 아키텍처 Download PDF

Info

Publication number
KR101190937B1
KR101190937B1 KR1020097019456A KR20097019456A KR101190937B1 KR 101190937 B1 KR101190937 B1 KR 101190937B1 KR 1020097019456 A KR1020097019456 A KR 1020097019456A KR 20097019456 A KR20097019456 A KR 20097019456A KR 101190937 B1 KR101190937 B1 KR 101190937B1
Authority
KR
South Korea
Prior art keywords
register
clock
state
unit
changes
Prior art date
Application number
KR1020097019456A
Other languages
English (en)
Other versions
KR20100005035A (ko
Inventor
히데끼 요시자와
Original Assignee
후지쯔 가부시끼가이샤
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 후지쯔 가부시끼가이샤 filed Critical 후지쯔 가부시끼가이샤
Publication of KR20100005035A publication Critical patent/KR20100005035A/ko
Application granted granted Critical
Publication of KR101190937B1 publication Critical patent/KR101190937B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • G06F9/30014Arithmetic instructions with variable precision
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3853Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution of compound instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3867Concurrent instruction execution, e.g. pipeline or look ahead using instruction pipelines
    • G06F9/3869Implementation aspects, e.g. pipeline latches; pipeline synchronisation and clocking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3867Concurrent instruction execution, e.g. pipeline or look ahead using instruction pipelines
    • G06F9/3875Pipelining a single stage, e.g. superpipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • Advance Control (AREA)
  • Complex Calculations (AREA)

Abstract

프로세서(1)의 실행 스테이지에서 소정 자릿수 길이의 연산을 행하는 연산 유닛(17)은, 소정 자릿수 길이의 연산을 자릿수 방향으로 분할한 각 연산을 각각 서로 다른 파이프라인 스테이지에서 실행하는 복수의 부분 연산 유닛(201~204)과, 각 파이프라인 스테이지간을 각각 구획하는 복수의 파이프라인 레지스터(211~213, 221~227, 231~237, 241~246)를 구비하고, 각 파이프라인 레지스터(211~213, 221~227, 231~237, 241~246)는, 입력 트리거에 동기하여 출력값을 갱신하는 플립플롭 모드와, 입력값을 그대로 출력하는 트랜스페어런트 모드의 2개의 동작 모드간에서 절환 가능하게 동작한다.
실행 스테이지, 연산 유닛, 파이프라인 레지스터, 플립플롭 모드, 트랜스페어런트 모드, 메인 디코더

Description

연산 유닛, 프로세서 및 프로세서 아키텍처{CALCULATION UNIT, PROCESSOR, AND PROCESSOR ARCHITECTURE}
본 발명은, 복수의 명령을 병렬하여 실행 가능한 프로세서의 구성 기술에 관한 것이다.
동시에 복수의 명령을 실행함으로써 처리 능력을 향상시킨 프로세서로서, VLIW(초장 형식 기계 명령 : Very Long Instruction Word) 프로세서나, 슈퍼스칼라 프로세서가 알려져 있다.
도 1은 종래의 VLIW 프로세서의 개략 구성도이다. VLIW 프로세서(900)는, 명령 페치 스테이지(IF)에서 명령 메모리(901)로부터 VLIW 명령을 페치하는 페치 유닛(902)과, 명령 디코드 스테이지(ID)에서 VLIW 명령을 복수의 산술 논리 연산 명령으로 디코드하는 디코더(911~914)와, 실행 스테이지(EX)에서 이들 복수의 산술 논리 연산 명령을 실행하는 복수의 산술 논리 연산 유닛(ALU)(921~924)과, 기입 스테이지(WB)에서 연산 결과를 기억하는 레지스터(930)를 구비하고 있다.
도 2는 종래의 슈퍼스칼라 프로세서의 개략 구성도이다. 슈퍼스칼라 프로세서(940)는, 명령 페치 스테이지와 명령 디코드 스테이지 사이에 명령 디스패처(941)를 구비하고 있다. 명령 디스패처(941)는, 연산 유닛(921~924)의 사용 상 황에 따라서 명령 실행수나, 연산 유닛(921~924)에의 명령의 할당을 동적으로 변경한다.
또한 하기 특허 문헌 1에는, 입출력 인터페이스를 변경할 수 있는 복수의 처리 유닛을 이용하여, 독립적으로 동작 가능한 복수의 데이터 패스를 구성하는 데이터 처리 장치가 개시되어 있다.
특허 문헌 1 : 일본 특허 공개 2004-102988호 공보
<발명의 개시>
상기의 VLIW 프로세서나 슈퍼스칼라 프로세서와 같은, 복수의 명령을 병렬로 실행하는 프로세서에는, 병렬로 실행하는 것이 일어날 수 있는 명령수의 최대값과 동일한 수의 산술 논리 연산 유닛을 설치할 필요가 있었다.
그러나, 미리 준비된 수의 산술 논리 연산 유닛을 모두 사용하는 기회는 적고, 통상의 경우에는 몇개의 산술 논리 연산 유닛은 사용되지 않거나 또는 NOP 명령을 실행하고 있었다. 이 때문에 다음과 같은 낭비가 생기고 있었다.
첫째, 레지스터 파일이나 기억 수단과 산술 논리 연산 유닛 사이를 접속하는 데이터 패스는, 준비된 산술 논리 연산 유닛이 모두 동일한 레지스터나 동일한 메모리 어드레스에 접속할 수 있는 접속 자유도를 가질 필요가 있다. 일반적으로 칩 면적은, 회로 규모보다도 배선 면적이나 기억 소자 면적에 의해 지배적으로 결정되기 때문에, 산술 논리 연산 유닛의 실장수가 증가하면 데이터 패스의 배선 면적은 급격하게 증가한다. 따라서 사용 빈도가 낮은 산술 논리 연산 유닛이 실장되어 있으면 불필요하게 칩 면적을 증가시키게 된다.
둘째, 사용되고 있지 않은 산술 논리 연산 유닛도 전력을 소비한다. 따라서 사용 빈도가 낮은 산술 논리 연산 유닛이 실장되어 있으면, 불필요한 전력 소비를 발생시키게 된다.
이들 문제점을 감안하여, 본 발명은, 프로세서에서의 배선 면적과 소비 전력을 삭감하는 것을 목적으로 한다.
상기 목적을 달성하기 위해서, 본 발명에서는, 프로세서의 실행 스테이지에서 행해지는 산술 연산 또는 논리 연산 등의 연산을 자릿수 방향으로 분할함으로써 복수의 부분적인 연산으로 나눈다. 그리고, 이들 복수의 부분적 연산을 서로 다른 파이프라인 스테이지에서 실행하는 파이프라인 처리를 행한다.
이를 위해서 본 발명의 제1 형태에 따른 연산 유닛은, 프로세서의 실행 스테이지에서 소정 자릿수 길이의 연산을 행하는 연산 유닛으로서, 소정 자릿수 길이의 연산을 자릿수 방향으로 분할한 각 연산을 각각 서로 다른 파이프라인 스테이지에서 실행하는 복수의 부분 연산 유닛과, 각 파이프라인 스테이지간을 각각 구획하는 복수의 파이프라인 레지스터를 구비한다.
연산을 분할하여 파이프라인 처리에 의해 실행함으로써, 단일의 연산 유닛에서 복수의 연산을 병렬하여 행하는 것이 가능하게 된다. 이 때문에 종래의 프로세서보다도 적은 수의 연산 유닛을 이용하여 복수의 연산을 병렬로 연산을 행할 수 있어, 레지스터 파일이나 기억 수단과 연산 유닛을 연결하는 데이터 패스의 배선을 저감할 수 있다.
즉 종래의 프로세서에서는, 복수의 연산 유닛과 레지스터 파일 등과의 사이 에 각각 개별로 설치된 데이터 패스가, 각 연산 유닛이 1개의 연산을 행하는 주기(이하, 「기본 주기」라고 나타냄) 동안 쭉 점유되어 있었던 바, 본 발명에 따르면, 1개의 연산 유닛이 파이프라인 처리에 의해 복수의 연산을 병렬로 실행하므로, 이들 연산을 위해서 각각 행해지는 레지스터 파일 등에 액세스가 서로 다른 타이밍에서 생긴다. 즉, 본 발명에 따르면, 병렬로 실행되는 복수의 연산에서 각각 행해지는 레지스터 파일 등에 액세스가 1개의 기본 주기 내에서 시분할 다중화되므로, 이들 복수의 연산 사이에서 1개의 데이터 패스를 공용할 수 있다.
파이프라인 레지스터는, 입력 트리거에 동기하여 출력값을 갱신하는 플립플롭 모드와, 입력값을 그대로 출력하는 트랜스페어런트 모드로 이루어지는 2개의 동작 모드간에서 절환 가능하게 동작하는 기억 소자로 구성하여도 된다. 이와 같이 파이프라인 레지스터를 구성함으로써, 연산 유닛이 실행하는 파이프라인 처리의 파이프라인 단수를 변경할 수 있게 된다. 이에 의해, 연산 유닛이 병렬하여 실행하는 명령수를 가감하고, 필요 최저한의 실행 명령수로 처리함으로써 소비 전력을 절약할 수 있다.
본 발명의 제2 형태에 따르면, 제1 형태의 연산 유닛에 의해 실행 스테이지에서의 소정 자릿수 길이의 연산을 행하는 프로세서가 제공된다. 여기서, 부분 연산 유닛의 연산 자릿수 길이는, 소정 자릿수 길이의 연산을 N(N은 2 이상의 정수)등분한 자릿수 길이이고, 프로세서는, 소정 자릿수 길이의 연산에 사용하는 기간의 1/N배의 길이의 주기를 갖는 동작 주파수의 N배의 동작 주파수에서 파이프라인 스테이지를 동작시키는 클럭 생성부를 구비한다.
본 발명의 제3 형태에 따르면, 연산 유닛에 의해 실행 스테이지에서의 소정 자릿수 길이의 연산을 행하는 프로세서의 프로세서 아키텍처가 제공된다. 본 아키텍처에서는, 연산 유닛을, 소정 자릿수 길이의 연산을 자릿수 방향으로 분할한 각 연산을 각각 서로 다른 파이프라인 스테이지에서 실행하는 부분 연산 유닛과, 각 파이프라인 스테이지간을 구획하는 파이프라인 레지스터에 의해 구성하고, 연산 유닛에의 오퍼랜드 및 연산 유닛의 연산 결과를 기억하는 기억 수단을, 소정 자릿수 길이의 연산에 사용하는 기간의 1/N배의 길이의 주기를 갖는 동작 주파수의 정수배의 속도로 동작하는 파이프라인 스테이지가 액세스 가능한 액세스 레이턴스의 기억 소자로 구성한다.
본 발명에 의해, 프로세서에서의 배선 면적과 소비 전력이 삭감된다. 따라서, 특히, 휴대 전화용 LSI 등과 같은 전력 절약화인 것이 요구되는 LSI나, 저코스트의 전자 부품에서, 본 발명에 따른 연산 유닛이나 프로세서를 적절히 이용할 수 있다.
도 1은 종래의 VLIW 프로세서의 개략 구성도.
도 2는 종래의 슈퍼스칼라 프로세서의 개략 구성도.
도 3은 종래의 연산 유닛의 모식도.
도 4는 본 발명에 따른 연산 유닛의 기본 구성도.
도 5는 도 4에 도시하는 파이프라인 레지스터의 개략 구성도.
도 6은 병렬수가 1일 때의 연산 유닛의 동작의 타임 차트.
도 7은 병렬수가 2일 때의 연산 유닛의 동작의 타임 차트.
도 8은 병렬수가 4일 때의 연산 유닛의 동작의 타임 차트.
도 9는 본 발명에 따른 프로세서의 기본 동작을 도시하는 모식도.
도 10은 본 발명에 따른 VLIW 프로세서의 실시예를 도시하는 개략 구성도.
도 11은 명령 메모리, 프로그램 카운터 제어부, 명령 버퍼, 메인 디코더, 연산부, WR 디코더 및 클럭 제어부 사이의 접속 관계를 도시하는 도면.
도 12는 메인 디코더, 레지스터 유닛, LS 디코더, 데이터 메모리, 어드레스 연산기, 연산부 및 클럭 제어부 사이의 접속 관계를 도시하는 도면.
도 13은 연산부, WR 레코더, 프로그램 카운터 제어부, 데이터 메모리 및 클럭 제어부 사이의 접속 관계를 도시하는 도면.
도 14는 프로그램 카운터 제어부의 개략 구성도.
도 15는 메인 디코더의 개략 구성도.
도 16은 본 프로세서에 의해 해독되는 명령의 종류를 예시하는 도면.
도 17A는 싱글 명령 디코드부에 의한 디코드의 설명도(그 1).
도 17B는 싱글 명령 디코드부에 의한 디코드의 설명도(그 2).
도 18A는 병렬 명령 디코드부에 의한 디코드의 설명도(그 1).
도 18B는 병렬 명령 디코드부에 의한 디코드의 설명도(그 2).
도 19는 레지스터 유닛의 개략 구성도.
도 20은 연산부의 개략 구성도.
도 21은 클럭 제어부의 개략 구성도.
도 22는 병렬수가 1로부터 4로 변화할 때의 페치단에서의 프로세서의 동작을 나타내는 타임 차트.
도 23은 병렬수가 1로부터 4로 변화할 때의 디코드단에서의 프로세서의 동작을 나타내는 타임 차트.
도 24는 병렬수가 1로부터 4로 변화할 때의 실행단에서의 프로세서의 동작을 나타내는 타임 차트.
도 25는 병렬수가 1로부터 4로 변화할 때의 신호 Ckw와 BranchCntrl의 변화를 나타내는 타임 차트.
도 26은 도 21에 도시하는 클럭 인버터(140)의 개략 구성도.
도 27은 도 26에 도시하는 클럭 인버터(140)의 상태 천이도.
도 28은 도 21에 도시하는 클럭 인버터(140)의 내부 상태를 나타내는 타임 차트.
도 29는 도 21에 도시하는 클럭 인버터(141~143)의 내부 상태를 나타내는 타임 차트.
도 30은 도 21에 도시하는 클럭 인버터(142, 143)의 내부 상태를 나타내는 타임 차트.
도 31은 도 21에 도시하는 클럭 인버터(151)의 개략 구성도.
도 32는 도 21에 도시하는 클럭 인버터(151)의 상태 천이도.
도 33은 병렬수가 1로부터 4로 변화할 때의 클럭 인버터(151)의 내부 상태를 나타내는 타임 차트.
도 34는 도 21에 도시하는 클럭 인버터(152)의 상태 천이도.
도 35는 병렬수가 1로부터 4로 변화할 때의 클럭 인버터(152)의 내부 상태를 나타내는 타임 차트.
도 36은 도 21에 도시하는 클럭 인버터(153)의 상태 천이도.
도 37은 병렬수가 1로부터 4로 변화할 때의 클럭 인버터(153 및 154)의 내부 상태를 나타내는 타임 차트.
도 38은 도 21에 도시하는 클럭 인버터(154)의 상태 천이도.
도 39는 도 21에 도시하는 모드 절환 신호 생성부(161)의 개략 구성도.
도 40은 도 21에 도시하는 모드 절환 신호 생성부(161)의 상태 천이도.
도 41은 병렬수가 1로부터 4로 변화할 때의 모드 절환 신호 생성부(161)의 내부 상태를 나타내는 타임 차트.
도 42는 도 21에 도시하는 모드 절환 신호 생성부(162)의 상태 천이도.
도 43은 도 21에 도시하는 모드 절환 신호 생성부(163)의 상태 천이도.
도 44는 병렬수가 1로부터 4로 변화할 때의 모드 절환 신호 생성부(162 및 163)의 내부 상태를 나타내는 타임 차트.
도 45는 병렬수가 1로부터 2로 변화할 때의 페치단에서의 프로세서의 동작을 나타내는 타임 차트.
도 46은 병렬수가 1로부터 2로 변화할 때의 디코드단에서의 프로세서의 동작을 나타내는 타임 차트.
도 47은 병렬수가 1로부터 2로 변화할 때의 실행단에서의 프로세서의 동작을 나타내는 타임 차트.
도 48은 병렬수가 1로부터 2로 변화할 때의 클럭 인버터(151)의 내부 상태를 나타내는 타임 차트.
도 49는 병렬수가 1로부터 2로 변화할 때의 클럭 인버터(152)의 내부 상태를 나타내는 타임 차트.
도 50은 병렬수가 1로부터 2로 변화할 때의 클럭 인버터(153 및 154)의 내부 상태를 나타내는 타임 차트.
도 51은 병렬수가 1로부터 2로 변화할 때의 모드 절환 신호 생성부(161)의 내부 상태를 나타내는 타임 차트.
도 52는 병렬수가 1로부터 2로 변화할 때의 모드 절환 신호 생성부(162 및 163)의 내부 상태를 나타내는 타임 차트.
도 53은 병렬수가 4로부터 1로 변화할 때의 페치단에서의 프로세서의 동작을 나타내는 타임 차트.
도 54는 병렬수가 4로부터 1로 변화할 때의 디코드단에서의 프로세서의 동작을 나타내는 타임 차트.
도 55는 병렬수가 4로부터 1로 변화할 때의 실행단에서의 프로세서의 동작을 나타내는 타임 차트.
도 56은 병렬수가 4로부터 1로 변화할 때의 클럭 인버터(151)의 내부 상태를 나타내는 타임 차트.
도 57은 병렬수가 4로부터 1로 변화할 때의 클럭 인버터(152)의 내부 상태를 나타내는 타임 차트.
도 58은 병렬수가 4로부터 1로 변화할 때의 클럭 인버터(153 및 154)의 내부 상태를 나타내는 타임 차트.
도 59는 병렬수가 4로부터 1로 변화할 때의 모드 절환 신호 생성부(161)의 내부 상태를 나타내는 타임 차트.
도 60은 병렬수가 4로부터 1로 변화할 때의 모드 절환 신호 생성부(162 및 163)의 내부 상태를 나타내는 타임 차트.
도 61은 병렬수가 2로부터 4로 변화할 때의 페치단에서의 프로세서의 동작을 나타내는 타임 차트.
도 62는 병렬수가 2로부터 4로 변화할 때의 디코드단에서의 프로세서의 동작을 나타내는 타임 차트.
도 63은 병렬수가 2로부터 4로 변화할 때의 실행단에서의 프로세서의 동작을 나타내는 타임 차트.
도 64는 병렬수가 2로부터 4로 변화할 때의 클럭 인버터(151)의 내부 상태를 나타내는 타임 차트.
도 65는 병렬수가 2로부터 4로 변화할 때의 클럭 인버터(152)의 내부 상태를 나타내는 타임 차트.
도 66은 병렬수가 2로부터 4로 변화할 때의 클럭 인버터(153 및 154)의 내부 상태를 나타내는 타임 차트.
도 67은 병렬수가 2로부터 4로 변화할 때의 모드 절환 신호 생성부(161)의 내부 상태를 나타내는 타임 차트.
도 68은 병렬수가 2로부터 4로 변화할 때의 모드 절환 신호 생성부(162 및 163)의 내부 상태를 나타내는 타임 차트.
도 69는 본 발명에 따른 슈퍼스칼라 프로세서의 실시예를 도시하는 개략 구성도.
<부호의 설명>
201~204 : 부분 연산 유닛
211~219, 221~228, 231~237 : 파이프라인 레지스터
<발명을 실시하기 위한 최량의 형태>
도 3~도 9를 참조하여, 본 발명에 따른 연산 유닛의 기본 동작을 설명한다. 도 3은 소정 자릿수 길이인 M비트의 연산을 행하는 종래의 연산 유닛의 모식도이고, 도 4는 도 3에 도시하는 연산 유닛과 동일한 자릿수 길이의 연산을 행하는 본 발명에 따른 연산 유닛의 기본 구성도이다. 도 3에 도시하는 연산 유닛은, 각각 M비트의 제1 입력 데이터 A 및 제2 입력 데이터 B와 연산 코드를 입력받고, 이들 M비트의 데이터 A 및 B 사이에서, 연산 코드에 의해 지정되는 산술 연산 또는 논리 연산을 행하여, M비트의 연산 결과 S와 캐리 등의 발생을 나타내는 플래그 F를 출력한다.
도 4에 도시하는 본 발명에 따른 연산 유닛(200)은, 각각 M비트의 제1 입력 데이터 A 및 제2 입력 데이터 B와 연산 코드를 입력받고, 이들 M비트의 데이터 A 및 B 사이에서, 연산 코드에 의해 지정되는 산술 연산 또는 논리 연산을 행하여, M 비트의 연산 결과 S와 캐리 등의 발생을 나타내는 플래그 F를 출력한다.
연산 유닛(200)은, M비트 연산을 자릿수 방향으로 분할한 부분적인 연산을 각각 행하는 제1~제4 부분 연산 유닛(201~204)을 구비한다. 도 4에 도시하는 구성예에서는, M비트 연산을 자릿수 방향으로 4개로 분할하고, 각각의 부분적인 연산을 행하는 4개의 부분 연산 유닛을 설치하였다. 그러나, 연산의 분할수 즉 부분 연산 유닛의 수는 4가 아니어도 되고, 2 이상의 임의의 수이면 된다.
제1~제4 부분 연산 유닛(201~204)의 각각에는, 각각의 유닛(201~204)이 실행할 연산의 종류를 지정하는 연산 코드가 입력된다. 그리고, 제1 부분 연산 유닛(201)은, M비트의 입력 데이터 A 및 B 중의 각각 0비트째부터 (M1-1)비트째까지의 M1비트의 부분인 A1과 B1을 입력으로 하여, 연산 코드에 의해 지정된 연산을 행하여, M1 비트의 연산 결과 S1과 캐리 C1을 출력한다.
제2 부분 연산 유닛(202)은, 입력 데이터 A 및 B 중의 각각 M1비트째부터 (M2-1)비트째까지의 (M2-M1)비트의 부분인 A2 및 B2와, 제1 부분 연산 유닛(201)으로부터의 캐리 C1을 입력으로 하여, 연산 코드에 의해 지정된 연산을 행하여, (M2-M1)비트의 연산 결과 S2와 캐리 C2를 출력한다.
제3 부분 연산 유닛(203)은, 입력 데이터 A 및 B 중의 각각 M2비트째부터 (M3-1)비트째까지의 (M3-M2)비트의 부분인 A3 및 B3과, 제2 부분 연산 유닛(202)으로부터의 캐리 C2를 입력으로 하여, 연산 코드에 의해 지정된 연산을 행하여,(M3-M2)비트의 연산 결과 S3과 캐리 C3을 출력한다.
제4 부분 연산 유닛(204)은, 입력 데이터 A 및 B 중의 각각 M3비트째부터 (M-1)비트째까지의 (M-M3)비트의 부분인 A4 및 B4와, 제3 부분 연산 유닛(203)으로부터의 캐리 C3을 입력으로 하여, 연산 코드에 의해 지정된 연산을 행하여, (M-M3)비트의 연산 결과 S4와, 캐리 판정이나 제로 판정의 결과를 나타내는 플래그 F를 출력한다.
또한 이하의 설명에서, 복수 비트의 데이터 D 중 보다 하위의 m비트째부터 보다 상위의 n비트째까지의 부분의 데이터를 나타내는 경우에 D[n:m]으로 표기하는 경우가 있다.
각 부분 연산 유닛(201~204)이 1개의 M비트 연산 중의 서로 다른 부분적 연산을 서로 다른 클럭 사이클 시간에서 실행하고, 또한 각 부분 연산 유닛(201~204)이 동일 클럭 사이클 시간에서 서로 다른 M비트 연산의 부분적 연산을 행함으로써, 연산 유닛(200)은 파이프라인 처리에 의해 서로 다른 M비트 연산을 병렬로 실행한다. 이를 위해서 연산 유닛(200)은, 분할된 입력 데이터 A2~A4 및 B2~B4, 연산 코드, 및 각 부분 연산 유닛(201~203)의 연산 결과를 유지하기 위한 파이프라인 레지스터(211~219, 221~228, 231~237)를 구비한다. 그리고 부분 연산 유닛(201~204)은, 이들 파이프라인 레지스터(211~219, 221~228, 231~237)에 의해 구획된 복수의 파이프라인 스테이지에서 연산을 실행한다.
제1~제4 부분 연산 유닛(201~204)이 연산을 행하는 파이프라인 스테이지를 각각 제1 파이프라인 스테이지~제4 파이프라인 스테이지로 나타낸다. 제1 파이프라인 스테이지와 제2 파이프라인 스테이지 사이에는 파이프라인 레지스터(211~219)가 설치되고, 제2 파이프라인 스테이지와 제3 파이프라인 스테이지 사이에는 파이프라인 레지스터(221~228)가 설치되고, 제3 파이프라인 스테이지와 제4 파이프라인 스테이지 사이에는 파이프라인 레지스터(231~237)가 설치된다.
파이프라인 레지스터(211~219, 221~228, 231~237)를 설치함으로써, 연산 유닛(200)은 이하와 같이 파이프라인 처리를 실현한다. 연속하는 4개의 사이클 Ti(i=0, 1, 2, 3)에서 연산 코드 COM#i와 M비트의 입력값 A(i) 및 B(i)가 연산 유닛(200)에 입력되는 것으로 가정한다. 각 파이프라인 레지스터는, 사이클 Ti에 동기하여 전단의 파이프라인 스테이지의 출력값을 래치하여 기억값을 갱신한다.
사이클 T3에서, 연산 코드 COM#3, 입력값 A(3)[(M1-1):0] 및 B(3)[(M1-1):0]이, 제1 부분 연산 유닛(201)에 입력된다. 제1 부분 연산 유닛(201)은, A(3)[(M1-1):0]과 B(3)[(M1-1):0]을 입력으로 하여, 연산 코드 COM#3에 의해 지정되는 연산을 행한다.
그 동안, 파이프라인 레지스터(211)는, 사이클 T2에서 연산 유닛(200)에 공급된 연산 코드 COM#2를 유지하고 있다.
또한, 파이프라인 레지스터(212)는 A(2)[(M2-1):M1]을 유지하고 있고, 파이프라인 레지스터(213)는 B(2)[(M2-1):M1]을 유지하고 있으며, 파이프라인 레지스터(214)는 A(2)[(M3-1):M2]를 유지하고 있고, 파이프라인 레지스터(215)는 B(2)[(M3-1):M2]를 유지하고 있으며, 파이프라인 레지스터(216)는 A(2)[(M-1):M3]을 유지하고 있고, 파이프라인 레지스터(217)는 B(2)[(M-1):M3]을 유지하고 있다.
파이프라인 레지스터(218)는, 사이클 T2에서 제1 부분 연산 유닛(201)이 연산한 연산 결과 S1(2)를 유지하고 있고, 파이프라인 레지스터(219)는 그 연산 결과 의 캐리 C1(2)를 유지하고 있다. 제1 부분 연산 유닛(201)은 사이클 T2에서, A(2)[(M1-1):0]과 B(2)[(M1-1):0]을 입력으로 하여, 연산 코드 COM#2에 의해 지정되는 연산을 행하고 있다.
또한 사이클 T3에서는, 파이프라인 레지스터(211)에 유지되어 있는 연산 코드 COM#2와, 파이프라인 레지스터(212 및 213)에 유지되어 있는 입력값 A(2)[(M2-1):M1] 및 B(2)[(M2-1):M1]과, 사이클 T2에서의 제1 부분 연산 유닛(201)의 연산 결과의 캐리 C1(2)가, 제2 부분 연산 유닛(202)에 입력된다. 그리고 제2 부분 연산 유닛(202)은, 입력값 A(2)[(M2-1):M1] 및 B(2)[(M2-1):M1]과, 캐리 C1(2)를 입력으로 하여, 연산 코드 COM#2에 의해 지정되는 연산을 행한다.
그 동안, 파이프라인 레지스터(221)는, 사이클 T1에서 연산 유닛(200)에 공급된 연산 코드 COM#1을 유지하고 있다. 또한, 파이프라인 레지스터(222)는 A(1)[(M3-1):M2]를 유지하고 있고, 파이프라인 레지스터(223)는 B(1)[(M3-1):M2]를 유지하고 있으며, 파이프라인 레지스터(224)는 A(1)[(M-1):M3]을 유지하고 있고, 파이프라인 레지스터(225)는 B(1)[(M-1):M3]을 유지하고 있다.
그리고, 파이프라인 레지스터(226)는, 사이클 T1에서 제1 부분 연산 유닛(201)이 연산한 연산 결과 S1(1)을 유지하고 있다. 제1 부분 연산 유닛(201)은 사이클 T1에서, A(1)[(M1-1):0]과 B(1)[(M1-1):0]을 입력으로 하여, 연산 코드 COM#1에 의해 지정되는 연산을 행하고 있다.
또한, 파이프라인 레지스터(227)는, 제2 부분 연산 유닛(202)이 사이클 T2에서 행한 연산 결과 S2(1)을 유지하고 있고, 파이프라인 레지스터(228)는 그 캐리 C2(1)을 유지하고 있다. 제2 부분 연산 유닛(202)은 사이클 T2에서, 사이클 T1에서의 제1 부분 연산 유닛(201)의 연산 결과의 캐리 C1(1)과, A(1)[(M2-1):M1] 및 B(1)[(M2-1):M1]을 입력으로 하여, 연산 코드 COM#1에 의해 지정되는 연산을 행하고 있다.
사이클 T3에서는, 파이프라인 레지스터(221)에 유지되어 있는 연산 코드 COM#1과, 파이프라인 레지스터(222 및 223)에 유지되어 있는 입력값 A(1)[(M3-1):M2] 및 B(1)[(M3-1):M2]와, 사이클 T2에서의 제2 부분 연산 유닛(202)의 연산 결과의 캐리 C2(1)이, 제3 부분 연산 유닛(203)에 입력된다. 그리고 제3 부분 연산 유닛(203)은, 입력값 A(1)[(M3-1):M2] 및 B(1)[(M3-1):M2]와, 캐리 C2(1)을 입력으로 하여, 연산 코드 COM#1에 의해 지정되는 연산을 행한다.
그 동안, 파이프라인 레지스터(231)는, 사이클 T0에서 연산 유닛(200)에 공급된 연산 코드 COM#0을 유지하고 있다. 또한, 파이프라인 레지스터(232)는 A(0)[(M-1):M3]을 유지하고 있고, 파이프라인 레지스터(233)는 B(0)[(M-1):M3]을 유지하고 있다.
그리고, 파이프라인 레지스터(234)는, 사이클 T0에서 제1 부분 연산 유닛(201)이 연산한 연산 결과 S1(0)을 유지하고 있다. 제1 부분 연산 유닛(201)은 사이클 T0에서, A(0)[(M1-1):0]과 B(0)[(M1-1):0]을 입력으로 하여, 연산 코드 COM#0에 의해 지정되는 연산을 행하고 있다.
파이프라인 레지스터(235)는, 사이클 T1에서 제2 부분 연산 유닛(202)이 연산한 연산 결과 S2(0)을 유지하고 있다. 제2 부분 연산 유닛(202)은 사이클 T1에 서, 사이클 T0에서의 제1 부분 연산 유닛(201)의 연산 결과의 캐리 C1(0)과, A(0)[(M2-1):M1] 및 B(0)[(M2-1):M1]을 입력으로 하여, 연산 코드 COM#0에 의해 지정되는 연산을 행하고 있다.
파이프라인 레지스터(236)는, 사이클 T2에서 제3 부분 연산 유닛(203)이 연산한 연산 결과 S3(0)을 유지하고 있고, 파이프라인 레지스터(237)는 그 캐리 C3(0)을 유지하고 있다. 제3 부분 연산 유닛(203)은 사이클 T2에서, 사이클 T1에서의 제2 부분 연산 유닛(202)의 연산 결과의 캐리 C2(0)과, A(0)[(M3-1):M2] 및 B(0)[(M3-1):M2]를 입력으로 하여, 연산 코드 COM#0에 의해 지정되는 연산을 행하고 있다.
사이클 T3에서는, 파이프라인 레지스터(231)에 유지되어 있는 연산 코드 COM#0과, 파이프라인 레지스터(232 및 233)에 유지되어 있는 입력값 A(0)[(M-1):M3] 및 B(0)[(M-1):M3]과, 사이클 T2에서의 제3 부분 연산 유닛(203)의 연산 결과의 캐리 C3(0)이, 제4 부분 연산 유닛(204)에 입력된다. 그리고 제4 부분 연산 유닛(204)은, 입력값 A(0)[(M-1):M3] 및 B(0)[(M-1):M3]과, 캐리 C3(0)을 입력으로 하여, 연산 코드 COM#0에 의해 지정되는 연산을 행한다. 그리고 그 연산 결과 S4(0) 및 플래그 F를 출력한다.
이상의 설명으로부터 알 수 있는 바와 같이, 연산 코드 COM#0에 의해 지정되는 1개의 연산 중,0비트째부터 (M1-1)비트째의 부분은 제1 부분 연산 유닛(201)에 의해 사이클 T0에서 행해지고, M1비트째부터 (M2-1)비트째의 부분은 제2 부분 연산 유닛(202)에 의해 사이클 T1에서 행해지고, M2비트째부터 (M3-1)비트째의 부분은 제3 부분 연산 유닛(203)에 의해 사이클 T2에서 행해지고, M3비트째부터 (M-1)비트째의 부분은 제4 부분 연산 유닛(204)에 의해 사이클 T3에서 행해진다. 그리고, 각각의 연산 결과는 동시에 사이클 T3에서, 파이프라인 레지스터(234~236) 및 부분 연산 유닛(204)으로부터 출력된다.
또한 사이클 T3에서, 제1~제4 부분 연산 유닛(201~204)은, 각각, 사이클 T3~T0에 연산 유닛(200)에 입력된 서로 다른 연산 COM#0~3을 병렬하여 행하고 있어, 연산 유닛(200)이 파이프라인 처리를 행하고 있는 것을 알 수 있다.
도 5는 도 4에 도시하는 파이프라인 레지스터(211)의 개략 구성도이다. 다른 파이프라인 레지스터(212~219, 221~228 및 231~237)도 마찬가지의 구성을 갖고 있다. 파이프라인 레지스터(211)는, 클럭 신호 CK에 동기하여, n비트 입력 데이터 Din을 래치하는 플립플롭(FF)(261)과, 모드 절환 신호 CKEN의 값에 따라서, 플립플롭(261)의 출력값 및 입력 데이터 Din 중 한쪽을 파이프라인 레지스터(211)의 출력으로서 선택하는 멀티플렉서(MUX)(262)를 구비한다. 본 구성예에서는, CKEN=「H」일 때 플립플롭(261)의 출력값이 파이프라인 레지스터(211)의 출력으로서 출력되고, CKEN=「L」일 때 입력 데이터가 그대로 출력된다.
따라서, 파이프라인 레지스터(211)는, CKEN=H일 때 입력 클럭 CK에 동기하여 출력값을 갱신하는 플립플롭 모드에서 동작하고, CKEN=L일 때 입력값을 그대로 출력하는 트랜스페어런트 모드에서 동작한다.
도 4에 도시하는 연산 유닛(200)에서는, 제1 파이프라인 스테이지와 제2 파이프라인 스테이지 사이의 파이프라인 레지스터(211~219)에는 동일한 클럭 신호 φ20과 동일한 모드 절환 신호 CKEN20이 공급된다. 또한, 제2 파이프라인 스테이지와 제3 파이프라인 스테이지 사이의 파이프라인 레지스터(221~228)에는 동일한 클럭 신호 φ21과 동일한 모드 절환 신호 CKEN21이 공급된다. 제3 파이프라인 스테이지와 제4 파이프라인 스테이지 사이의 파이프라인 레지스터(231~237)에는 동일한 클럭 신호 φ22와 동일한 모드 절환 신호 CKEN22가 공급된다.
모드 절환 신호 CKEN20~CKEN22의 값을 변화시켜 파이프라인 레지스터의 동작 모드를 변경함으로써, 연산 유닛(200)의 파이프라인 단수 즉 연산 유닛(200)의 병렬 연산 실행수를 변경할 수 있다. 이하, 연산 유닛(200)이 병렬로 실행하는 연산의 수를 「병렬수」라고 나타내는 경우가 있다.
모든 파이프라인 레지스터를 플립플롭 모드에서 동작시키면, 연산 유닛(200)의 파이프라인 단수는 4로 되어, 연산 유닛(200)은 4개의 서로 다른 연산을 병렬로 행할 수 있다.
파이프라인 레지스터(211~219와 231~237)를 트랜스페어런트 모드에서 동작시키고, 또한 파이프라인 레지스터(221~228)를 플립플롭 모드에서 동작시키면, 파이프라인 레지스터(211~219)에 의해 나누어져 있던 제1 및 제2 파이프라인 스테이지가 1개의 파이프라인 스테이지로 되고, 또한 파이프라인 레지스터(231~237)에 의해 나누어져 있는 제3 및 제4 파이프라인 스테이지가 1개의 파이프라인 스테이지로 되므로, 연산 유닛(200)의 파이프라인 단수는 2로 된다.
모든 파이프라인 레지스터를 트랜스페어런트 모드에서 동작시키면,이미 연산 유닛(200)은 파이프라인 처리를 행하지 않으므로, 연산 유닛(200)의 병렬수는 1 로 된다.
도 6은 병렬수가 1일 때의 연산 유닛(200)의 동작의 타임 차트이다. 구형파 「×1CLK」는 연산 유닛(200)이 1개의 M비트 연산을 완료하는 데에 사용하는 사이클을 나타낸다. 따라서 구형파 ×1CLK의 1주기가 기본 주기로 된다.
신호 「CD0」은 제1 부분 연산 유닛(201)에 입력되는 연산 코드를 나타내고, 신호 「CD1」은 제2 부분 연산 유닛(202)에 입력되는 연산 코드를 나타내고, 신호 「CD2」는 제3 부분 연산 유닛(203)에 입력되는 연산 코드를 나타내고, 신호 「CD3」은 제3 부분 연산 유닛(204)에 입력되는 연산 코드를 나타낸다.
또한, 신호 「A」 및 「B」는 제1 부분 연산 유닛(201) 및 파이프라인 레지스터(212~217)에 입력되는 입력 데이터를 나타낸다. 또한, 「φ20」 및 「CKEN20」은, 파이프라인 레지스터(211~219)에 공급되는 클럭 신호 및 모드 절환 신호를 나타내고, 「φ21」 및 「CKEN21」은, 파이프라인 레지스터(221~228)에 공급되는 클럭 신호 및 모드 절환 신호를 나타내고, 「φ22」 및 「CKEN22」는, 파이프라인 레지스터(231~237)에 공급되는 클럭 신호 및 모드 절환 신호를 나타낸다.
도시하는 바와 같이, 모드 절환 신호 CKEN20~22는 모두 「L」로 설정되어 있어, 모든 파이프라인 레지스터가 트랜스페어런트 모드에서 동작한다. 이 때문에 모든 부분 연산 유닛(201~204)이 1개의 M비트 연산을 분할한 각 부분 연산을 동시에 실행하므로, 연산 유닛(200)의 병렬수는 1로 된다. 또한 각 클럭 φ20~φ22의 사이클은 기본 주기와 동일한 길이로 설정된다.
도 7은 병렬수가 2일 때의 연산 유닛(200)의 동작의 타임 차트이다. 이 경 우, 1개의 기본 주기 동안에 2개의 연산을 병렬로 실행하기 위해서, 각 클럭 φ20~φ22의 사이클을 기본 주기의 1/2의 길이로 설정하여, 연산 유닛(200)을 동작시킨다.
지금, 사이클 Ti(i=1, 2, 3)의 전반에서 연산 유닛(200)에, 명령 #ia 및 입력 Aa(i) 및 Ba(i)가 공급되고, 사이클 Ti의 후반에서 연산 유닛(200)에, 명령 #ib 및 입력 Ab(i) 및 Bb(i)가 공급된 것으로 가정한다.
또한, 모드 절환 신호 CKEN21을 「H」로 설정하고, 모드 절환 신호 CKEN20 및 22는 「L」로 설정한다. 이 때문에, 제2 부분 연산 유닛(202)을 포함하는 제2 파이프라인 스테이지와 제3 부분 연산 유닛(203)을 포함하는 제3 파이프라인 스테이지 사이의 파이프라인 레지스터(221~228)만이 플립플롭으로서 동작한다. 따라서, 제1 부분 연산 유닛(201) 및 제2 부분 연산 유닛(202)이 동일한 M비트 연산의 부분 연산을 동시에 실행하고, 제3 부분 연산 유닛(203) 및 제4 부분 연산 유닛(204)은, 제1 부분 연산 유닛(201)이 연산한 M비트 연산보다도 1/2 기본 주기 전에 연산 유닛(200)에 입력된 M비트 연산의 부분 연산을 실행한다. 이와 같이 하여 연산 유닛(200)은, 파이프라인 처리에 의해 2개의 연산을 병렬로 실행한다.
도 8은 병렬수가 4일 때의 연산 유닛(200)의 동작의 타임 차트이다. 이 경우, 1개의 기본 주기 동안에 4개의 연산을 병렬로 실행하기 위해서, 각 클럭 φ20~φ22의 사이클을 기본 주기의 1/4의 길이로 설정하여, 연산 유닛(200)을 동작시킨다.
지금 연산 유닛(200)에, 사이클 Ti(i=1, 2, 3)의 제1 사반기에서 연산 유 닛(200)에 명령 #ia 및 입력 Aa(i) 및 Ba(i)가, 제2 사반기에서 연산 유닛(200)에 명령 #ib 및 입력 Ab(i) 및 Bb(i)가, 제3 사반기에서 연산 유닛(200)에 명령 #ic 및 입력 Ac(i) 및 Bc(i)가, 제4 사반기에서 연산 유닛(200)에 명령 #id 및 입력 Ad(i) 및 Bd(i)가 공급된 것으로 가정한다.
모드 절환 신호 CKEN20~22를 「H」로 설정한다. 이 때문에, 모든 파이프라인 스테이지 사이에 설치된 파이프라인 레지스터(221~228)가 플립플롭으로서 동작한다. 따라서 제2 부분 연산 유닛(202)은, 제1 부분 연산 유닛(201)이 실행한 M비트 연산보다도 1/4 기본 주기분 선행하는 M비트 연산의 부분 연산을 실행하고, 제3 부분 연산 유닛(203)은, 제2 부분 연산 유닛(202)이 실행한 M비트 연산보다도 1/4 기본 주기분 선행하는 M비트 연산의 부분 연산을 실행하고, 제4 부분 연산 유닛(204)은, 제3 부분 연산 유닛(203)이 실행한 M비트 연산보다도 1/4 기본 주기분선행하는 M비트 연산의 부분 연산을 실행한다. 이와 같이 하여 연산 유닛(200)은, 파이프라인 처리에 의해 4개의 연산을 병렬로 실행한다.
상기한 바와 같이, 연산 유닛(200)은, M비트 연산을 1개씩 행하는 연산 유닛으로서 동작할 수 있고, 또한 2개 또는 4개의 M비트 연산을 병렬로 행하는 연산 유닛으로서 동작할 수 있다.
본 발명에 따른 연산 유닛(200)에 의하면, 도 9에 도시하는 바와 같이, 실행 스테이지에서, 실행 기간을 1/N 기본 주기 어긋나게 하면서 N개의 연산을 실행하는 N단의 파이프라인 처리를 행함으로써, 1개의 연산 유닛에서 복수의 연산을 병렬로 실행할 수 있다. 이 때문에, VLIW 프로세서나 슈퍼스칼라 프로세서에서, 종래보다 도 적은 수의 연산 유닛에 의해 복수의 연산을 병렬로 실행할 수 있어, 레지스터 파일이나 기억 수단과 연산 유닛을 연결하는 데이터 패스의 배선을 저감할 수 있다.
또한, 본 발명에 따른 연산 유닛(200)에 의하면, 필요에 따라서, 실행 스테이지에서 병렬로 실행하는 연산수를 증감시키는 것이 가능하게 된다. 필요 최저한의 실행 명령수로 처리함으로써 소비 전력을 절약할 수 있다.
이하, 첨부하는 도면을 참조하여 본 발명의 실시예를 설명한다. 도 10은 본 발명에 따른 VLIW 프로세서의 실시예를 도시하는 개략 구성도이다. 프로세서(1)는 2개의 32비트의 데이터끼리의 수치 연산 또는 논리 연산을 행하기 위한 연산부(17)를 갖고,이 연산부(17)는, 도 4를 참조하여 설명한 연산 유닛(200)과 마찬가지의 구성을 갖는다.
또한 프로세서(1)는, 프로그램 카운터(PC)를 제어하는 프로그램 카운터(PC) 제어부(10)와, 프로그램 카운터가 나타내는 명령 메모리(500) 내의 어드레스로부터 페치한 명령을 유지하는 명령 버퍼(InstBuff)(11)와, 명령 버퍼(11)로부터 취출한 명령을 디코드하여 중간 코드와 오퍼랜드를 생성하는 메인 디코더(12)를 구비한다.
또한 프로세서(1)는, 어큐뮬레이터, 범용 레지스터 및 베이스 레지스터 등의 각종 레지스터를 기억하는 레지스터 파일(14)과, 어드레스 연산을 위한 어드레스 연산기(15)와, 메인 디코더(12)에 의해 생성된 중간 코드로부터 실행 코드와 오퍼랜드 선택 신호를 취출하는 LS 디코더(13)와, 오퍼랜드 선택 신호에 따라서, 레지스터 파일(14)로부터 읽어낸 레지스터값, 즉값의 오퍼랜드 및 데이터 메모리(501) 로부터 읽어낸 데이터 중 어느 하나로부터, 연산부(17)에의 입력값을 선택하는 멀티플렉서(16)를 구비한다.
프로세서(1)는, 실행 코드에 포함되는 코드에 기초하여 분기 제어 신호 및 메모리 기입 제어 신호를 생성하는 WR 디코더(18)와, 기준 클럭 신호 RefCLK에 기초하여, 프로세서(1)의 각 부를 동작시키는 클럭 신호 및 연산부(17)의 파이프라인 단수를 변경하는 모드 절환 신호를 생성하는 클럭 제어부(19)를 구비한다.
이하, 도 11~도 13을 참조하여, 프로세서(1) 내의 각 요소간의 접속 관계를 설명한다. 도 11은 명령 메모리(500), 프로그램 카운터 제어부(10), 명령 버퍼(11), 메인 디코더(12), 연산부(17), WR 디코더(18) 및 클럭 제어부(19) 사이의 접속 관계를 도시하는 도면이다.
클럭 제어부(19)는, 기준 클럭 신호 RefCLK를 수신하고, 기준 클럭 신호 RefCLK와 동일한 주기 및 위상을 갖고 명령 버퍼(11)에 의한 페치 타이밍을 정하는 페치 타이밍 클럭 신호 Ckf와, 기준 클럭 신호 RefCLK를 1/8 주기 지연시킨 메인 클럭 MainCLK를 생성한다.
또한, 병렬수가 1일 때 즉 연산부(17)가 복수의 32비트 연산을 병렬로 행하지 않을 때에는, 연산부(17)는, 페치 타이밍 클럭 신호 Ckf의 주기와 동일한 주기에서 1개의 32비트 연산을 처리한다. 따라서, 페치 타이밍 클럭 신호 Ckf와 동일한 주기의 클럭 신호인 기준 클럭 신호 RefCLK 및 메인 클럭 MainCLK의 주기를 「기본 주기 ΔTb」라고 기재하는 경우가 있다.
또한 클럭 제어부(19)는, 메인 클럭 MainCLK보다도 4배 빠른 클럭 신호 × 4CLK를 생성한다. 클럭 신호 ×4CLK의 주기는 ΔTb/4이다.
프로그램 카운터 제어부(10)는, 클럭 제어부(19)로부터 메인 클럭 MainCLK를 수신하고, 내부에 기억하는 프로그램 카운터의 값을 메인 클럭 MainCLK에 동기하여 갱신하고, 명령 메모리(500)에 프로그램 카운터의 값 InstAddr을 출력한다. 또한 WR 디코더(18)로부터 분기 제어 신호(BranchCntrl)를 수신하고, 연산부(17)로부터 행선지 어드레스를 수신한다.
명령 버퍼(11)는, 명령 메모리(500) 내의, 프로그램 카운터 제어부(10)에 의해 지정된 어드레스 InstAddr에 기억된 명령을 읽어들이고, 그 명령 코드(Code)와 명령 오퍼랜드(Operand)를 메인 디코더(12)에 출력한다.
도 12는 메인 디코더(12), 레지스터 파일(14), LS 디코더(13), 데이터 메모리(501), 어드레스 연산기(15), 연산부(17) 및 클럭 제어부(19) 사이의 접속 관계를 도시하는 도면이다.
메인 디코더(12)는, VLIW 명령인 명령 버퍼(11)로부터 수신한 명령 코드 및 명령 오퍼랜드를 디코드하여, 연산부(17)가 실행하는 연산의 종류를 지정하는 실행 코드를 포함하는 중간 코드와 각 오퍼랜드를 출력한다.
메인 디코더(12)는, 명령 버퍼(11)로부터 수신한 VLIW 명령을 디코드하면, 이들 명령에 포함되어 있는 연산수 P#을 검출한다. 이 연산수 P#은, 실행 스테이지 즉 연산부(17)에서 병렬로 실행되는 연산의 수를 나타낸다. 도 4를 참조하여 설명한 연산 유닛(200)의 설명에서의 용어의 용법에 따라서, P#도 「병렬수」라고 부르는 경우가 있다.
메인 디코더(12)의 출력 단자 CodeS 및 CodeM, 및 R0#S, R0#M, R1#S, R1#M, Ridx#, ImmD# 및 ImmA#으로부터 출력되는 신호는 이하와 같다.
출력 단자 CodeS 및 CodeM으로부터는, 연산부(17)가 실행하는 연산의 종류를 지정하는 실행 코드와 데스티네이션 레지스터의 지정을 포함하는 중간 코드가 출력된다. 또한 중간 코드는 데이터 메모리(501)에의 연산 결과의 기입 유무를 나타내는 메모리 기입 제어 신호나 분기 명령이나 점프 명령에 수반되는 분기 제어 신호도 포함하고 있다.
병렬수 P#=1이었을 때에는, 메인 디코더(12)는, 디코드에 의해 생성된 중간 코드를 출력 단자 CodeS로부터 멀티플렉서(31)에 출력한다. 또한 병렬수 P#>1이었을 때에는 복수의 중간 코드를 출력 단자 CodeM으로부터 순서대로 1개씩 멀티플렉서(31)에 출력한다.
단자 R0#S 및 R0#M으로부터는 제1 소스 레지스터를 지정하는 레지스터 번호가 출력되고, 단자 R1#S 및 R1#M으로부터는 제2 소스 레지스터를 지정하는 레지스터 번호가 출력된다. 병렬수 P#=1이었을 때에는 메인 디코더(12)는, 출력 단자 R0#S 및 R1#S로부터 각각 제1 및 제2 소스 레지스터의 레지스터 번호를 멀티플렉서(32 및 33)에 출력한다.
한편 병렬수 P#>1이었을 때에는 메인 디코더(12)는, 복수의 제1 레지스터 번호 및 제2 소스 레지스터의 레지스터 번호를, 각각 출력 단자 R0#M 및 R1#M으로부터 순서대로 1개씩 멀티플렉서(32 및 33)에 출력한다.
메인 디코더(12)는, 병렬수 P#이 1인지 그것보다 큰지를 나타내는 선택 신호 Sel을 생성한다. 멀티플렉서(31)는 선택 신호 Sel에 따라서, 단자 CodeS 및 CodeM 중 어느 한쪽을 레지스터(41)에 접속한다. 선택된 단자로부터 출력되는 중간 코드 CodeD가 레지스터(41)에 유지된다.
멀티플렉서(32)는 선택 신호 Sel에 따라서, 단자 R0#S 및 R0#M 중 어느 한쪽을 레지스터(42)에 접속한다. 선택된 단자로부터 출력되는 제1 소스 레지스터의 레지스터 번호 Rs0이 레지스터(42)에 유지된다.
멀티플렉서(33)는 선택 신호 Sel에 따라서, 단자 R1#S 및 R1#M 중 어느 한쪽을 레지스터(43)에 접속한다. 선택된 단자로부터 출력되는 제2 소스 레지스터의 레지스터 번호 Rs1이 레지스터(43)에 유지된다.
단자 Ridx#으로부터는 데이터 전송 명령용의 베이스 레지스터의 레지스터 번호 Ridx가 출력된다. 또한 단자 ImmD#으로부터는 연산용의 즉값 오퍼랜드 IM이 출력된다. 또한 단자 ImmA#으로부터는 데이터 전송 명령용의 오프셋값 ImmA가 출력된다.
또한, 본 실시예에 따른 프로세서(1)는, 병렬 명령인 VLIW 명령 내에 데이터 전송 명령 및 즉값을 이용한 연산 명령을 포함시키는 것을 금지하는 것으로 하고, 명령 버퍼(11)로부터 읽어들인 VLIW 명령이 병렬 명령인 경우에는, 단자 Ridx#, ImmD# 및 ImmA#으로부터의 데이터 출력은 없다.
레지스터 번호 Ridx는, 레지스터 파일(14)의 읽어내기 레지스터 번호 지정 입력 p2A로서 레지스터 파일(14)에 입력되고, 레지스터 번호 Ridx에 의해 지정된 베이스 레지스터의 값이 출력 포트 p2D0으로부터 출력되어 어드레스 연산기(15)에 수신된다. 어드레스 연산기(15)는, 수신한 베이스 레지스터의 값에 오프셋값 ImmA를 더하여 얻은 메모리 어드레스를 산출한다. 이 메모리 어드레스는, 레지스터 파일(14)의 입력 포트 p2Di에 수신되고, 또한 레지스터(45)에 유지된다. 또한 즉값 오퍼랜드 IM은 레지스터(44)에 유지된다.
레지스터(41~45)는, 레지스터 파일(14)이나 데이터 메모리(501)에의 액세스 동안, 메인 디코더(12)의 디코드 결과를 유지하기 위한 레지스터이다. 레지스터(41~45)는, 후술하는 바와 같이 생성되는 디코드 결과 유지 타이밍 클럭 신호 Ckd에 동기하여, 전술한 각 신호를 래치하여 유지 내용을 갱신한다.
레지스터(41)로부터 출력되는 중간 코드 CodeD는, LS 디코더(13)에 수신된다. LS 디코더(13)는, 연산부(17)가 실행하는 연산의 종류를 지정하는 실행 코드 CodeExe와, 제2 오퍼랜드를 선택하는 오퍼랜드 선택 신호 OperandSel을 취출한다. 실행 코드 CodeExe는 레지스터(51)에 유지된다.
레지스터(42 및 43)로부터 출력되는 제1 및 제2 소스 레지스터의 레지스터 번호 Rs0 및 Rs1은, 각각 레지스터 파일(14)의 읽어내기 레지스터 번호 지정 입력 p0A 및 p1A로서, 레지스터 파일(14)에 수신된다.
레지스터 번호 Rs0에 의해 지정된 레지스터의 내용 RA는, 출력 포트 p0Do로부터 출력되어, 연산부(17)의 제1 입력 데이터 A로서 레지스터(52)에 유지된다.
레지스터 번호 Rs1에 의해 지정된 레지스터의 내용 RB는, 출력 포트 p1Do로부터 출력되어, 멀티플렉서(16)에 유지된다.
멀티플렉서(16)에는 또한, 레지스터(44)로부터 출력되는 즉값 오퍼랜드 IM 과, 레지스터(45)로부터 출력되는 메모리 어드레스에 의해 어드레스된 데이터 메모리(501) 내의 데이터 M도 또한 입력된다. 멀티플렉서(16)는 오퍼랜드 선택 신호 OperandSel에 따라서 이들 데이터 RB, IM 및 M 중 어느 하나를 선택하여, 연산부(17)의 제2 입력 데이터 B로 하여, 레지스터(53)에 유지한다.
레지스터(51, 52 및 53)는, 선입선출(FIFO) 버퍼로서, 디코드 결과 유지 타이밍 클럭 신호 Ckd에 동기하여, 각각 실행 코드 CodeExe, 제1 입력 데이터 A 및 제2 입력 데이터 B를 래치한다. 그리고 명령 투입 타이밍 클럭 신호 Cke에 동기하여, 현재 기억하고 있는 데이터 중 가장 먼저 입력된 것을 순차적으로 취출한다.
연산부(17)는, 2개의 입력 데이터 A 및 B 사이에서, 실행 코드 CodeExe에 의해 지정되는 연산을 행하면, 그 연산 결과 S와 플래그 F를 각각 레지스터 파일(14)의 입력 포트 p3Di 및 pfDi에 출력하고, 또한 결과 S를 기입하는 데스티네이션 레지스터의 레지스터 번호 Rd를, 레지스터 파일(14)의 기입 레지스터 번호 지정 입력 p3A에 출력한다.
레지스터 파일(14)은, 클럭 제어부(19)로부터 공급되는 레지스터 갱신 클럭 φ23에 동기하여, 기입 레지스터 번호 지정 입력 p3A에 지정된 레지스터와 플래그 레지스터의 값을 갱신한다.
또한 데이터 메모리(501)는, 후술하는 WR 디코더(18)로부터 메모리 기입 제어 신호 WriteEnable 신호를 수신한다. 메모리 기입 제어 신호 WriteEnable 신호가, 데이터 메모리(501)에의 기입을 지시하는 것을 의미하는 경우에는, 데이터 메모리(501)는, 연산부(17)에 의한 연산 결과를 기억한다.
클럭 제어부(19)는, 메인 클럭 MainCLK 및 클럭 신호 ×4CLK를 생성하여, 각각 데이터 메모리(501) 및 메인 디코더(12)에 공급한다.
또한 클럭 제어부(19)는, 메인 디코더(12)가 검출한 병렬수 P#을 수신한다. 그리고 수신된 병렬수 P#에 따라서, 디코드 결과 유지 타이밍 클럭 신호 Ckd, 명령 투입 타이밍 클럭 신호 Cke 및 클럭 φ23을 생성한다.
또한 클럭 제어부(19)는, 도 4~도 8을 참조하여 설명한, 연산부(17)에 공급되는 클럭 신호 φ20~φ22 및 모드 절환 신호 CKEN20~CKEN22를, 병렬수 P#에 따라서 생성한다. 클럭 제어부(19)의 구성, 및 각 클럭 신호 및 모드 절환 신호의 생성 동작은 후술한다.
도 13은 연산부(17), WR 레코더(18), 프로그램 카운터 제어부(10), 데이터 메모리(501) 및 클럭 제어부(19) 사이의 접속 관계를 도시하는 도면이다.
연산부(17)는, 레지스터(51)로부터 입력된 실행 코드 CodeExe를 디코드하여 그 중에서 취출한 코드 CodeWrite와, 플래그 F 및 연산 결과 S를 출력한다. 레지스터(61, 62 및 63)는, 클럭 제어부(19)로부터 공급되는 실행 결과 유지 타이밍 클럭 Ckw에 동기하여, 코드 CodeWrite와, 플래그 F 및 연산 결과 S를 출력한다. 코드 CodeWrite는, 실행 코드 CodeExe가 분기 명령이나 점프 명령인지의 여부, 및 실행 코드 CodeExe가 연산 결과를 데이터 메모리(501)에 출력하는 명령인지의 여부를 나타내는 코드이다.
WR 레코더(18)는, 레지스터(61)에 유지된 코드 CodeWrite와, 레지스터(62)에 유지된 플래그 F의 결과에 기초하여, 분기 제어 신호 BranchCntrl 및 메모리 기입 제어 신호 WriteEnable를 생성한다. 분기 제어 신호 BranchCntrl은 프로그램 카운터 제어부(10)에 수신되고, 메모리 기입 제어 신호 WriteEnable는 데이터 메모리(501)에 수신된다.
또한, 실행 코드 CodeExe가 분기 명령 또는 점프 명령인 경우에는, 연산부(17)는, 연산 결과 S로서 행선지 어드레스 JmpAddr을 출력한다. 따라서 레지스터(63)로부터 출력되는 연산 결과 S는, 프로그램 카운터 제어부(10)에 공급된다.
레지스터(63)로부터 출력되는 연산 결과 S는 데이터 메모리(501)에도 공급된다. 실행 코드 CodeExe가 연산 결과를 데이터 메모리(501)에 출력하는 명령인 경우에는, 연산부(17)의 연산 결과 S는 데이터 메모리(501)에 기입된다.
도 14는 프로그램 카운터 제어부(10)의 개략 구성도이다. 프로그램 카운터 제어부(10)는, 프로그램 카운터의 값 InstAddr을 유지하는 레지스터(101)와, 분기 제어 신호 BranchCntrl을 디코드하는 디코더(102)와, 디코더(102)의 디코드 결과에 따라서, 직전에 분기 명령이 실행되었을 때에는 JmpAddr을 선택할 것 같지 않은 경우에는 상수 1을 선택하는 멀티플렉서(103)와, 현재의 프로그램 카운터로부터 다음 프로그램 카운터를 연산하는 연산기(104)를 구비하고 있다.
도 15는 메인 디코더(12)의 개략 구성도이다. 메인 디코더(12)는, 병렬수 신호 발생부(111)와, 레지스터(112)와, 스톨 신호 생성부(113)와, Sel 신호 생성부(114)를 구비한다.
병렬수 신호 발생부(111)는, 명령 버퍼(11)로부터 읽어들인 명령 코드(Code) 및 명령 오퍼랜드(Operand)에 포함되는 연산 명령수를 검출하고, 병렬수 신호 P#을 생성한다.
스톨 신호 생성부(113)는, 메인 디코더(12)가 금회의 페치 타이밍에서 수신한 명령의 병렬수 P#(0)과, 전회의 페치 타이밍에서 수신한 명령의 병렬수 P#(-1)을 수신한다. 스톨 신호 생성부(113)는, 전회 수신한 명령의 병렬수가 1보다 크고(P#(-1)>1), 또한 전회 수신한 명령의 병렬수와 금회 수신한 명령의 병렬수가 서로 다른 때(P#(-1)≠P#(0))일 때, 금회 수신한 명령 대신에 NOP 명령을 발행하는 것을 요구하는 스톨 신호를 생성한다. 스톨 신호는, 후술하는 싱글 명령 디코드부(115), 병렬 명령 디코드부(116) 및 명령 전송 수단(118)에 수신된다.
Sel 신호 생성부(114)는, 병렬수 P#에 따라서, 멀티플렉서(31~33)의 절환 동작을 제어하는 선택 신호 Sel을 생성한다.
또한 메인 디코더(12)는, 싱글 명령 디코드부(115)와, 병렬 명령 디코드부(116)와, 명령 큐(117)와, 명령 전송 수단(118)을 구비한다.
싱글 명령 디코드부(115)는, 명령 버퍼(11)로부터 읽어들인 명령 코드(Code) 및 명령 오퍼랜드(Operand)에 1개의 연산 명령밖에 포함되지 않을 때, 이들을 디코드하여 1조의 중간 코드와 오퍼랜드를 생성한다. 그리고 중간 코드를 CodeS 단자에 출력하고, 또한 오퍼랜드를, R0#S 단자, R1#S 단자, Ridx# 단자, ImmD# 단자 및 ImmA# 단자에 출력한다. 또한, 싱글 명령 디코드부(115)는, 스톨 신호 생성부(113)로부터 스톨 신호를 수신하고 있는 동안에는, 생성한 중간 코드와 오퍼랜드의 출력과 명령 버퍼(11)로부터의 명령의 읽어들이기를 정지하고, NOP 명령을 발행한다.
병렬 명령 디코드부(116)는, 명령 코드 및 명령 오퍼랜드에 복수의 연산 명령이 포함될 때, 이들을 디코드하여, 복수 조의 중간 코드와 오퍼랜드를 생성한다. 그리고 이들 중간 코드와 오퍼랜드를 명령 큐(117)에 출력한다. 또한, 병렬 명령 디코드부(116)는, 스톨 신호 생성부(113)로부터 스톨 신호를 수신하고 있는 동안에는, 명령 버퍼(11)로부터의 명령의 읽어들이기를 정지한다.
명령 큐(117)는, 병렬 명령 디코드부(116)에 의해 디코드된 복수 조의 중간 코드와 오퍼랜드를 유지한다. 그리고 명령 전송 수단(118)이 생성하는 명령 전송 트리거 신호에 동기하여 중간 코드와 오퍼랜드를 순차적으로 1조씩 취출하여, CodeM 단자, R0#M 단자 및 R1#M 단자에 출력한다.
명령 전송 수단(118)은, 클럭 신호 ×4CLK 및 병렬수 P#(-1)을 수신한다. 병렬수 P#(-1)=4일 때, 명령 전송 수단(118)은 클럭 신호 ×4CLK를 명령 전송 트리거 신호로서 명령 큐(117)에 출력한다. 이에 의해 명령 큐(117)는, 기본 주기 ΔTb의 1/4의 주기로 각각의 조의 중간 코드 및 오퍼랜드의 조를 순차적으로 출력한다.
또한, 병렬수 P#(-1)=2일 때, 명령 전송 수단(118)은 클럭 신호 ×4CLK를 2분주한 신호를 명령 전송 트리거 신호로서 명령 큐(117)에 출력한다. 이에 의해 명령 큐(117)는, 기본 주기 ΔTb의 1/2의 주기로 각각의 조의 중간 코드 및 오퍼랜드를 순차적으로 출력한다.
명령 전송 수단(118)은, 스톨 신호 생성부(113)로부터 스톨 신호를 수신하고 있는 동안은, 명령 큐(117)로부터의 생성한 중간 코드와 오퍼랜드 출력을 멈추고, 명령 큐(117)로부터 NOP 명령을 발행한다.
도 16~도 18을 참조하여 메인 디코더(12)에 의한 디코드 동작을 설명한다. 도 16은 본 프로세서(1)에 의해 실행되는 명령의 종류를 예시하는 도면이다. 본 프로세서(1)에 의해 실행되는 명령의 형식은, 예를 들면 명령 타입1~명령 타입6으로 분류된다.
명령 타입1에 속하는 명령은, 2개의 소스 레지스터의 지정 R0 및 R1과 1개의 데스티네이션 레지스터의 지정 S0을 수반하고, 2개의 소스 레지스터 R0 및 R1의 값 사이의 연산 결과를 데스티네이션 레지스터 S0에 기입한다. 이 형식의 명령은 예를 들면 「add r0, r1, r2」이며, 레지스터 r0과 r1의 값의 합을 레지스터 r2에 기입한다.
명령 타입2에 속하는 명령은, 1개의 데스티네이션 레지스터의 지정 S0을 수반하고, 데스티네이션 레지스터 S0의 값에 기초하는 연산을 행하여 그 결과를 데스티네이션 레지스터 S0에 기입한다. 이 형식의 명령은 예를 들면 「abs r2」이며, 레지스터 r2의 값의 절대값을 레지스터 r2에 기입한다.
명령 타입 3에 속하는 명령은, 1개의 소스 레지스터 R0의 지정과 1개의 즉값 ImmD와 1개의 데스티네이션 레지스터의 지정 S0을 수반하고, 소스 레지스터 R0과 즉값 ImmD 사이의 연산 결과를 데스티네이션 레지스터 S0에 기입한다. 이 형식의 명령은 예를 들면 「add r0, -10, r2」이며, 레지스터 r0의 값과 「-10」의 합을 레지스터 r2에 기입한다.
명령 타입4에 속하는 명령은, 베이스 레지스터의 지정 Ridx와 오프셋값 ImmA 와 1개의 레지스터의 지정 S0을 수반한다. 이 형식의 명령은 예를 들면 메모리 전송 명령 「ld *(r0, 10), r2」이며, 베이스 레지스터 r0의 값에 오프셋값 10을 가한 값에 의해 나타내어지는 어드레스에 기억되는 데이터 메모리(501) 내의 데이터의 내용을 레지스터 r2에 전송한다.
명령 타입5에 속하는 명령은 즉값 ImmD를 수반한다. 이 형식의 명령은 예를 들면 어드레스 #100으로 점프하는 점프 명령 「jp #100」이다.
명령 타입6에 속하는 명령은, 레지스터 즉값 ImmD와 1개의 레지스터의 지정R0을 수반한다. 이 형식의 명령은 예를 들면 「jp r0, #100」이며, 레지스터 r0에 100을 가한 어드레스로 점프하는 점프 명령이다.
도 17A 및 도 17B는 싱글 명령 디코드부(115)에 의한 디코드의 설명도이다. 도 17A에 도시하는 각 명령, 「add r0, r1, r2」(명령1), 「abs r2」(명령2), 「add r0, -10, r2」(명령3), 「ld *(r0, 10), r2」(명령4), 「jp #100」(명령5), 「jp r0, #100」(명령6)은, 모두 병렬수 1의 명령이다.
따라서 이들 명령을 포함하는 명령 코드 Code와 명령 오퍼랜드 Operand는, 싱글 명령 디코드부(115)에 의해 디코드된다. 메인 디코더(12)가, 상기 명령1~6을 각각 포함하는 명령 코드 Code와 명령 오퍼랜드 Operand를 도시하는 페치 순서로 수신하면, 싱글 명령 디코드부(115)는, 이들 명령의 각각을 1조의 중간 코드 및 오퍼랜드로 변환한다. 싱글 명령 디코드부(115)는 중간 코드 및 오퍼랜드의 각각을, 도 17B의 표에 나타내어진 CodeS 단자, R0#S 단자, R1#S 단자, Ridx# 단자, ImmD# 단자 및 ImmA# 단자에 출력한다.
또한, 전술한 바와 같이 중간 코드는, 「add」나 「abs」와 같은 연산부(17)가 실행하는 연산의 종류를 지정하는 실행 코드와 데스티네이션 레지스터의 지정을 포함한다. 따라서 도 17B에 도시하는 표는, 데스티네이션 레지스터의 지정도 CodeS 단자로부터 출력되는 것을 나타내고 있다. 도 18B에서도 마찬가지이다.
도 18A 및 도 18B는 병렬 명령 디코드부(116)에 의한 디코드의 설명도이다. 도 18A에 도시하는 명령은 「SAA r0, r1, r2」는, 레지스터 r0 및 r1의 값의 차의 절대값을 레지스터 r2의 값에 더하는 명령이다.
여기서 연산부(17)는, 명령 「SAA」를 일회의 연산에 의해 완료하는 수치 논리 연산 유닛이 실장되어 있지 않아, 이들을 3개의 연산,
감산 r0-r1의 결과를 레지스터 r7에 저장(연산1),
레지스터 r7의 값의 절대값을 r7에 저장(연산2),
레지스터 r7과 레지스터 r2의 값의 합을 레지스터 r2에 저장(연산3)
을 조합하여 실행하는 것으로 하면, 명령 「SAA」의 병렬수는 3으로 된다.
따라서 이들 명령을 포함하는 명령 코드와 명령 오퍼랜드는, 병렬 명령 디코드부(116)에 의해 디코드된다. 메인 디코더(12)가, 명령 「SAA」를 명령 코드 Code와 명령 오퍼랜드 Operand를 수신하면, 싱글 명령 디코드부(115)는, 명령 「SAA」를 필요한 3조의 중간 코드 및 오퍼랜드로 변환한다.
도 4에 도시하는 연산 유닛(200)과 마찬가지의 구성을 갖는 연산부(17)는, 병렬수가 1 즉 단일의 연산 유닛으로서 동작하거나, 혹은 2개 또는 4개의 연산을 병렬로 연산할 수 있다. 따라서, 병렬수가 3인 명령 「SAA」를 디코드할 때는, 병 렬수 신호 발생부(111)는 병렬수 신호 「P#=4」를 생성하고, 싱글 명령 디코드부(115)는 상기의 3조의 중간 코드 및 오퍼랜드와 1개의 NOP 명령을 명령 큐(117)에 출력한다.
명령 큐(117)는, 기본 주기 ΔTb의 1/4의 주기를 갖는 명령 전송 트리거 신호에 동기하여, 이들 중간 코드, 오퍼랜드 및 NOP 명령의 각각을, 도 18B의 표에 나타내어진 CodeM 단자, R0#M 단자 및 R1#M 단자에 순차적으로 출력한다.
도 19는 레지스터 파일(14)의 개략 구성도이다. 레지스터 파일(14)은, 클럭 신호 φ23에 동기하여 32비트의 입력 데이터를 래치하는 기억 소자인 레지스터 #0~#7과, 이들 레지스터 #0~#7 중 읽어내기 레지스터 번호 지정 입력 p0A~p2A에 의해 지정되는 레지스터를 선택하고, 선택된 레지스터의 값을 각각 출력 포트 p0Do~p2Do에 출력하는 멀티플렉서(121~123)를 구비한다.
또한 레지스터 파일(14)은, 각 레지스터 #0~#7에의 입력값을, 그 자신이 기억하는 값, 및 입력 포트 p2Di 및 p3Do에 입력된 데이터로부터 선택하는 멀티플렉서(125a~125h)와, 기입 레지스터 번호 지정 입력 p2A 및 p3A에 따라서, 각 멀티플렉서(125a~125h)의 절환 신호를 생성하는 기입 레지스터 선택 디코더(124)를 구비한다.
전술한 바와 같이, 레지스터 파일(14)로부터 병렬수 P#이 4인 명령의 오퍼랜드가 읽어내어질 때에는, 메인 디코더(12)는 기본 주기 ΔTb의 1/4의 주기로 읽어내기 레지스터 번호를 지정한다. 또한, 연산부(17)가 1개의 32비트 연산을 처리하는 기간의 상한은, 1개의 VLIW 명령이 페치되는 주기 즉 기본 주기 ΔTb와 동일하 다. 따라서 병렬수 P#이 4일 때에는, 메인 디코더(12)는, 연산부(17)가 1개의 32비트 연산을 처리하기 위해서 사용할 수 있는 기간의 1/4의 길이의 주기로 읽어내기 레지스터 번호를 지정한다.
마찬가지로 병렬수 P#이 4인 명령의 연산 결과가 기입될 때는, 후술하는 바와 같이, 연산부(17)는, 기본 주기 ΔTb의 1/4의 길이의 주기로 연산 결과를 출력한다.
이 때문에, 각 레지스터 #0~#7에는, 연산부(17)가 1개의 32비트 연산을 처리하기 위해서 사용할 수 있는 기간의 1/4의 길이의 주기로 읽기쓰기 가능한 기억 소자를 채용한다.
도 20은 연산부(17)의 개략 구성도이다. 연산부(17)는 도 4에 도시하는 연산 유닛(200)과 마찬가지의 구성을 갖는다. 따라서 동일한 구성 요소는 동일한 참조 번호를 사용하여 나타냄과 함께 설명을 생략한다.
연산부(17)에 설치된 부분 연산 유닛(201~204)의 각각은, 연산부(17)가 행하는 32비트 연산을 4등분한 8비트 연산을 행한다. 즉 부분 연산 유닛(201)은, 32비트의 입력 데이터 A 및 B 중의 각각 0비트째~7비트째의 부분인 A[7:0]과 B[7:0]을 입력으로 하여, 실행 코드 CodeExe에 의해 지정된 연산을 행하여, 8비트의 연산 결과 S[7:0]과 캐리 C1을 출력한다.
제2 부분 연산 유닛(202)은, A 및 B 중의 각각 8비트째~15비트째까지 부분인 A[15:8] 및 B[15:8]과 캐리 C1을 입력으로 하여, 실행 코드 CodeExe에 의해 지정된 연산을 행하여, 8비트의 연산 결과 S[15:8]과 캐리 C2를 출력한다.
제3 부분 연산 유닛(203)은, A 및 B 중의 각각 16비트째~23비트째까지 부분인 A[23:16] 및 B[23:16]과 캐리 C2를 입력으로 하여, 실행 코드 CodeExe에 의해 지정된 연산을 행하여, 8비트의 연산 결과 S[23:16]과 캐리 C3을 출력한다.
제4 부분 연산 유닛(204)은, A 및 B 중의 각각 16비트째~23비트째까지 부분인 A[31:24] 및 B[31:24]와 캐리 C3을 입력으로 하여, 실행 코드 CodeExe에 의해 지정된 연산을 행하여, 8비트의 연산 결과 S[31:24]와, 캐리 판정이나 제로 판정의 결과를 나타내는 플래그 F를 출력한다.
그리고 연산부(17)는, 이들 연산 결과 S[7:0], S[15:8], S[23:16] 및 S[31:24]를 조합한 32비트의 연산 결과 S[31:0]과, 플래그 F를 출력한다.
또한 연산부(17)는, 실행 코드 CodeExe를 디코드하여, CodeExe에 포함되어 있던 코드 CodeWrite와 데스티네이션 레지스터의 지정 Rd를 취득하는 디코더(252)를 구비한다.
도 21은 클럭 제어부(19)의 개략 구성도이다. 클럭 제어부(19)는, 기준 클럭 신호 RefCLK에 동기하는 PLL 회로(130)와, 각 클럭 신호를 생성하는 클럭 인버터(140~143 및 151~154)와, 모드 절환 신호 CKEN20~CKEN22를 생성하는 모드 절환 신호 생성부(161~162)를 구비한다.
PLL 회로(130)는, 위상 비교 회로(131)와, 기준 클럭 신호 RefCLK의 8배의 속도의 클럭 신호 ×8CLK를 생성하는 체배부(132)와, 체배부(132)의 출력 클럭 신호의 속도를 1/8로 떨어뜨려 기준 클럭 신호 RefCLK가 갖는 주기 및 위상과 동일한 주기 및 위상을 갖는 클럭 신호를 생성하는 분주부(133)를 구비한다. 분주부(133) 의 출력 신호는, 페치 타이밍 클럭 신호 Ckf 및 클럭 신호 Ck1로서 사용된다.
클럭 인버터(140~143)는, 입력 P#(0) 및 현재 상태에 기초하여, 입력되는 클럭 신호 ×8CLK의 주기, 즉 기본 주기 ΔTb의 1/8의 주기로 현재 스테이트를 갱신하고, 현재 스테이트에 따른 논리값을 출력하는 유한 상태 기계이다. 클럭 인버터(140~143)는, 기본 주기 ΔTb의 1/8의 주기로 논리값을 출력할 수 있으므로, 기본 주기 ΔTb와 동일한 주기, 기본 주기 ΔTb의 1/2의 주기 및 1/4의 주기를 갖는 클럭을 출력할 수 있다. 클럭 인버터(140~143)는, 입력 P#(0)이 1, 2 및 4일 때 기본 주기 ΔTb와 동일한 주기, 기본 주기 ΔTb의 1/2의 주기 및 1/4의 주기의 클럭을 각각 출력한다.
입력 P#(0)에 상수 4가 입력되는 클럭 인버터(140)는, 기본 주기 ΔTb의 1/4의 주기를 갖는 클럭 신호 ×4CLK를 생성한다. 또한 클럭 신호 ×4CLK를 반전시켜 클럭 신호 Ck4가 생성된다.
또한 입력 P#(0)에 상수 1이 입력되는 클럭 인버터(141)는, 기본 주기 ΔTb와 동일한 주기를 갖는 메인 클럭 MainCLK 및 실행 결과 유지 타이밍 클럭 Ckw를 생성한다.
클럭 인버터(142 및 143)에 의한 클럭 Ckd 및 Cke의 생성 동작에 대해서는 후술한다.
또한 클럭 신호 φ20~φ23을 출력하는 클럭 인버터(151~154)는, 입력 P#(0), P#(-1) 및 현재 상태에 기초하여, 입력되는 클럭 신호 ×8CLK의 주기로 현재 스테이트를 갱신하고, 현재 스테이트에 따른 논리값을 출력하는 유한 상태 기계 이다. 클럭 인버터(140~143)와 마찬가지로, 클럭 인버터(151~154)는, 기본 주기 ΔTb와 동일한 주기, 기본 주기 ΔTb의 1/2의 주기 및 1/4의 주기를 갖는 클럭을 출력할 수 있다.
모드 절환 신호 CKEN20~22를 생성하는 모드 절환 신호 생성부(161~163)도 또한, 입력 P#(0), P#(-1) 및 현재 상태에 기초하여, 클럭 신호 ×8CLK의 주기로 현재 스테이트를 갱신하고, 현재 스테이트에 따른 논리값을 출력하는 유한 상태 기계이다.
이들 클럭 인버터(151~154)에 의한 클럭 신호 φ20~φ23의 생성 동작 및 모드 절환 신호 생성부(161~163)에 의한 모드 절환 신호 CKEN20~22의 생성 동작에 대해서는 후술한다.
이하, 병렬수의 변화에 수반하여 연산부(17)의 파이프라인단을 변경하는 프로세서(1)의 동작을 설명한다. 도 22는 병렬수가 1로부터 4로 변화할 때의 페치단에서의 프로세서(1)의 동작을 나타내는 타임 차트이고, 도 23은 병렬수가 1로부터 4로 변화할 때의 디코드단에서의 프로세서(1)의 동작을 나타내는 타임 차트이며, 도 24는 병렬수가 1로부터 4로 변화할 때의 실행단에서의 프로세서(1)의 동작을 나타내는 타임 차트이고, 도 25는 병렬수가 1로부터 4로 변화할 때의 실행 결과 유지 타이밍 클럭 Ckw와 분기 제어 신호 BranchCntrl의 변화를 나타내는 타임 차트이다.
또한, 본 프로세서(1)에서는, 페치단이란 명령 메모리(500)의 읽어내기부터 명령 버퍼(11)에의 기입까지의 스테이지를 나타내고, 디코드단이란 명령 버퍼(11)의 읽어내기부터 레지스터(51~53)에의 기입까지의 스테이지를 나타내고, 실행단이 란 레지스터(51~53)의 읽어내기부터 레지스터(61~63)에의 기입까지의 스테이지를 나타낸다.
도 22에 도시하는 바와 같이, 기준 클럭 RefCLK의 사이클 T0에 명령 버퍼(InstBuff)(11)에 읽어들여진 명령 Com#3의 병렬수는 1이고, 사이클 T0에 계속되는 사이클 T1에서 읽어들인 명령 Com#4에서 병렬수가 1로부터 4로 변화하고, 사이클 T1~T4에서 명령 버퍼(11)에 읽어들여진 명령 Com#4~7의 병렬수가 4이었던 것으로 가정한다. 명령 버퍼(11)는, 사이클 T1에서 병렬수 P#=4의 명령 Com#4를 페치한다.
도 23에 도시하는 바와 같이, 사이클 T1에서 메인 디코더(12)의 병렬수 신호 생성부(111)는, 명령 버퍼(11)로부터 명령 Com#4를 수신하면, 병렬수 신호의 값 P#을 1로부터 4로 변경한다. 병렬수 신호(P#=4)는, 도 21에 도시하는 클럭 제어부(19)의 레지스터(171)에 입력된다.
또한 도 23에서, 신호 Sel은 메인 디코더(12)로부터 출력되는 선택 신호 Sel을 나타내고, 신호 Ckd는 디코드 결과 유지 타이밍 클럭 신호 Ckd를 나타내고, 신호 CodeD는 레지스터(41)에 래치된 중간 코드 CodeD를 나타내고, 신호 Rs0 및 Rs1은 레지스터(42 및 43)에 래치된 레지스터 번호 Rs0 및 Rs1을 나타내고, Ridx는 메인 디코더(12)로부터 출력되는 레지스터 번호 Ridx를 나타내고, ImmD 및 ImmA는 메인 디코더(12)로부터 출력되는 즉값 ImmD 및 ImmA를 나타내고, RA 및 RB는 레지스터 파일(14)로부터 출력된 레지스터값 RA 및 RB를 나타내고, IM은 레지스터(44)에 래치된 즉값 IM을 나타내고, M은 데이터 메모리(501)로부터 출력되는 데이터값 M을 나타낸다.
또한, 명령 버퍼(11)에 페치된 명령 Com#j(j=0, 1, 2…)를 디코드하여 얻어진 중간 코드 CodeD, 레지스터 번호 Rs0, Rs1 및 Ridx, 즉값 ImmD, ImmA 및 IM, 레지스터값 RA 및 RB, 및 데이터값 M을, 각각 CdD#j, Rs0(j), Rs1(j), Ridx(j), ImmD(j), ImmA(j) 및 IM(j), RA(j) 및 RB(j) 및 M(j)로 표기한다.
특히, 병렬수 P#이 1이 아닌 명령 Com#j를 디코드함으로써 생긴 복수의 중간 코드를 #ja, #jb, #jc 및 #jd로 나타내고, 중간 코드 #ja의 오퍼랜드의 레지스터 번호를 s0a(j) 및 s1a(j)로 나타내고, 중간 코드 #jb의 오퍼랜드의 레지스터 번호를 s0b(j) 및 s1b(j)로 나타내고, 중간 코드 #jc의 오퍼랜드의 레지스터 번호를 s0c(j) 및 s1c(j)로 나타내고, 중간 코드 #jd의 오퍼랜드의 레지스터 번호를 s0d(j) 및 s1d(j)로 나타낸다.
레지스터 번호를 s0a(j) 및 s1a(j)의 레지스터값을 각각 RA(j)a 및 RB(j)a로 나타내고, 레지스터 번호를 s0b(j) 및 s1b(j)의 레지스터값을 각각 RA(j)b 및 RB(j)b로 나타내고, 레지스터 번호를 s0c(j) 및 s1c(j)의 레지스터값을 각각 RA(j)c 및 RB(j)c로 나타내고, 레지스터 번호를 s0d(j) 및 s1d(j)의 레지스터값을 각각 RA(j)d 및 RB(j)d로 나타낸다.
레지스터(171)는, 기준 클럭 신호 RefCLK와 동일한 클럭 신호 Ck1에 동기하여, 메인 디코더(12)로부터 출력되는 병렬수 신호 P#을 래치하는 레지스터이고, 레지스터(172)는, 클럭 신호 Ck1에 동기하여 레지스터(171)의 출력 PQ0을 래치하는 레지스터이며, 레지스터(173)는, 클럭 신호 Ck1에 동기하여 레지스터(172)의 출력 PQ1을 래치하는 레지스터이다. 따라서, 레지스터(171)의 출력 PQ0은, 메인 디코더(12)로부터 출력되는 병렬수 신호 P#보다도 기본 주기 ΔTb만큼 지연되어 있고, 레지스터(172)의 출력 PQ1은 레지스터(171)의 출력 PQ0에 대하여 기본 주기 ΔTb만큼 지연되어 있고, 레지스터(173)의 출력 PQ2d는 레지스터(172)의 출력 PQ1에 대하여 기본 주기 ΔTb만큼 지연되어 있다.
도 26은 도 21에 도시하는 클럭 인버터(140)의 개략 구성도이다. 전술한 바와 같이, 클럭 인버터(140)는, 유한 상태 기계이며, 현재 스테이트 QS를 유지하는 현재 스테이트 기억부(181)와, 현재 스테이트 QS와 입력 P#(0)에 기초하여 다음 스테이트 S를 결정하여 현재 스테이트 기억부(181)에 출력함과 함께 다음 스테이트 S에 대응하는 논리값 D를 출력하는 다음 스테이트 함수부(182)와, 논리값 D에 기초하여 출력값 D를 출력하는 출력 함수부(183)를 구비하고 있다. 현재 스테이트 기억부(181)와 출력 함수부(183)는, 클럭 신호 ×8CLK가 입력되는 입력 클럭 CK에 의해 입력 데이터를 래치하는 플립플롭 등의 기억 소자를 이용하여 구성된다. 클럭 인버터(141~143)의 구성은 클럭 인버터(140)의 구성과 마찬가지이다.
도 27은 도 26에 도시하는 클럭 인버터(140)의 상태 천이도이다. 다음 스테이트 함수부(182)는, 입력 P#(0)이 1인 동안에는 「0」부터 「7」까지의 상태를 순회하도록 다음 스테이트를 결정한다. 입력 P#(0)이 2인 동안에는, 다음 스테이트 함수부(182)는, 「8」부터 「11」까지의 상태를 순회하도록 다음 스테이트를 결정한다. 입력 P#(0)이 4인 동안에는, 다음 스테이트 함수부(182)는 다음 스테이트가 상태 「12」 및 「13」을 교대로 갖도록 다음 스테이트를 결정한다.
그리고, 입력 P#(0)이 1 이외의 값으로부터 1로 변화하였을 때 다음 스테이트를 「0」으로 설정하고, 입력 P#(0)이 2 이외의 값으로부터 2로 변화하였을 때 다음 스테이트 S를 「8」로 설정하고, 입력 P#(0)이 4 이외의 값으로부터 4로 변화하였을 때 다음 스테이트 S를 「12」로 설정한다.
다음 스테이트 함수부(182)는, 출력 함수부(183)에 출력하는 논리값 D를, 다음 스테이트 S가 「0」~「13」 중 어느 상태인지에 따라서 결정한다. 도 27에 도시하는 상태 천이도는, 다음 스테이트 S의 값이, 일점쇄선보다도 위에 배치된 상태 중 어느 하나일 때는, 다음 스테이트 함수부(182)는 논리값 D=1을 출력하고, 다음 스테이트 S의 값이, 일점쇄선보다도 아래에 배치된 상태 중 어느 하나일 때는, 다음 스테이트 함수부(182)는 논리값 D=0을 출력하는 것을 나타내고 있다. 예를 들면 도 27에 도시하는 상태 천이도는, 다음 스테이트 S의 값이 「0」~「3」, 「8」, 「9」 및 「12」 중 어느 하나일 때에는 다음 스테이트 함수부(182)는 논리값D=1을 출력하고, 다음 스테이트 S의 값이 「4」~「7」, 「10」, 「11」 및 「13」중 어느 하나일 때에는 다음 스테이트 함수부(182)는 논리값 D=0을 출력하는 것을 나타내고 있다.
또한, 후술하는 도 32, 도 34, 도 36, 도 38, 도 40, 도 42 및 도 44에 도시되는 상태 천이도에 대해서도, 다음 스테이트 S와 그것에 대응하는 논리값 D 사이의 관계를, 도 27과 마찬가지의 표기법에 따라서 나타낸다.
도 28은 도 21에 도시하는 클럭 인버터(140)의 내부 상태를 나타내는 타임 차트이다. 클럭 인버터(140)에는 입력 클럭 CK로서 ×8CLK가 공급되고, 입력 P#(0)으로서 항상 상수 「4」가 공급되어 있다. 따라서 현재 스테이트 QS 및 다음 스테이트 S의 상태는, 기본 주기 ΔTb의 1/8의 주기로 「12」와 「13」 사이에서 변화하기 때문에, 출력 Q는, ΔTb/8의 주기로 출력값이 「1」과 「0」 사이에서 변화하는 클럭, 즉 클럭 신호 ×4CLK로 된다.
또한, 클럭 신호 ×4CLK의 상승 엣지는 기준 클럭 RefCLK의 상승 엣지로부터, ΔTb/8만큼 지연되어 있다. 이것은 출력 함수부(183)를 구성하는 플립플롭에 의한 지연이다.
도 29는 도 21에 도시하는 클럭 인버터(141~143)의 내부 상태를 나타내는 타임 차트이다.
클럭 인버터(141)에는 입력 클럭 CK로서 ×8CLK가 공급되고, 입력 P#(0)으로서 항상 상수 「1」이 공급되어 있다. 따라서 현재 스테이트 QS 및 다음 스테이트 S의 값은, 기본 주기 ΔTb의 1/8의 주기로 「0」~「7」까지의 값을 순회한다. 이 때문에 출력 Q는, ΔTb/2의 주기로 출력값이 「1」과 「0」 사이에서 변화하는 클럭으로 된다. 따라서 클럭 인버터(141)가 출력하는 메인 클럭 MainCLK와 실행 결과 유지 타이밍 클럭 Ckw는, 기본 주기 ΔTb와 동일한 주기의 클럭으로 된다.
또한 클럭 신호 ×4CLK와 마찬가지로, 메인 클럭 MainCLK 및 실행 결과 유지 타이밍 클럭 Ckw도 기준 클럭 RefCLK의 상승 엣지로부터 ΔTb/8 지연되어 있다. 이하, 기준 클럭 RefCLK의 사이클 Ti(i=0, 1, 2…)보다도 ΔTb/8 지연된 메인 클럭 MainCLK의 사이클을 Ti'로 기재한다.
입력 P#(0)이 「1」인 동안은, 클럭 인버터(142)에 의해 생성되는 디코드 결 과 유지 타이밍 클럭 신호 Ckd, 및 클럭 인버터(143)에 의해 생성되는 명령 투입 타이밍 클럭 신호 Cke도 또한, 메인 클럭 MainCLK와 동일한 신호로 된다.
이 때문에 도 23에 도시하는 바와 같이, 클럭 신호 Ckd에 동기하여 입력을 래치하는 레지스터군(41~45)은, 병렬수가 1인 명령의 디코드 결과를 유지할 때 메인 클럭 MainCLK의 사이클 Ti'와 동일한 사이클로 디코드 결과를 갱신한다.
도 24에 도시하는 바와 같이, 클럭 신호 Cke에 동기하여 데이터가 취출되는 레지스터군(51~53)으로부터는, 메인 클럭 MainCLK의 사이클 Ti'와 동일한 사이클로 실행 코드 CodeExe와 입력값 A 및 B가 연산부(17)에 출력된다.
도 30은 입력 P#(0)이 「1」로부터 「4」로 변화하였을 때의 클럭 인버터(142, 143)의 내부 상태를 나타내는 타임 차트이다. 사이클 T2에서 입력 P#(0)이 「1」로부터 「4」로 변화하면, 다음 스테이트 S의 상태가 「12」로 세트되고, 그 후 현재 스테이트 QS 및 다음 스테이트 S의 상태는 「12」와 「13」 사이에서 변화한다. 이 때문에 출력 Q는, 입력 P#(0)이 4로 변화하고 나서 ΔTb/8 지연되어, ΔTb/4의 주기의 클럭 신호를 출력하기 시작한다.
도 21에 도시하는 바와 같이, 클럭 인버터(142)의 입력 P#(0)에는, 레지스터(171)의 출력 PQ0이 입력되고, 클럭 인버터(143)의 입력 P#(0)에는, 레지스터(172)의 출력 PQ1이 입력된다.
따라서 도 23에 도시하는 바와 같이, 클럭 인버터(142)로부터 출력되는 클럭 신호 Ckd는, 메인 디코더(12)에서 병렬수 신호 P#의 변화가 검출된 시각보다도 (1+1/8)×기본 주기 ΔTb만큼 지연되어 주기가 변화한다. 본 타임 차트에서는, 병 렬수 신호 P#이 「1」로부터 「4」로 변화하기 때문에, 클럭 신호 Ckd의 주기는 ΔTb로부터 ΔTb/4로 변화한다. 이와 같이 클럭 신호 Ckd의 주기가 변화함으로써, 메인 디코더(12)가 병렬수 신호 P#이 1이 아닌 명령을 디코드하고, 이에 의해 명령 큐(117)로부터 중간 코드 및 오퍼랜드가 기본 주기 ΔTb의 주기보다도 짧은 주기로 출력되었을 때, 레지스터군(41~43)은 이들을 순차적으로 래치한다.
또한 도 23 및 도 24에 도시하는 바와 같이, 클럭 인버터(143)로부터 출력되는 클럭 신호 Cke는, 클럭 인버터(142)로부터 출력되는 클럭 신호 Ckd보다도, 기본 주기 ΔTb 지연되어 주기가 변화한다.
또한 도 24에서, 신호 Cke는 명령 투입 타이밍 클럭 신호 Cke를 나타내고, 신호 CodeExe는 레지스터(51)로부터 연산부(17)에 출력되는 실행 코드 CodeExe를 나타내고, 신호 A 및 B는 레지스터(52 및 53)로부터 연산부(17)에 출력되는 제1 및 제2 입력 데이터 A 및 B를 나타내고, 신호 φ20~22는, 클럭 제어부(19)로부터 연산부(17)에 공급되는 클럭 신호 φ20~22를 나타내고, 신호 CKEN20~22는 클럭 제어부(19)로부터 연산부(17)에 공급되는 모드 절환 신호 CKEN20~22를 나타내고, 신호 φ23은 클럭 제어부(19)로부터 레지스터 파일(14)에 공급되는 레지스터 갱신 클럭 φ23을 나타낸다.
CD1~CD3은 도 20에 도시한 연산부(17)의 파이프라인 레지스터(211, 221 및 231)로부터 부분 연산 유닛(202~204)에 각각 출력되는 실행 코드를 나타낸다. 예를 들면 사이클 T3'의 제4 사반기에서는, 부분 연산 유닛(201)은 실행 코드 #4d를 수신하고, 부분 연산 유닛(202)은 실행 코드 #4c를 수신하고, 부분 연산 유닛(203) 은 실행 코드 #4b를 수신하고, 부분 연산 유닛(204)은 실행 코드 #4a를 수신한다.
신호 S 및 신호 F는 연산부(17)로부터 출력되는 연산 결과 S 및 플래그 F를 나타내고, 신호 Rd는 연산부(17)의 디코더(252)로부터 출력되는 데스티네이션 레지스터의 지정 Rd를 나타낸다.
또한, 명령 버퍼(11)에 페치된 명령 Com#j(j=0, 1, 2…)를 디코드하여 얻어진 실행 코드 CodeExe를 CdE#j로 표기하고, 명령 Com#j를 디코드하여 얻어진 연산부(17)에의 제1 및 제2 입력 데이터 A 및 B를 각각 A(j) 및 B(j)로 표기한다.
특히, 병렬수 P#이 1이 아닌 명령 Com#j를 디코드함으로써 생긴 복수의 실행 코드를 #ja, #jb, #jc 및 #jd로 표기한다. 또한 병렬수 P#이 1이 아닌 명령 Com#j를 디코드함으로써 생긴 복수의 제1 입력 데이터 A를 Aa(j), Ab(j), Ac(j) 및 Ad(j)로 표기한다. 또한 병렬수 P#이 1이 아닌 명령 Com#j를 디코드함으로써 생긴 복수의 제2 입력 데이터 B를 Ba(j), Bb(j), Bc(j) 및 Bd(j)로 표기한다.
제1 및 제2 입력 데이터 Aa(j)와 Ba(j) 사이의 연산 결과 S와 플래그 F를 각각 Sa(j) 및 FLa(j)로 표기하고, Ab(j)와 Bb(j) 사이의 연산 결과 S와 플래그 F를 각각 Sb(j) 및 FLb(j)로 표기하고, Ac(j)와 Bc(j) 사이의 연산 결과 S와 플래그 F를 각각 Sc(j) 및 FLc(j)로 표기하고, Ad(j)와 Bd(j) 사이의 연산 결과 S와 플래그 F를 각각 Sd(j) 및 FLd(j)로 표기한다.
또한 병렬수 P#이 1이 아닌 명령 Com#j를 디코드함으로써 생긴 데스티네이션 레지스터의 지정을 Rda(j), Rdb(j), Rdc(j) 및 Rdd(j)로 표기한다.
도 20에 도시하는 바와 같이, 실행 코드를 유지하는 파이프라인 레지스 터(211)와 입력값 A 및 B를 유지하는 파이프라인 레지스터(212~217)는 동일한 클럭 φ20 및 모드 절환 신호 CKEN20으로 구동되고, 파이프라인 레지스터(221)와 파이프라인 레지스터(222~225)는 동일한 클럭 φ21 및 모드 절환 신호 CKEN21로 구동되고, 파이프라인 레지스터(231)와 파이프라인 레지스터(232~235)는 동일한 클럭 φ22 및 모드 절환 신호 CKEN22로 구동된다.
따라서 각 부분 연산 유닛(201~204)은, 임의의 실행 코드 #jx(x=a, b…)를 수신할 때, 이 실행 코드 #jx에 수반되는 제1 입력 데이터 Ax(j) 및 제2 입력 데이터 Bx(j)를 동시에 수신한다.
도 12에 도시하는 바와 같이 디코드 결과 유지 타이밍 클럭 신호 Ckd 및 명령 투입 타이밍 클럭 신호 Cke는, 프로세서(1)의 디코드단과 실행단 사이에 설치된 선입선출 버퍼인 레지스터(51~53)에 공급된다. 클럭 신호 Ckd는 레지스터(51~53)에의 데이터 기입 타이밍을 정하는 클럭으로서 사용되고, 클럭 신호 Cke는 레지스터(51~53)로부터의 데이터 읽어내기 타이밍을 정하는 클럭으로서 사용된다.
도 23 및 도 24에 도시하는 바와 같이 프로세서(1)의 디코드단에서 처리되는 명령은, 실행단에서 처리되는 명령보다도 1기본 주기 ΔTb분 지연되어 있다. 따라서, 임의의 사이클 Tj에서 페치한 명령 Com#j의 병렬수 P#이 1이 아닌 경우에는, 실행단이 선행하는 사이클 T(j-1)에서 페치한 명령 Com#(j-1)을 처리하고 있는 도중에, 메인 디코더(12)가 중간 코드 #ja, #jb…나 레지스터 번호 S0a(j), S0b(j)…, S1a(j), S1b(j)…를 출력하기 시작한다.
이 때문에 선입선출 버퍼인 레지스터(51~53)를 디코드단과 실행단 사이에 설치하고, 데이터 읽어내기용 클럭 신호 Cke를 데이터 기입용 클럭 신호 Ckd보다도 1기본 주기 ΔTb분 지연시킨다. 이와 같은 레지스터(51~53)를 설치함으로써, 명령 Com#(j-1)을 디코드하여 얻어지는 실행 코드를 실행단이 처리하고 있는 동안에, 다음 명령 Com#j를 디코드하여 얻어지는 중간 코드 #ja, #jb…, 및 레지스터 번호 S0a(j), S0b(j)…, S1a(j), S1b(j)…를 유지한다.
이하, 도 24에 도시하는 클럭 신호 φ20~φ23을 생성하는 클럭 인버터(151~154)의 동작과, 도 24에 도시하는 모드 절환 신호 CKEN20~φ22를 생성하는 모드 절환 신호 생성부(161~163)의 동작을 설명한다. 도 31은 도 21에 도시하는 클럭 인버터(151)의 개략 구성도이다. 전술한 바와 같이 클럭 인버터(151)는, 유한 상태 기계이며, 현재 스테이트 QS를 유지하는 현재 스테이트 기억부(184)와, 현재 스테이트 QS, 입력 P#(0) 및 P#(-1)에 기초하여 다음 스테이트 S를 결정하여 현재 스테이트 기억부(184)에 출력함과 함께 다음 스테이트 S에 대응하는 논리값 D를 출력하는 다음 스테이트 함수부(185)와, 논리값 D에 기초하여 출력값 D를 출력하는 출력 함수부(186)를 구비하고 있다. 현재 스테이트 기억부(184)와 출력 함수부(186)는, 클럭 신호 ×8CLK가 입력되는 입력 클럭 CK에 의해 입력 데이터를 래치하는 플립플롭 등의 기억 소자를 이용하여 구성된다. 클럭 인버터(152~154)의 구성은 클럭 인버터(151)의 구성과 마찬가지이다.
도 21을 참조하면, 클럭 인버터(151)의 입력 P#(0)에는 레지스터(172)의 출력 PQ1이 입력된다. 따라서 병렬수에 변화가 있었을 때, 클럭 신호 φ20을 생성하는 클럭 인버터(151)의 입력 P#(0)은, 명령 투입 타이밍 클럭 신호 Cke를 생성하는 클럭 인버터(143)의 입력 P#(0)과 동일한 타이밍에서 변화한다. 또한, 클럭 인버터(151)의 입력 P#(-1)에는 레지스터(173)의 출력 PQ2d가 입력되어, 입력 P#(-1)은 입력 P#(0)보다도 1기본 주기 ΔTb 지연된다.
도 32는 도 21에 도시하는 클럭 인버터(151)의 상태 천이도이다. 병렬수가 1인 동안, 즉 P#(0)=P#(-1)=1인 동안은, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트의 값 S가 결정된다.
병렬수가 1로부터 4로 변화함으로써 P#(0)이 4로 변화하였을 때, 다음 스테이트 S는 참조 부호 J1-1에 의해 나타낸 선을 따라서 상태 「15」로 변화한다. 그리고 P#(0)=4 또한 P#(-1)=1인 동안, 다음 스테이트 S는, 교대로 상태 「17」 및 「16」으로 된다.
P#(0)이 4로 변화하고 나서 1기본 주기 ΔTb가 경과하면,P#(-1)이 4로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J1-2에 의해 나타낸 선을 따라서 상태 「12」로 변화한다. 그리고 그 이후, 다음 스테이트 S는, 교대로 상태 「12」 및 「13」으로 된다.
도 33은 병렬수가 1로부터 4로 변화할 때의 클럭 인버터(151)의 내부 상태를 나타내는 타임 차트이다. 병렬수가 1로부터 4로 변화하였을 때, 클럭 인버터(151)의 출력 φ20의 주기는, 명령 투입 타이밍 클럭 신호 Cke의 변화보다도 ΔTb/4 지연되어, 기본 주기 ΔTb로부터 ΔTb/4로 변화한다.
도 21을 참조하면, 클럭 인버터(152)의 입력 P#(0)에는 레지스터(174)의 출력 PQ2가 입력된다. 여기서 레지스터(174)는, 클럭 신호 Ck4에 동기하여 레지스 터(172)의 출력 PQ1을 래치하는 레지스터이고, 레지스터(175)는, 클럭 신호 Ck4에 동기하여 레지스터(174)의 출력 PQ2를 래치하는 레지스터이며, 레지스터(176)는, 클럭 신호 Ck4에 동기하여 레지스터(175)의 출력 PQ3을 래치하는 레지스터이고, 레지스터(177)는, 클럭 신호 Ck4에 동기하여 레지스터(176)의 출력 PQ4를 래치하는 레지스터이다.
따라서, 레지스터(174)의 출력 PQ2는 레지스터(172)의 출력 PQ1보다도 ΔTb/4만큼 지연되어 있고, 레지스터(175)의 출력 PQ3은 레지스터(174)의 출력 PQ2보다도 ΔTb/4만큼 지연되어 있고, 레지스터(176)의 출력 PQ4는 레지스터(175)의 출력 PQ3보다도 ΔTb/4만큼 지연되어 있고, 레지스터(177)의 출력 PQ5는 레지스터(176)의 출력 PQ4보다도 ΔTb/4만큼 지연되어 있다.
병렬수에 변화가 있었을 때, 클럭 신호 φ21을 생성하는 클럭 인버터(152)의 입력 P#(0)은, 클럭 신호 φ20을 생성하는 클럭 인버터(151)의 입력 P#(0)보다도 ΔTb/4만큼 지연된 타이밍에서 변화한다. 또한, 클럭 인버터(152)의 입력 P#(-1)에는 레지스터(175)의 출력 PQ3이 입력되어, 입력 P#(-1)은 입력 P#(0)보다도 ΔTb/4만큼 지연된다.
도 34는, 도 21에 도시하는 클럭 인버터(152)의 상태 천이도이다. 병렬수가 1인 동안, 즉 P#(0)=P#(-1)=1인 동안은, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다.
P#(0)이 4로 변화하였을 때, 다음 스테이트 S는 참조 부호 J1-1에 의해 나타낸 선을 따라서 상태 「15」로 변화한다. 그리고 P#(0)=4 또한 P#(-1)=1인 동안, 다음 스테이트 S는 상태 「17」로 유지된다.
P#(0)이 4로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 4로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J1-2에 의해 나타낸 선을 따라서 상태 「12」로 변화한다. 그리고 그 이후, 다음 스테이트 S의 값은, 교대로 상태 「12」 및 「13」으로 된다.
도 35는, 병렬수가 1로부터 4로 변화할 때의 클럭 인버터(152)의 내부 상태를 나타내는 타임 차트이다. 병렬수가 1로부터 4로 변화하였을 때, 클럭 인버터(152)의 출력 φ21의 주기는, 클럭 신호 φ20의 변화보다도 ΔTb/4 지연되어, 기본 주기 ΔTb로부터 ΔTb/4로 변화한다.
도 21를 참조하면, 클럭 인버터(153)의 입력 P#(0)에는 레지스터(175)의 출력 PQ3이 입력된다. 이 때문에 병렬수에 변화가 있었을 때, 클럭 신호 φ22를 생성하는 클럭 인버터(153)의 입력 P#(0)은, 클럭 신호 φ21을 생성하는 클럭 인버터(152)의 입력 P#(0)보다도 ΔTb/4만큼 지연된 타이밍에서 변화한다. 또한, 클럭 인버터(153)의 입력 P#(-1)에는 레지스터(176)의 출력 PQ4가 입력되어, 입력 P#(-1)은 입력 P#(0)보다도 ΔTb/4만큼 지연된다.
도 36은 도 21에 도시하는 클럭 인버터(153)의 상태 천이도이다. 병렬수가 1로부터 4로 변할 때에 생기는 클럭 인버터(153)의 상태 천이는, 클럭 인버터(152)에 생기는 상태 천이와 마찬가지이다. 도 37은 병렬수가 1로부터 4로 변화할 때의 클럭 인버터(153 및 154)의 내부 상태를 나타내는 타임 차트이다. 병렬수가 1로부터 4로 변화하였을 때, 클럭 인버터(153)의 출력 φ22의 주기는, 클럭 신호 φ21의 변화보다도 ΔTb/4 지연되어, 기본 주기 ΔTb로부터 ΔTb/4로 변화한다.
도 21을 참조하면, 클럭 인버터(154)의 입력 P#(0)에는 레지스터(176)의 출력 PQ4가 입력된다. 이 때문에 병렬수에 변화가 있었을 때, 클럭 신호 φ23을 생성하는 클럭 인버터(154)의 입력 P#(0)은, 클럭 신호 φ22를 생성하는 클럭 인버터(153)의 입력 P#(0)보다도 ΔTb/4만큼 지연된 타이밍에서 변화한다. 또한, 클럭 인버터(154)의 입력 P#(-1)에는 레지스터(177)의 출력 PQ5가 입력되어, 입력 P#(-1)은 입력 P#(0)보다도 ΔTb/4만큼 지연된다.
도 38은 도 21에 도시하는 클럭 인버터(154)의 상태 천이도이다. 병렬수가 1로부터 4로 변할 때에 생기는 클럭 인버터(154)의 상태 천이는, 클럭 인버터(152)에 생기는 상태 천이와 마찬가지이다. 이 때문에 도 37에 도시하는 바와 같이, 병렬수가 1로부터 4로 변화하였을 때, 클럭 인버터(153)의 출력 φ23의 주기는, 클럭 신호 φ22의 변화보다도 ΔTb/4 지연되어 기본 주기 ΔTb로부터 ΔTb/4로 변화한다.
도 39는 도 21에 도시하는 모드 절환 신호 생성부(161)의 개략 구성도이다. 모드 절환 신호 생성부(161)는, 유한 상태 기계이며, 현재 스테이트 QS를 유지하는 현재 스테이트 기억부(187)와, 현재 스테이트 QS, 입력 P#(0) 및 P#(-1)에 기초하여 다음 스테이트 S를 결정하여 현재 스테이트 기억부(187)에 출력함과 함께 다음 스테이트 S에 대응하는 논리값 D를 출력하는 다음 스테이트 함수부(188)와, 논리값 D에 기초하여 출력값 D를 출력하는 출력 함수부(189)를 구비하고 있다. 현재 스테이트 기억부(187)와 출력 함수부(189)는, 클럭 신호 ×8CLK가 입력되는 입력 클럭 CK에 의해 입력 데이터를 래치하는 플립플롭 등의 기억 소자를 이용하여 구성된다. 모드 절환 신호 생성부(162 및 163)의 구성은 모드 절환 신호 생성부(161)의 구성과 마찬가지이다.
도 21을 참조하면, 모드 절환 신호 생성부(161)의 입력 P#(0)에는 레지스터(172)의 출력 PQ1이 입력된다. 따라서 병렬수에 변화가 있었을 때, 모드 절환 신호 생성부(161)의 입력 P#(0)은, 명령 투입 타이밍 클럭 신호 Cke를 생성하는 클럭 인버터(143)의 입력 P#(0)과 동일한 타이밍에서 변화한다. 또한, 모드 절환 신호 생성부(161)의 입력 P#(-1)에는 레지스터(173)의 출력 PQ2d가 입력되어, 입력 P#(-1)은 입력 P#(0)보다도 1기본 주기 ΔTb 지연된다.
도 40은 도 21에 도시하는 모드 절환 신호 생성부(161)의 상태 천이도이다. 병렬수가 1인 동안, 즉 P#(0)=P#(-1)=1인 동안은, 다음 스테이트 S는 상태 「0」으로 유지된다. P#(0)이 4로 변화하였을 때, 다음 스테이트 S는 상태 「4」로 변화하고, 그 후 P#(-1)이 4로 변화될 때까지 상태 「5」로 유지된다. 그리고 P#(-1)=4로 되었을 때 다음 스테이트 S는 상태 「2」로 변한다. 그 후 P#(0)=4 또한 P#(-1)=1인 동안, 다음 스테이트 S는 상태 「2」로 유지된다.
도 41은 병렬수가 1로부터 4로 변화할 때의 모드 절환 신호 생성부(161)의 내부 상태를 나타내는 타임 차트이다. 병렬수가 1일 때 모드 절환 신호 생성부(161)의 출력 CKEN20은 「L」로, 도 20에 도시하는 파이프라인 레지스터(211~219)는 입력값을 그대로 출력하는 트랜스페어런트 모드에서 동작한다.
병렬수가 1로부터 4로 변화하면, 모드 절환 신호 CKEN20의 값은, 클럭 신호 φ20의 주기가 ΔTb/4로 변화하는 것 보다도 ΔTb/8 빨리 「H」로 변화하여, 파이프라인 레지스터(211~219)는 플립플롭 모드에서 동작하기 시작한다.
도 21을 참조하면, 모드 절환 신호 생성부(162)의 입력 P#(0)에는 레지스터(174)의 출력 PQ2가 입력된다. 따라서 병렬수에 변화가 있었을 때, 모드 절환 신호 생성부(162)의 입력 P#(0)은, 모드 절환 신호 CKEN20을 생성하는 모드 절환 신호 생성부(161)의 입력 P#(0)보다도 ΔTb/4만큼 지연된 타이밍에서 변화한다. 또한, 모드 절환 신호 생성부(162)의 입력 P#(-1)에는 레지스터(175)의 출력 PQ3이 입력되어, 입력 P#(-1)은 입력 P#(0)보다도 ΔTb/4 지연된다.
또한, 모드 절환 신호 생성부(163)의 입력 P#(0)에는 레지스터(175)의 출력 PQ3이 입력된다. 따라서 병렬수에 변화가 있었을 때, 모드 절환 신호 생성부(163)의 입력 P#(0)은, 모드 절환 신호 CKEN21을 생성하는 모드 절환 신호 생성부(162)의 입력 P#(0)보다도 ΔTb/4만큼 지연된 타이밍에서 변화한다. 또한, 모드 절환 신호 생성부(163)의 입력 P#(-1)에는 레지스터(176)의 출력 PQ4가 입력되어, 입력 P#(-1)은 입력 P#(0)보다도 ΔTb/4 지연된다.
도 42 및 도 43은 각각 도 21에 도시하는 모드 절환 신호 생성부(162 및 163)의 상태 천이도이다. 병렬수가 1로부터 4로 변할 때에 생기는 클럭 인버터(162 및 163)의 상태 천이는, 클럭 인버터(152)에 생기는 상태 천이와 마찬가지이다. 이 때문에 도 44에 도시하는 바와 같이, 병렬수가 1일 때 모드 절환 신호 생성부(162 및 163)의 출력 CKEN21 및 CKEN22는 「L」로, 도 20에 도시하는 파이프라인 레지스터(221~228 및 231~237)는 트랜스페어런트 모드에서 동작한다.
병렬수가 1로부터 4로 변화하면, 모드 절환 신호 CKEN21의 값은, 클럭 신호 φ21의 주기가 ΔTb/4로 변화하는 것 보다도 ΔTb/8 빨리 「H」로 변화하여, 파이프라인 레지스터(221~228)는 플립플롭 모드에서 동작하기 시작한다. 또한 모드 절환 신호 CKEN22의 값은, 클럭 신호 φ22의 주기가 ΔTb/4로 변화하는 것 보다도 ΔTb/8 빨리 「H」로 변화하여, 파이프라인 레지스터(231~237)는 플립플롭 모드에서 동작하기 시작한다.
병렬수가 1로부터 4로 변화하였을 때, 도 21에 도시하는 클럭 제어부(19)는, 전술한 바와 같이 클럭 신호 φ21~23 및 모드 절환 신호 CKEN20~CKEN22를 변경한다.
이 결과, 도 24에 도시하는 바와 같이, 병렬수 P#이 4인 명령 Com#4 및 Com#5를 디코드함으로써 생긴 복수의 실행 코드 #4a~#4d 및 #5a~#5d는, 주기 ΔTb/4로 각 부분 연산 유닛(201~204)에 순차적으로 공급된다.
그리고, #4b 및 이것에 계속되는 실행 코드는, 부분 연산 유닛(201)에 공급되는 타이밍보다도 ΔTb/4 지연되어 부분 연산 유닛(202)에 공급되고, 부분 연산 유닛(202)에 공급되는 타이밍보다도 ΔTb/4 지연되어 부분 연산 유닛(203)에 공급되며, 부분 연산 유닛(203)에 공급되는 타이밍보다도 ΔTb/4 지연되어 부분 연산 유닛(204)에 공급된다.
따라서 병렬수 P#이 4일 때, 연산부(17)에 공급된 1개의 32비트 연산은, 자릿수 방향으로 4개의 부분적 연산으로 분할되어, 이들 부분적 연산은 각각 부분 연산 유닛(201~204)에 할당된다. 그리고, 부분 연산 유닛(201)은 할당된 부분적 연 산을 부분 연산 유닛(202)보다도 ΔTb/4만큼 빨리 실행하고, 부분 연산 유닛(202)은 할당된 부분적 연산을 부분 연산 유닛(203)보다도 ΔTb/4만큼 빨리 실행하고, 부분 연산 유닛(203)은 할당된 부분적 연산을 부분 연산 유닛(204)보다도 ΔTb/4만큼 빨리 실행한다.
그리고 임의의 시점에 대해서 보면, 부분 연산 유닛(201~204)은, 4개의 서로 다른 32비트 연산에 속하는 부분적 연산을 병렬로 실행한다. 이와 같은 부분 연산 유닛(201~204)의 동작에 의해, 연산부(17)는 4개의 연산을 병렬로 실행하는 파이프라인 처리를 개시한다.
이하, 병렬수 1로부터 2로 변화할 때의 프로세서(1)의 동작을 설명한다. 도 45는 병렬수가 1로부터 2로 변화할 때의 페치단에서의 프로세서(1)의 동작을 나타내는 타임 차트이고, 도 46은 병렬수가 1로부터 2로 변화할 때의 디코드단에서의 프로세서(1)의 동작을 나타내는 타임 차트이며, 도 47은 병렬수가 1로부터 2로 변화할 때의 실행단에서의 프로세서(1)의 동작을 나타내는 타임 차트이다. 또한, 도 46 및 도 47에 도시하는 각 기호의 용법은, 도 23 및 도 24에 도시하는 기호의 용법과 동일하다.
도 45에 도시하는 바와 같이, 사이클 T0에 명령 버퍼(11)에 읽어들여진 명령 Com#3의 병렬수는 1이며, 사이클 T1에서 읽어들인 명령 Com#4에서 병렬수가 1로부터 2로 변화하고, 사이클 T1~T4에서 명령 버퍼(11)에 읽어들여진 명령 Com#4~7의 병렬수가 2이었던 것으로 가정한다.
도 45 및 도 46에 도시하는 바와 같이, 사이클 T1에서 메인 디코더(12)의 병 렬수 신호 생성부(111)는, 명령 버퍼(11)로부터 명령 Com#4를 수신하면, 병렬수 신호의 값 P#을 1로부터 2로 변경한다. 이 때 클럭 신호 Ckd는, 메인 디코더(12)에서 병렬수 신호 P#의 변화가 검출된 시각보다도 (1+1/8)×기본 주기 ΔTb만큼 지연되어 주기가 변화한다. 또한 클럭 신호 Cke는, 클럭 신호 Ckd보다도 기본 주기 ΔTb 지연되어 주기가 변화한다.
이하, 도 47에 도시하는 클럭 신호 φ20~φ23을 생성하는 클럭 인버터(151~154)의 동작과, 도 47에 도시하는 모드 절환 신호 CKEN20~φ22를 생성하는 모드 절환 신호 생성부(161~163)의 동작을 설명한다.
도 32에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(151)에서는, 병렬수가 1인 동안, 즉 P#(0)=P#(-1)=1인 동안에는, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트가 결정된다.
병렬수가 1로부터 2로 변화함으로써 P#(0)이 2로 변화하였을 때, 다음 스테이트 S는 참조 부호 J4-1에 의해 나타낸 선을 따라서 상태 「26」으로 변화한다. 그리고 P#(0)=2 또한 P#(-1)=1인 동안, 상태 「26」부터 「29」까지를 순회하도록 다음 스테이트가 결정된다.
P#(0)이 2로 변화하고 나서 1기본 주기 ΔTb가 경과하면,P#(-1)이 2로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J4-2에 의해 나타낸 선을 따라서 상태 「8」로 변화한다. 그리고 그 이후, 상태 「8」부터 「11」까지의 값을 순회하도록 다음 스테이트가 결정된다. 병렬수가 1로부터 2로 변화할 때의 클럭 인버터(151)의 내부 상태의 타임 차트를 도 48에 도시한다.
도 34에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(152)에서는, 병렬수가 1인 동안은, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다.
병렬수가 1로부터 2로 변화함으로써 P#(0)이 2로 변화하였을 때, 다음 스테이트 S는 참조 부호 J4-1에 의해 나타낸 선을 따라서 상태 「30」으로 변화한다. 그리고 P#(0)=2 또한 P#(-1)=1인 동안, 다음 스테이트 S는 상태 「30」으로 유지된다.
P#(0)이 2로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 2로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J4-2에 의해 나타낸 선을 따라서 상태 「8」로 변화한다. 그 이후, 상태 「8」부터 「11」까지를 순회하도록 다음 스테이트 S가 결정된다.
병렬수가 1로부터 2로 변화하는 경우의 클럭 인버터(152)의 내부 상태의 타임 차트를 도 49에 도시한다.
도 36에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(153)에서는, 병렬수가 1인 동안은, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다.
병렬수가 1로부터 2로 변화함으로써 P#(0)이 2로 변화하였을 때, 다음 스테이트 S는 참조 부호 J4-1에 의해 나타낸 선을 따라서 상태 「30」으로 변화한다. 그리고 P#(0)=2 또한 P#(-1)=1인 동인 다음 스테이트 S는 상태 「30」으로 유지된다.
P#(0)이 2로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 2로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J4-2에 의해 나타낸 선을 따라서 상태 「31」로 변화한다. 그 후 다음 스테이트 S는 상태 「31」을 2회 반복하고 나서, 참조 부호 J4-3에 의해 나타낸 선을 따라서 「8」로 천이한다. 그리고 상태 「8」부터 「11」까지를 순회하도록 다음 스테이트 S가 결정된다.
병렬수가 1로부터 2로 변화하는 경우의 클럭 인버터(153)의 내부 상태의 타임 차트를 도 50에 도시한다.
도 38에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(154)에서는, 병렬수가 1인 동안은, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다.
P#(0)이 2로 변화하였을 때, 다음 스테이트 S는 참조 부호 J4-1에 의해 나타낸 선을 따라서 상태 「30」으로 변화한다. 그리고 P#(0)=2 또한 P#(-1)=1인 동안 다음 스테이트 S는 상태 「30」으로 유지된다.
P#(0)이 2로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 2로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J4-2에 의해 나타낸 선을 따라서 상태 「8」로 변화한다. 그리고 상태 「8」부터 「11」까지를 순회하도록 다음 스테이트 S가 결정된다.
병렬수가 1로부터 2로 변화하는 경우의 클럭 인버터(154)의 내부 상태의 타임 차트를 도 50에 도시한다.
도 40에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(161) 에서는, 병렬수가 1인 동안, 즉 P#(0)=P#(-1)=1인 동안은, 다음 스테이트 S는 상태 「0」으로 유지된다. P#(0)이 2로 변화하였을 때, 다음 스테이트 S는 상태 「11」로 변화하고, P#(-1)이 2로 변화할 때까지 상태 「11」로 유지된다. 그리고 P#(-1)=2로 되었을 때 다음 스테이트 S는 상태 「9」로 변한다. 그 후 다음 스테이트 S는 상태 「9」로 유지된다. 병렬수가 1로부터 2로 변화하는 경우의 모드 절환 신호 생성부(161)의 내부 상태의 타임 차트를 도 51에 도시한다.
도 42에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(162)에서는, 병렬수가 1인 동안은, 다음 스테이트 S는 상태 「0」이다. P#(0)이 2로 변화하였을 때, 다음 스테이트 S는 상태 「11」로 변화하고, P#(-1)이 2로 변화할 때까지 상태 「11」로 유지된다. 그리고 P#(-1)=2로 되었을 때 다음 스테이트 S는 상태 「1」로 변한다. 그 후, 다음 스테이트 S는 상태 「1」로 유지된다. 병렬수가 1로부터 2로 변화하는 경우의 모드 절환 신호 생성부(162)의 내부 상태의 타임 차트를 도 52에 도시한다.
도 43에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(163)에서는, 병렬수가 1인 동안은, 다음 스테이트 S는 상태 「0」이다. P#(0)이 2로 변화하였을 때, 다음 스테이트 S는 상태 「11」로 변화하고, P#(-1)이 2로 변화할때까지 상태 「11」로 유지된다. 그리고 P#(-1)=2로 되었을 때 다음 스테이트 S를 값을 「9」로 변화시킨다. 그 후 다음 스테이트 S는 상태 「9」로 유지된다. 병렬수가 1로부터 2로 변화하는 경우의 모드 절환 신호 생성부(163)의 내부 상태의 타임 차트를 도 52에 도시한다.
도 51 및 도 52에 도시하는 바와 같이 병렬수가 1로부터 2로 변화할 때, 모드 절환 신호 CKEN20 및 CKEN22의 값은 「L」로 유지되어, 도 20에 도시하는 파이프라인 레지스터(211~219 및 231~237)는 트랜스페어런트 모드에서 동작한다.
한편, 모드 절환 신호 CKEN21은, 사이클 T3'의 중간에서 「L」로부터 「H」로 변화한다. 이에 의해, 도 20에 도시하는 파이프라인 레지스터(221~228)는 사이클 T3'의 중간에서 플립플롭 모드로 변화한다.
그 결과, 도 7에 도시하는 연산 유닛(200)의 동작 타임 차트와 마찬가지로, 연산부(17)의 제1 부분 연산 유닛(201) 및 제2 부분 연산 유닛(202)이 동일한 32비트 연산의 부분 연산을 동시에 실행하고, 제3 부분 연산 유닛(203) 및 제4 부분 연산 유닛(204)은, 제1 부분 연산 유닛(201)이 연산한 32비트 연산보다도 기본 주기의 1/2의 기간(ΔTb/2) 전에 연산부(17)에 입력된 32비트 연산의 부분 연산을 실행한다. 이와 같은 부분 연산 유닛(201~204)의 동작에 의해, 연산부(17)는 2개의 연산을 병렬로 실행하는 파이프라인 처리를 개시한다.
이하, 병렬수 4로부터 1로 변화할 때의 프로세서(1)의 동작을 설명한다. 도 53은 병렬수가 4로부터 1로 변화할 때의 페치단에서의 프로세서(1)의 동작을 나타내는 타임 차트이고, 도 54는 병렬수가 4로부터 1로 변화할 때의 디코드단에서의 프로세서(1)의 동작을 나타내는 타임 차트이며, 도 55는 병렬수가 4로부터 1로 변화할 때의 실행단에서의 프로세서(1)의 동작을 나타내는 타임 차트이다. 또한, 도 54 및 도 55에 도시하는 각 기호의 용법은, 도 23 및 도 24에 도시하는 기호의 용법과 동일하다.
도 53에 도시하는 바와 같이, 사이클 T0에 명령 버퍼(11)에 읽어들여진 명령 Com#3의 병렬수는 4이며, 사이클 T1에서 읽어들인 명령 Com#4에서 병렬수가 4로부터 1로 변화하고, 사이클 T1~T4에서 명령 버퍼(11)에 읽어들여진 명령 Com#4~6의 병렬수가 1이었던 것으로 가정한다.
도 53 및 도 54에 도시하는 바와 같이, 사이클 T1에서 메인 디코더(12)의 병렬수 신호 생성부(111)는, 명령 버퍼(11)로부터 명령 Com#4를 수신하면, 병렬수 신호의 값 P#을 4로부터 1로 변경한다. 또한 스톨 신호 생성부(113)는, 도 15를 참조하여 설명하는 바와 같이, 전회 수신한 명령의 병렬수 P#이 1보다 크고 또한 전회 수신한 명령의 병렬수와 금회 수신한 명령의 병렬수 P#이 서로 다르므로, 스톨 신호를 생성한다. 이 때문에 기본 주기 ΔTb 동안, 싱글 명령 디코드부(115)는 NOP 명령을 발행한다.
병렬수가 1 이상의 명령을 실행하고 있는 동안에는, 연산부(17) 내의 파이프라인 레지스터(211~219, 221~228 및 231~237)에, 실행 코드 CodeExe, 입력 데이터 A 및 B와, 연산 결과 및 캐리가 유지되어 있다. 따라서, 병렬수가 변한 명령 Com#4보다도 이전의 명령에 포함된 연산을 모두 완료한 후가 아니면, 명령 Com#4의 병렬수에 따라서 클럭 신호 φ20~φ23 및 모드 절환 신호 CKEN20~22를 변경할 수 없다. 이 때문에, 이미 병렬수가 1 이상인 명령이 실행되고 있을 때에 병렬수의 변경이 있었던 경우에는, 메인 디코더(12)는 기본 주기 ΔTb 동안 NOP 명령을 발행한다.
이하, 도 55에 도시하는 클럭 신호 φ20~φ23을 생성하는 클럭 인버터(151 ~154)의 동작과, 도 55에 도시하는 모드 절환 신호 CKEN20~φ22를 생성하는 모드 절환 신호 생성부(161~163)의 동작을 설명한다.
도 32에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(151)에서는, 병렬수가 4인 동안, 즉 P#(0)=P#(-1)=4인 동안은, 다음 스테이트 S는, 교대로 상태 「12」 및 「13」으로 된다.
병렬수가 4로부터 1로 변화함으로써 P#(0)이 1로 변화하였을 때, 다음 스테이트 S는 참조 부호 J2-1에 의해 나타낸 선을 따라서 상태 「18」로 변화한다. 그리고 그 후 P#(-1)이 1로 변화할 때까지, 스테이트 S는 상태 「19」로 유지된다.
P#(0)이 1로 변화하고 나서 1기본 주기 ΔTb가 경과하면,P#(-1)이 1로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J2-2에 의해 나타낸 선을 따라서 상태 「0」으로 변화한다. 그리고 그 이후, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다. 병렬수가 4로부터 1로 변화하는 경우의 클럭 인버터(151)의 내부 상태의 타임 차트를 도 56에 도시한다.
도 34에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(152)에서는, 병렬수가 4인 동안은, 다음 스테이트 S는, 교대로 상태 「12」 및 「13」으로 된다.
P#(0)이 1로 변화하였을 때, 다음 스테이트 S는 참조 부호 J2-1에 의해 나타낸 선을 따라서 상태 「20」으로 변화한다. 그 후 P#(-1)이 1로 변화할 때까지 스테이트 S는 상태 「21」로 유지된다.
P#(0)이 1로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 1로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J2-2에 의해 나타낸 선을 따라서 상태 「23」으 로 천이한다. 다음 스테이트 S는 상태 「23」을 4회 반복하고 나서, 참조 부호 J2-3에 의해 나타낸 선을 따라서 상태 「0」으로 천이한다. 그리고 그 이후, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다. 병렬수가 4로부터 1로 변화하는 경우의 클럭 인버터(152)의 내부 상태의 타임 차트를 도 57에 도시한다.
도 36에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(153)에서는, 병렬수가 4인 동안은, 다음 스테이트 S는, 교대로 상태 「12」 및 「13」으로 된다.
P#(0)이 1로 변화하였을 때, 다음 스테이트 S는 참조 부호 J2-1에 의해 나타낸 선을 따라서 상태 「20」으로 변화한다. 그 후 P#(-1)이 1로 변화할 때까지 스테이트 S는 상태 「21」로 유지된다.
P#(0)이 1로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 1로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J2-2에 의해 나타낸 선을 따라서 상태 「23」으로 천이한다. 다음 스테이트 S는 상태 「23」을 2회 반복하고 나서, 참조 부호 J2-3에 의해 나타낸 선을 따라서 상태 「0」으로 천이한다. 그리고 그 이후, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다. 병렬수가 4로부터 1로 변화하는 경우의 클럭 인버터(153)의 내부 상태의 타임 차트를 도 58에 도시한다.
도 38에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(154)에서는, 병렬수가 4인 동안은, 다음 스테이트 S의 값은 교대로 상태 「12」 및 「13」으로 된다.
P#(0)이 1로 변화하였을 때, 다음 스테이트 S는 참조 부호 J2-1에 의해 나타낸 선을 따라서 상태 「21」로 변화한다. 그 후 P#(-1)이 1로 변화할 때까지 스테이트 S는 상태 「21」로 유지된다.
P#(0)이 1로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 1로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J2-2에 의해 나타낸 선을 따라서 「0」으로 천이한다. 그리고 그 이후, 상태 「0」부터 「7」까지를 순회하도록 다음 스테이트 S가 결정된다. 병렬수가 4로부터 1로 변화하는 경우의 클럭 인버터(154)의 내부 상태의 타임 차트를 도 58에 도시한다.
도 40에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(161)에서는, 병렬수가 4인 동안, 즉 P#(0)=P#(-1)=4인 동안은, 다음 스테이트 S는 상태 「2」이다. P#(0)이 1로 변화하면, 다음 스테이트 S의 값은 P#(-1)이 1로 변화할 때까지 상태 「3」으로 유지된다. 그리고 P#(-1)=1로 되었을 때 다음 스테이트 S는 상태 「0」으로 된다. 병렬수가 4로부터 1로 변화하는 경우의 모드 절환 신호 생성부(161)의 내부 상태의 타임 차트를 도 59에 도시한다.
도 42에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(162)에서는, 병렬수가 4인 동안, 다음 스테이트 S는 상태 「2」이다. P#(0)이 1로 변화하면, 다음 스테이트 S는 P#(-1)이 1로 변화할 때까지 상태 「3」으로 유지된다. 그리고 P#(-1)=1로 되었을 때 다음 스테이트 S의 값은 「6」으로 천이한다. 그 후, 다음 스테이트 S는 상태 「6」을 4회 반복하고 나서 「0」으로 천이한다. 병렬수가 4로부터 1로 변화하는 경우의 모드 절환 신호 생성부(162)의 내부 상태의 타임 차트를 도 60에 도시한다.
도 43에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(163)에서는, 병렬수가 4인 동안, 다음 스테이트 S는 상태 「2」이다. P#(0)이 1로 변화하면, 다음 스테이트 S는 P#(-1)이 1로 변화할 때까지 상태 「3」으로 유지된다. 그리고 P#(-1)=1로 되었을 때 다음 스테이트 S의 값은 「6」으로 천이한다. 그 후, 다음 스테이트 S는 상태 「6」을 2회 반복하고 나서, 「0」으로 천이한다. 병렬수가 4로부터 1로 변화하는 경우의 모드 절환 신호 생성부(163)의 내부 상태의 타임 차트를 도 60에 도시한다.
도 55에 도시하는 바와 같이, 병렬수가 4로부터 1로 변화하였을 때, 연산부(17)는, NOP 명령을 수신한 사이클 T3' 동안에, 병렬수 P#이 4인 명령 Com#3에 포함된 모든 연산을 완료하고, 계속되는 사이클 T4' 이후에서 병렬수 P#이 1인 명령 Com#4~6에 포함되는 연산을 실행한다.
이하, 병렬수 2로부터 4로 변화할 때의 프로세서(1)의 동작을 설명한다. 도 61은 병렬수가 2로부터 4로 변화할 때의 페치단에서의 프로세서(1)의 동작을 나타내는 타임 차트이고, 도 62는 병렬수가 2로부터 4로 변화할 때의 디코드단에서의 프로세서(1)의 동작을 나타내는 타임 차트이며, 도 63은 병렬수가 2로부터 4로 변화할 때의 실행단에서의 프로세서(1)의 동작을 나타내는 타임 차트이다. 또한, 도 62 및 도 63에 도시하는 각 기호의 용법은, 도 23 및 도 24에 도시하는 기호의 용법과 동일하다.
도 61에 도시하는 바와 같이, 사이클 T0에 명령 버퍼(11)에 읽어들여진 명령 Com#3의 병렬수는 2이며, 사이클 T1에서 읽어들인 명령 Com#4에서 병렬수가 2로부터 4로 변화하고, 사이클 T1~T4에서 명령 버퍼(11)에 읽어들여진 명령 Com#4~6의 병렬수가 4이었던 것으로 가정한다.
도 61 및 도 62에 도시하는 바와 같이, 사이클 T1에서 메인 디코더(12)의 병렬수 신호 생성부(111)는, 명령 버퍼(11)로부터 명령 Com#4를 수신하면, 병렬수 신호의 값 P#을 2로부터 4로 변경한다. 또한 스톨 신호 생성부(113)는, 전회 수신한 명령의 병렬수 P#이 1보다 크고, 또한 전회 수신한 명령의 병렬수와 금회 수신한 명령의 병렬수 P#이 서로 다르므로, 스톨 신호를 생성한다. 이 결과, 기본 주기 ΔTb 동안, 명령 큐(117)는 NOP 명령을 발행한다.
이하, 도 63에 도시하는 클럭 신호 φ20~φ23을 생성하는 클럭 인버터(151~154)의 동작과, 도 63에 도시하는 모드 절환 신호 CKEN20~φ22를 생성하는 모드 절환 신호 생성부(161~163)의 동작을 설명한다.
도 32에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(151)에서는, 병렬수가 2인 동안, 즉 P#(0)=P#(-1)=2인 동안은, 상태 「8」부터 「11」까지를 순회하도록 다음 스테이트 S가 결정된다.
병렬수가 2로부터 4로 변화함으로써 P#(0)이 4로 변화하였을 때, 다음 스테이트 S는 참조 부호 J3-1에 의해 나타낸 선을 따라서 상태 「25」로 변화한다. 그리고 P#(0)=4 또한 P#(-1)=2인 동안, 그 후 스테이트 S는 상태 「25」로 유지된다.
P#(0)이 4로 변화하고 나서 1기본 주기 ΔTb가 경과하면,P#(-1)이 4로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J3-2에 의해 나타낸 선을 따라서 상태 「32」로 천이한다. 다음 스테이트 S는 상태 「32」를 2회 반복하고 나서, 참조 부호 J3-3에 의해 나타낸 선을 따라서 상태 「12」로 천이한다. 그 후, 다음 스테이트 S는 교대로 상태 「12」 및 「13」으로 된다. 병렬수가 2로부터 4로 변화하는 경우의 클럭 인버터(151)의 내부 상태의 타임 차트를 도 64에 도시한다.
도 34에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(152)에서는, 병렬수가 2인 동안은, 상태 「8」부터 「11」까지를 순회하도록 다음 스테이트 S가 결정된다.
P#(0)이 4로 변화하였을 때, 다음 스테이트 S는 참조 부호 J3-1에 의해 나타낸 선을 따라서 상태 「25」로 변화한다. 그리고 P#(0)=4 또한 P#(-1)=2인 동안, 그 후 스테이트 S는 상태 「25」로 유지된다.
P#(0)이 4로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 4로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J3-2에 의해 나타낸 선을 따라서 상태 「32」로 천이한다. 다음 스테이트 S는 상태 「32」를 8회 반복하고 나서, 참조 부호 J3-3에 의해 나타낸 선을 따라서 상태 「12」로 천이한다. 그 후, 다음 스테이트 S는 교대로 상태 「12」 및 「13」으로 된다. 병렬수가 2로부터 4로 변화하는 경우의 클럭 인버터(152)의 내부 상태의 타임 차트를 도 65에 도시한다.
도 36 및 도 38에 도시하는 바와 같이, 도 21에 도시하는 클럭 인버터(153 및 154)에서는, 병렬수가 2인 동안은, 상태 「8」부터 「11」까지를 순회하도록 다음 스테이트 S가 결정된다.
P#(0)이 4로 변화하였을 때, 다음 스테이트 S는 참조 부호 J3-1에 의해 나타 낸 선을 따라서 상태 「25」로 변화한다. P#(0)=4 또한 P#(-1)=2인 동안 스테이트 S는 상태 「25」로 유지된다.
P#(0)이 4로 변화하고 나서 ΔTb/4가 경과하면,P#(-1)이 4로 변화한다. 이 때, 다음 스테이트 S는 참조 부호 J3-2에 의해 나타낸 선을 따라서 상태 「32」로 천이한다. 다음 스테이트 S는 상태 「32」를 8회 반복하고 나서, 참조 부호 J3-3에 의해 나타낸 선을 따라서 상태 「12」로 천이한다. 그 후, 다음 스테이트 S는 교대로 상태 「12」 및 「13」으로 된다. 병렬수가 2로부터 4로 변화하는 경우의 클럭 인버터(153 및 154)의 내부 상태의 타임 차트를 도 66에 도시한다.
도 40에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(161)에서는, 병렬수가 2인 동안, 즉 P#(0)=P#(-1)=2인 동안은, 다음 스테이트 S는 상태 「9」이다. P#(0)이 4로 변화하였을 때 다음 스테이트 S는 상태 「7」로 변화하고, P#(-1)=4로 되었을 때 다음 스테이트 S는, 한번 상태 「8」로 된 후에 상태 「2」로 된다. 병렬수가 2로부터 4로 변화하는 경우의 모드 절환 신호 생성부(161)의 내부 상태의 타임 차트를 도 67에 도시한다.
도 42에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(162)에서는, 병렬수가 2인 동안은 다음 스테이트 S는 상태 「1」이다. P#(0)이 4로 변화하였을 때, 다음 스테이트 S는 상태 「10」으로 변화하고, P#(-1)=4로 되었을 때 다음 스테이트 S는 상태 「2」로 변화한다. 병렬수가 2로부터 4로 변화하는 경우의 모드 절환 신호 생성부(162)의 내부 상태의 타임 차트를 도 68에 도시한다.
도 43에 도시하는 바와 같이, 도 21에 도시하는 모드 절환 신호 생성부(163) 에서는, 병렬수가 2인 동안은, 다음 스테이트 S는 상태 「9」이다. P#(0)이 4로 변화하였을 때 다음 스테이트 S는 상태 「7」로 변화하고, 그리고 P#(-1)=4로 되었을 때 다음 스테이트 S는, 상태 「8」을 7회 반복하고 나서, 상태 「2」로 천이한다. 병렬수가 2로부터 4로 변화하는 경우의 모드 절환 신호 생성부(163)의 내부 상태의 타임 차트를 도 68에 도시한다.
도 63에 도시하는 바와 같이, 병렬수가 2로부터 4로 변화하였을 때, 연산부(17)는, NOP 명령을 수신한 사이클 T3' 동안에, 병렬수 P#이 2인 명령 Com#3에 포함된 모든 연산을 완료한다.
그리고 사이클 T4' 이후에서, 연산부(17)는, 병렬수 P#이 4인 명령 Com#4 및 Com#5를 디코드함으로써 생긴 복수의 실행 코드 #4a~#4d 및 #5a~#5d에 의해 지정되는 연산을 병렬로 실행하는 파이프라인 처리를 개시한다.
도 69는 본 발명에 따른 슈퍼스칼라 프로세서의 실시예를 도시하는 개략 구성도이다. 프로세서(1)는, 명령 버퍼(11)와 메인 디코더(312) 사이에, 명령 버퍼(11)에 페치된 명령 중 복수의 명령을 동시에 메인 디코더(312)에 디스패처(20)를 구비한다.
또한, 도시하는 바와 같이 본 실시예에 따른 프로세서(1)는, 도 10을 참조하여 설명한 제1 실시예에 따른 프로세서와 마찬가지의 구성을 갖고 있고, 동일한 구성 요소에는 동일한 참조 번호를 부여하여 설명을 생략한다.
디스패처(20)는, 메인 디코더(312)에 동시에 발행하는 명령수를 동적으로 변경할 수 있고, 동시에 발행하는 명령수를 클럭 제어부(19)에 병렬수 P#으로서 통지 한다.
여기서, 도 15에 도시하는 메인 디코더(12)가 1개의 VLIW 명령으로부터 형성한 N개의 중간 코드(N=1, 2 또는 4)를 출력할 때에, N개의 중간 코드를 ΔTb/N 간격으로 출력한 것과 마찬가지로, 디스패처(20)로부터 동시에 수신한 N개의 명령을 디코드하여 얻은 N개의 중간 코드를 ΔTb/N 간격으로 출력할 수 있도록 메인 디코더(312)를 구성한다. 또한 클럭 제어부(19)를, 도 21에 도시하는 클럭 제어부와 마찬가지로,Ckd, Cke, φ20~23 등의 각 클럭 신호 및 모드 절환 신호 CKEN20~CKEN22를 생성하도록 구성한다.
이와 같이 디스패처(20), 메인 디코더(312) 및 클럭 제어부(19)를 구성함으로써, VLIW 명령에 포함되는 복수의 연산이 도 10에 도시하는 프로세서(1)에서 병렬로 실행된 것과 마찬가지로, 디스패처(20)에 의해 동시에 발행된 복수의 명령의 각각 포함되는 연산은, 연산부(17)의 파이프라인 처리에 의해 병렬로 실행된다.
이상, 본 발명의 바람직한 실시 양태에 대하여 상술하였지만, 당업자가 다양한 수정 및 변경을 할 수 있는 것, 및, 특허 청구 범위는 본 발명의 참된 정신 및 취지의 범위 내에 있는 이와 같은 모든 수정 및 변경을 포함하는 것은, 본 발명의 범위에 포함되는 것은 당업자에게 이해되어야 할 것이다.
본 발명은, 일반적으로 복수의 명령을 병렬하여 실행 가능한 프로세서에 이용 가능하다. 특히 VLIW 프로세서나 슈퍼스칼라 프로세서에 이용 가능하다.

Claims (12)

  1. 삭제
  2. 삭제
  3. 삭제
  4. 실행 스테이지에서 소정의 자릿수 길이의 연산을 행하기 위한 산술-논리 연산 유닛(arithmetic-logic unit)(200)을 포함하는 프로세서로서,
    상기 산술-논리 연산 유닛은
    상기 소정의 자릿수 길이의 상기 연산을 자릿수 길이 방향으로 분할하여 생성된 부분 연산들을 각각 서로 다른 파이프라인 스테이지들에서 실행하는 복수의 부분 산술-논리 연산 유닛(201-204) 및
    상기 파이프라인 스테이지간을 각각 구획하기 위해 구비되는 복수의 파이프라인 레지스터(211-219, 221-228, 231-237)
    를 포함하고,
    상기 파이프라인 레지스터들(211-219, 221-228, 231-237)의 각각은 두 개의 동작 모드 - 입력 트리거에 동기하여 출력값이 갱신되는 플립플롭 모드 및 입력값이 그대로 출력되는 트랜스페어런트 모드 - 사이에서 절환 가능하도록 동작하며,
    상기 부분 산술-논리 연산 유닛들(201-204)에 의해 실행되는 상기 부분 연산들은, 자릿수 길이가 각각 상기 소정의 자릿수 길이를 제수(divisor) N(N은 2 이상의 정수)으로 나눈 것과 동일하고,
    상기 프로세서는,
    상기 소정의 자릿수 길이의 연산 1개를 실행하는데 걸리는 기간의 1/N배의 길이와 동일한 사이클 기간을 갖는 동작 주파수에서 상기 파이프라인 스테이지들을 구동시키는 클럭 제어부(19); 및
    상기 제수 N의 값에 따라서, 상기 파이프라인 레지스터들의 각각의 동작 모드를, 상기 플립플롭 모드 및 상기 트랜스패어런트 모드 중 어느 하나로 절환하는 파이프라인 레지스터 제어부(161-163)
    를 더 포함하는, 프로세서.
  5. 제4항에 있어서,
    상기 클럭 제어부는, 실행을 위해 페치 스테이지에서 페치된 명령어에 포함되는 연산들의 개수에 따라 상기 제수를 선택하는, 프로세서.
  6. 제4항에 있어서,
    복수의 연산 명령어를 동시에 발행하는 디스패처(dispatcher)(20)를 더 포함하고,
    상기 클럭 제어부(19)는, 상기 디스패처(20)에 의해 동시에 발행되는 연산들의 개수에 따라서 상기 제수를 선택하는, 프로세서.
  7. 산술-논리 연산 유닛(200)과, 상기 산술-논리 연산 유닛(200)에 공급되는 오퍼랜드들 및 상기 산술-논리 연산 유닛(200)으로부터 공급되는 연산 결과들을 유지하는 레지스터 파일(14)을 포함하고, 상기 산술-논리 연산 유닛(200)을 이용하여 실행 스테이지에서의 소정의 자릿수 길이의 연산을 행하는 프로세서 시스템으로서,
    상기 산술-논리 연산 유닛(200)은,
    상기 소정의 자릿수 길이의 상기 연산을 자릿수 길이 방향으로 N개의 부분(N은 2 이상의 정수)으로 분할하여 생성된 부분 연산들을 각각 서로 다른 파이프라인 스테이지들에서 실행하는 부분 산술-논리 연산 유닛들(201-204) 및
    상기 파이프라인 스테이지간을 각각 구획하기 위해 구비되는 파이프라인 레지스터들(211-219, 221-228, 231-237)
    을 이용하여 구성되고,
    상기 레지스터 파일(14)은, 상기 소정의 자릿수 길이의 연산 1개를 실행하는데 사용되는 기간 내에 N회 읽기/쓰기 연산들을 가능하게 하는 액세스 레이턴시를 갖는 저장 장치를 이용하여 구성되고,
    상기 파이프라인 레지스터들(211-219, 221-228, 231-237)은 각각 두 개의 동작 모드 - 입력 트리거에 동기하여 출력값이 갱신되는 플립플롭 모드 및 입력값이 그대로 출력되는 트랜스페어런트 모드 - 사이에서 절환 가능하도록 동작하는 저장 장치로부터 구성되며,
    상기 부분 산술-논리 연산 유닛들에 의해 실행되는 상기 부분 연산들은 자릿수 길이가 각각 상기 소정의 자릿수 길이를 제수 N으로 나눈 것과 동일하고,
    상기 프로세서 시스템에는,
    상기 소정의 자릿수 길이의 연산 1개를 실행하는데 사용되는 기간의 1/N배의 길이와 동일한 사이클 기간을 갖는 동작 주파수에서 상기 파이프라인 스테이지들을 구동시키는 클럭 제어부(19); 및
    상기 제수 N의 값에 따라서, 상기 파이프라인 레지스터들의 각각의 동작 모드를, 상기 플립플롭 모드 및 상기 트랜스패어런트 모드 중 어느 하나로 절환하는 파이프라인 레지스터 제어부(161-163)
    가 구비되는 것을 특징으로 하는, 프로세서 시스템.
  8. 제7항에 있어서,
    상기 클럭 제어부(19)는, 실행을 위해 페치 스테이지에서 페치된 명령어에 포함되는 연산들의 개수에 따라 상기 제수를 선택하는, 프로세서 시스템.
  9. 제7항에 있어서,
    상기 프로세서 시스템에는, 복수의 연산 명령어를 동시에 발행하는 디스패처(20)가 더 구비되고,
    상기 클럭 제어부(19)는, 상기 디스패처(20)에 의해 동시에 발행되는 연산들의 개수에 따라서 상기 제수를 선택하는, 프로세서 시스템.
  10. 삭제
  11. 삭제
  12. 삭제
KR1020097019456A 2007-05-17 2007-05-17 연산 유닛, 프로세서 및 프로세서 아키텍처 KR101190937B1 (ko)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2007/060161 WO2008142750A1 (ja) 2007-05-17 2007-05-17 演算ユニット、プロセッサ及びプロセッサアーキテクチャ

Publications (2)

Publication Number Publication Date
KR20100005035A KR20100005035A (ko) 2010-01-13
KR101190937B1 true KR101190937B1 (ko) 2012-10-12

Family

ID=40031477

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020097019456A KR101190937B1 (ko) 2007-05-17 2007-05-17 연산 유닛, 프로세서 및 프로세서 아키텍처

Country Status (6)

Country Link
US (1) US8281113B2 (ko)
EP (1) EP2148272B1 (ko)
JP (1) JP5126226B2 (ko)
KR (1) KR101190937B1 (ko)
CN (1) CN101689108A (ko)
WO (1) WO2008142750A1 (ko)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140032917A1 (en) * 2010-10-29 2014-01-30 Nec Corporation Group signature processing device for processing a plurality of group signatures simultaneously
JP5480793B2 (ja) * 2010-12-10 2014-04-23 株式会社日立製作所 プログラマブルコントローラ
US8804764B2 (en) 2010-12-21 2014-08-12 International Business Machines Corporation Data path for data extraction from streaming data
US20120198213A1 (en) * 2011-01-31 2012-08-02 International Business Machines Corporation Packet handler including plurality of parallel action machines
GB2537524B (en) * 2014-09-30 2017-09-27 Imagination Tech Ltd Variable length execution pipeline having an odd number of stages
CN107357561A (zh) * 2017-05-17 2017-11-17 苏州大学 基于sdr的面向物联网的asip架构及设计方法
US11132233B2 (en) * 2018-05-07 2021-09-28 Micron Technology, Inc. Thread priority management in a multi-threaded, self-scheduling processor
CN110728364A (zh) * 2018-07-17 2020-01-24 上海寒武纪信息科技有限公司 一种运算装置和运算方法
CN110045989B (zh) * 2019-03-14 2023-11-14 合肥雷芯智能科技有限公司 一种动态切换式低功耗处理器
CN110597622A (zh) * 2019-08-13 2019-12-20 欣扬电脑股份有限公司 多节点异质运算装置及多节点异质运算系统

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003216416A (ja) 2002-01-25 2003-07-31 Ando Electric Co Ltd 論理演算回路

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS54143036A (en) * 1978-04-28 1979-11-07 Toshiba Corp Decentralized addition and subtraction system
JPS60123930A (ja) * 1983-12-09 1985-07-02 Hitachi Ltd 高速演算方式
JPH04238533A (ja) * 1991-01-23 1992-08-26 Hitachi Ltd パイプライン制御方法を使用した演算器
JP3144859B2 (ja) * 1991-12-04 2001-03-12 沖電気工業株式会社 算術論理演算装置
US5619664A (en) * 1994-01-04 1997-04-08 Intel Corporation Processor with architecture for improved pipelining of arithmetic instructions by forwarding redundant intermediate data forms
US6230257B1 (en) 1998-03-31 2001-05-08 Intel Corporation Method and apparatus for staggering execution of a single packed data instruction using the same circuit
JP4234925B2 (ja) 1999-08-30 2009-03-04 アイピーフレックス株式会社 データ処理装置、制御方法およびその記録媒体
JP2004102988A (ja) 1999-08-30 2004-04-02 Ip Flex Kk データ処理装置
US6988181B2 (en) * 2000-03-08 2006-01-17 Sun Microsystems, Inc. VLIW computer processing architecture having a scalable number of register files
JP2004062281A (ja) * 2002-07-25 2004-02-26 Nec Micro Systems Ltd パイプライン演算処理装置及びパイプライン演算制御方法
US7047397B2 (en) * 2002-09-13 2006-05-16 Intel Corporation Method and apparatus to execute an instruction with a semi-fast operation in a staggered ALU
GB2402760B (en) 2003-06-12 2006-01-11 Advanced Risc Mach Ltd Improvements in flexibility of use of a data processing apparatus
WO2005091130A2 (en) * 2004-03-10 2005-09-29 Koninklijke Philips Electronics N.V. Instruction pipeline
US7797363B2 (en) 2004-04-07 2010-09-14 Sandbridge Technologies, Inc. Processor having parallel vector multiply and reduce operations with sequential semantics
US7076682B2 (en) * 2004-05-04 2006-07-11 International Business Machines Corp. Synchronous pipeline with normally transparent pipeline stages
WO2006092792A2 (en) * 2005-03-02 2006-09-08 Mplicity Ltd. Efficient machine state replication for multithreading
US20060253659A1 (en) * 2005-05-05 2006-11-09 International Business Machines Corporation Method and virtual port register array for implementing shared access to a register array port by multiple sources
WO2008012874A1 (fr) * 2006-07-25 2008-01-31 National University Corporation Nagoya University Dispositif de traitement d'opération

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003216416A (ja) 2002-01-25 2003-07-31 Ando Electric Co Ltd 論理演算回路

Also Published As

Publication number Publication date
CN101689108A (zh) 2010-03-31
EP2148272A1 (en) 2010-01-27
US20100058030A1 (en) 2010-03-04
JPWO2008142750A1 (ja) 2010-08-05
EP2148272A4 (en) 2011-03-09
US8281113B2 (en) 2012-10-02
WO2008142750A1 (ja) 2008-11-27
JP5126226B2 (ja) 2013-01-23
EP2148272B1 (en) 2012-08-08
KR20100005035A (ko) 2010-01-13

Similar Documents

Publication Publication Date Title
KR101190937B1 (ko) 연산 유닛, 프로세서 및 프로세서 아키텍처
US5163139A (en) Instruction preprocessor for conditionally combining short memory instructions into virtual long instructions
KR930007041B1 (ko) 명령 지정방법 및 실행장치
EP2011018B1 (en) Apparatus and method for processing an instruction matrix specifying parallel and dependent operations
JP2500036B2 (ja) ハイブリッドパイプライン接続プロセッサおよびその処理方法
JP5699554B2 (ja) ベクトル処理回路、命令発行制御方法、及びプロセッサシステム
US6148395A (en) Shared floating-point unit in a single chip multiprocessor
GB2524619A (en) Method and apparatus for implementing a dynamic out-of-order processor pipeline
JPH1124929A (ja) 演算処理装置およびその方法
EP1124181A1 (en) Data processing apparatus
US20030005261A1 (en) Method and apparatus for attaching accelerator hardware containing internal state to a processing core
US20240004663A1 (en) Processing device with vector transformation execution
CN112074810B (zh) 并行处理设备
US6115730A (en) Reloadable floating point unit
US7437544B2 (en) Data processing apparatus and method for executing a sequence of instructions including a multiple iteration instruction
US7134000B2 (en) Methods and apparatus for instruction alignment including current instruction pointer logic responsive to instruction length information
US8006074B1 (en) Methods and apparatus for executing extended custom instructions
JP3708022B2 (ja) プロセッサ
US5862399A (en) Write control unit
TWI334990B (en) Virtual cluster architecture and method
US7112991B1 (en) Extended custom instructions
JP5701930B2 (ja) 半導体装置
WO2003044688A2 (en) Latency tolerant processing equipment
JP2861234B2 (ja) 命令処理装置
JP2011128672A (ja) スーパースカラプロセッサ及びその命令処理方法

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20150918

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20160921

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20170919

Year of fee payment: 6

LAPS Lapse due to unpaid annual fee