Esta seção analisa o Sony CXD8530BQ, um dos dois grandes chips que o console possui. É o que hoje chamamos de "System-on-Chip" (SoC — Sistema-no-Chip, em tradução livre).
As origens
O processador principal é um daqueles "x projetado por y, com base em z e adquirido de forma secundária por w", o que é um pouco denso para resumir em algumas frases. Então, por que não começamos com um pouco de contexto histórico?
Um pouco de história
Os primeiros anos da década de 90 foram marcados por uma mudança no destino de muitas CPUs populares. As CPUs de 8 bits, como a Z80 e a 6502, que antes eram líderes de mercado, já não estavam mais em destaque. O famoso 68000 da Motorola, juntamente com outros projetos de 16 bits que fizeram sucesso no final dos anos 80, tornaram-se candidatos à substituição. Mesmo nessa época, no mundo dos PCs, Tanenbaum, em seu debate celebrado com Torvalds, deu apenas mais cinco anos de vida para a arquitetura x86 da Intel no mercado doméstico.
À primeira vista, pode parecer que o desenvolvimento tecnológico atingiu um limite naquele momento. Mas, na realidade, havia uma nova onda de CPUs pouco conhecidas que faziam seu caminho para dispositivos populares. Muitos desses projetos tiveram origem na academia, e existiam para provar determinados conjuntos de ideias de concepção. Exemplos de CPUs da próxima geração incluídos neste ponto:
- MIPS: adotado pela Silicon Graphics Incorporated (destinado a estações de trabalho gráficas).
- PowerPC: adotado pela Apple (destinado ao mercado de computadores pessoais).
- SPARC: criado pela Sun Microsystems (destinado para servidores e estações de trabalho empresariais).
- ARM: criado pela Acorn (destinado ao mercado consumidor e estações de trabalho).
- ... e muitos outros chips "microcontroladores" ainda não concluídos ou adotados por qualquer indústria. Como o SH da Hitachi ou o V810 da NEC, que para surpresa deles, foram posteriormente escolhidos para o Sega Saturn e o Nintendo Virtual Boy.
Todos esses processadores tinham algo em comum: seguiram a disciplina do Reduced Instruction Set Computer (RISC), que mudou radicalmente a maneira como estes chips precisavam ser projetados e programados. Uma regra das CPUs RISC ditava que uma única instrução não pode misturar operações de memória com operações de registrador, permitindo que projetistas de hardware simplifiquem o circuito que executa instruções... e, em seguida, aprimorem-no com técnicas de paralelismo.
A MIPS e a Sony
No final dos anos 80, os processadores MIPS se tornaram um tópico de conversa após serem adotados (e posteriormente adquiridos) pela Silicon Graphics Incorporated (SGI) para equipar seus equipamentos. A SGI foi uma inovação influente no mercado de gráficos de computador, especialmente com o desenvolvimento de pipelines de vértices acelerados por hardware, cuja tarefa era originalmente realizada por software (dentro da CPU).
Durante o desenvolvimento do PlayStation, a MIPS estava oferecendo os processadores da série R3000A. Tratava-se de máquinas de 32 bits e era parte de seu catálogo de baixo custo. Consequentemente, embora o R3000A não fizesse parte da linha principal (ao contrário do R4000, que outros escolheriam mais tarde), era um investimento atraente em termos de custo.
A Sony projetou seus chips de áudio e de gráficos internamente, mas ainda precisava de um chip principal que pudesse conduzir os dois. A CPU escolhida tinha que ser poderosa o suficiente para mostrar as impressionantes capacidades dos chips da Sony, mas também acessível para manter o console a um preço competitivo.
A LSI e a encomenda
Ao mesmo tempo, a LSI Logic (uma fabricante de semicondutores) estava fornecendo um programa "construa sua própria" CPU para empresas. Este serviço era chamado de CoreWare e permitia que os clientes construíssem seus próprios pacotes de CPU escolhendo uma série de blocos de circuito . Parte da biblioteca da CoreWare incluía o bloco "CW33300", um núcleo de CPU derivado do LSI LR33300, um chip de CPU genérico que a LSI também comercializava.
Agora, onde estou querendo chegar com isso? Ocorre que o LR33300 e o CW33300 da LSI são uma versão compatível ao nível binário da família MIPS R3000A. Suas arquiteturas diferem ligeiramente em algumas áreas, mas a interface de programação (ISA MIPS) permanece a mesma.
No final, a Sony contratou a LSI para construir seu pacote de CPU. Eles escolheram o CW33300, alteraram alguns bits e combinaram com outros blocos para formar o chip encontrado na placa-mãe do PlayStation.
O produto oferecido
O núcleo da CPU resultante opera a 33,87 MHz e possui:
- A ISA MIPS: a primeira versão do conjunto de instruções MIPS. Entre outras coisas, as palavras têm comprimento de 32 bits e o conjunto de instruções inclui instruções de multiplicação e divisão.
- 32 registradores de propósito geral e 2 registradores de multiplicação/divisão: eles também têm 32 bits. Um dos registradores de propósito geral é sempre zero (
R0), o que é comum em processadores RISC. - Barramento de dados de 32 bits: no PS1, o barramento de dados se bifurca em dois barramentos.
- Barramento principal (32 bits) -> conecta o MDEC e a GPU.
- Barramento secundário (16/8 bits) -> conecta o restante dos chips de E/S. Esse barramento é conectado pela Unidade de Interface do Barramento (Bus Interface Unit), que também permite o acesso às portas especiais da GPU e da SPU.
- Barramento de endereço de 32 bits: até 4GB de memória física (ou seja, RAM, E/S mapeada em memória, etc.) podem ser acessados.
- Pipeline de 5 estágios: até cinco instruções podem ser executadas simultaneamente (uma explicação detalhada pode ser encontrada em um artigo anterior).
- 4 KB de cache de instruções: ele também pode ser "isolado", permitindo que o programa manipule a cache de instruções diretamente.
- Surpreendentemente, não há cache de dados. Os 1 KB de memória normalmente usados para o cache de dados são mapeados para um endereço fixo . Essa área também é chamada de Scratchpad (SRAM rápida).
Para fazer algo significativo, a Sony forneceu 2 MB de RAM para uso geral. Curiosamente, eles instalaram chips Extended Data Out (EDO) na placa-mãe. Esses chips são ligeiramente mais eficientes do que uma DRAM típica, obtendo menor latência.
Assumindo o controle da CPU
Em algum momento, qualquer subsistema (gráfico, áudio ou CD) exigirá grandes quantidades de dados em alta velocidade. No entanto, a CPU nem sempre conseguirá acompanhar a demanda.
Por esse motivo, o controlador de CD-ROM, MDEC, GPU, SPU e a porta paralela têm acesso a um controlador DMA exclusivo sempre que precisam. O DMA assume o controle do barramento principal e realiza uma transferência de dados. A taxa resultante é muito mais rápida do que se dependesse da CPU, embora ela ainda seja necessária para configurar uma transferência do DMA.
Além disso, tenha em mente que quando o DMA é ativado, a CPU não pode mais acessar o barramento principal. Isso significa que a CPU ficará ociosa a menos que tenha algo na Scratchpad para mantê-la ocupada!
Complementando o núcleo
Assim como outros processadores baseados no MIPS R3000, o CW33300 suporta configurações com até quatro coprocessadores, mas a Sony personalizou-o com três:
Coprocessador de Controle de Sistema
Identificado como "CP0", o coprocessador de controle de sistema é um bloco comum encontrando em CPUs MIPS. Em sistemas baseados no R3000, como este, o CP0 controla como a cache é implementada. Assim, permitindo o acesso direto à cache de dados (na forma de "Scratchpad") e à cache de instruções (usando o "isolamento de cache"). O coprocessador de controle também é responsável por lidar com as interrupções, exceções e pontos de parada, sendo este último útil durante a depuração.
Espera aí, os coprocessadores não deveriam apenas expandir as funções da CPU? Por que o CP0 está fortemente acoplado à CPU?
De fato, os núcleos R3000 dependem do coprocessador de controle de sistema para conseguir usar muitos componentes, mas se isso deve ser "legal" ou não, depende da interpretação da palavra "coprocessador". Segundo a MIPS, um coprocessador não é estritamente uma parte opcional da CPU, ele também pode comandar o ambiente da CPU (cache, interrupções, etc.). Portanto, um coprocessador pode ser uma parte integrante do sistema. Isso é apenas algo a se ter em mente ao falar sobre sistemas relacionados ao MIPS.
Posteriormente, os sistemas baseados no R4000 incorporaram uma unidade de gerência de memória (MMU, do inglês Memory Management Unit) e um Translation Lookaside Buffer (TLB) neste bloco, aumentando assim suas capacidades e assumindo novos papéis.
Geometry Transformation Engine
A "CP2" ou Geometry Transformation Engine (GTE) é um processador matemático especial que acelera cálculos de vetores e matrizes.
Embora opere apenas com valores do tipo ponto fixo, ele ainda fornece operações úteis para gráficos 3D, como:
- Multiplicação e adição de matriz ou vetor; e quadrado de vetor.
- Transformação de perspectiva (usada para projeções 3D).
- Produto externo de dois ou três vetores (este último é usado para recorte).
- Muitas funções de interpolação que usam diferentes parâmetros.
- Depth Cueing(efeito profundidade, em tradução livre) e valor de cor de uma fonte de luz (usado para operações de iluminação e cor).
- Média de profundidade Z (suspeito que isso seja para a "tabela de ordenação", mas detalhes na seção "gráficos").
Você não precisa se lembrar de todas essas informações para seguir o restante do artigo! Apenas tenha em mente que o GTE cuidará das primeiras etapas do pipeline de gráficos, como projeção 3D, iluminação e recorte. Isso ajudará a gerar os dados necessários que serão enviados à GPU para renderização.
Motion Decoder
O Motion Decoder (decodificador de movimento, em tradução livre), também é chamado "MDEC" ou "Macroblock Decoder", é outro processador que fica ao lado da CPU. Desta vez, ele descomprime "Macroblocks" em um formato que a GPU consegue entender. Um Macroblock é uma estrutura de dados que contém uma imagem com codificação semelhante à do JPEG.
O MDEC descomprime por vez bitmaps feitos de 8x8 píxeis com 24 bpp. O guia de programação de Walker afirma que o MDEC pode processar 9.000 macroblocks por segundo. Isso permitiria transmitir um Full-Motion Video (FMV — vídeo de movimento completo, em tradução livre) de 320x240 píxeis a 30 quadros por segundo.
O DMA é usado para enviar dados comprimidos através do CD-ROM -> RAM -> MDEC. O mesmo caminho é percorrido na direção oposta, embora, neste caso, o destino seja a VRAM.
Embora este componente esteja dentro do SoC e compartilhe o mesmo barramento de dados, ele não é um coprocessador MIPS, então a CPU/DMA o acessa através do mapa de memória (em vez de interceptar instruções).
Para obter mais informações sobre a unidade MDEC, sugiro verificar os textos de Sabin e de Czekański's .
Unidades ausentes?
Até agora, temos uma "CP0" e uma "CP2", mas onde está a "CP1"? Bem, essa está reservada para uma Unidade de Ponto Flutuante (FPU) e, infelizmente, a Sony não forneceu uma. Isso não significa que a CPU não possa realizar aritmética com números decimais, apenas não será rápida o suficiente (usando FPU emulada por software) ou muito precisa (usando aritmética de ponto fixo).
A lógica do jogo (envolvendo física, detecção de colisão, etc.) ainda pode funcionar com aritmética de ponto fixo. A codificação de ponto fixo armazena números decimais com um número imutável de casas decimais. Isso implica uma perda de precisão após certas operações, mas lembre-se, isso é um console de videogame, não um simulador de voo profissional. Portanto, o trade-off entre precisão e desemprenho é relativamente viável.
Aliás, às vezes confundo os tipos de números "ponto fixo", "ponto flutuante", "decimal" e "inteiro" (espero que não mais!). Se você se sente da mesma forma, recomendo dar uma olhada no resumo rápido de Gabriel Ivancescu para atualizar rapidamente esses conceitos.
Uma infinidade de atrasos
Como já vimos anteriormente, o processador CW33300 é um processador com pipeline, o que significa que ele coloca várias instruções em fila e as executa em paralelo em diferentes estágios. Isso melhora enormemente a taxa de processamento de instruções, mas se não for controlado adequadamente, pode levar a riscos de pipeline (pipeline hazards), resultando em erros computacionais.
A arquitetura MIPS I é suscetível a riscos de controle e de dados , o que significa que as instruções podem ser executadas quando não deveriam; e que as instruções podem operar com dados desatualizados antes de serem atualizados.

Instruções de "Spyro The Dragon" visualizada no depurador do emulador NO$PSX. Observe como as instruções LW (load word from memory), JAL (jump and link) e BAL (branch on not equal) são seguidas por um slot de atraso para evitar os riscos de pipeline. As instruções marcadas em vermelho são de preenchimento sem utilidade. As instruções marcadas em azul executam operações úteis.
Consequentemente, as CPUs MIPS I apresentam o seguinte comportamento:
- Qualquer instrução que segue um código de operação do tipo "branch" ou "jump" é executada incondicionalmente: assim, os desenvolvedores têm que preencher manualmente o pipeline com instruções modestas (como
calcular 0 mais 0) após o branch ou jump para mitigar o risco de controle. Essas instruções de preenchimento são chamados de branch delay slots.- As CPUs modernas converteram esse fenômeno em vantagem: predição de branch. Adicionando circuitos extras para detectar o risco de controle, a CPU descarta os novos cálculos se a condição de branch/jump não for atendida. Mas se for, a CPU economiza algum tempo.
- As instruções de carga não interrompem o pipeline até que os dados recuperados estejam disponíveis: o segundo estágio do pipeline (chamado de "RD" ou "Read and Decode" - Leia e Decodifique, em tradução livre) coleta os operadores, que serão usados para realizar o cálculo no terceiro estágio (ALU). O quarto estágio ("MEM", de "acesso à MEMória") procura por dados na memória (ou seja, na RAM principal, no leitor de CD, etc.). Agora, aqui está o problema: quando uma instrução de carga recuperou os dados de fora, a instrução seguinte já havia buscado os operadores. Isso significa que uma instrução dependente dos valores da instrução de
cargaanterior requer um preenchedor entre elas, para que os operadores corretos possam ser buscados a tempo.
Como podemos ver a partir do exemplo, alguns slots de atraso são preenchidos com instruções úteis, que realizam cálculos que não são afetados pelo risco de pipeline. Assim, os slots de atraso nem sempre implicam em desperdício de ciclos.
Geralmente, o compilador ou montador automaticamente reorganizará as instruções para preencher os slots com instruções úteis, ou, em último caso, adicionará preenchimentos inúteis. Em resumo, esse fenômeno é uma mistura de coisas boas e ruins.