• Aucun résultat trouvé

Graphe et repr´esentations lin´eaires

Um aspecto fundamental na concepção do processador ARPA-CP foi o projecto dos módulos

Hazard Control Unit e Hazard Handling Unit, os quais, em conjunto são responsáveis pela

detecção e resolução de dependências de dados entre uma instrução que se encontre na etapa

ID e outras instruções em etapas mais avançadas do pipeline.

4.3.1.7.1 Módulo Hazard Handling Unit - O módulo Hazard Handling Unit tem por objectivos detectar dependências e determinar se podem ou não ser resolvidas por forwar-

ding. A figura 4.10 ilustra o seu interface. Este módulo foi concebido de forma a poder

ser usado em qualquer uma das etapas EX, MA ou WB, independentemente da sua latência. Além disso, os módulos de cada uma das etapas podem ser ligados em cascata, o que sim- plifica a concepção global do processador e a compreensão do seu funcionamento. Para tal foi elaborado um modelo parametrizável em VHDL. Durante a instanciação do modelo em cada uma das etapas devem ser atribuídos os valores correctos aos parâmetros. Os parâme- tros disponibilizados são todos do tipo booleano, excepto o “latency”, e possuem o seguinte significado:

4.3. O PROCESSADOR ARPA-CP 125

Hazard Handling Unit (isWbStage = ?; fastWbStage = ?; enableFwd = ?; latency = ?) op0RegIndexIn op0FwdFlag op1RegIndexIn op1FwdFlag op0HzdFlagOut dstRegWriteOut dstRegIndexOut op0RegIndexOut op1RegIndexOut op0HzdFlagIn dstRegWriteIn dstRegIndexIn slowOpFlagIn slowOpFlagOut op1HzdFlagOut op1HzdFlagIn reset clear

Figura 4.10: Interface do módulo Hazard Handling Unit do processador ARPA-CP usado nas etapas EX, MA e WB.

fastWbStage - considerado apenas no caso do módulo pertencer à etapa WB, es-

tando associado ao parâmetro global do processador FAST_WB_STAGE explicado na secção 4.3.3;

enableFwd - permite activar ou desactivar estaticamente (durante a síntese lógica do

processador) o forwading do resultado da instrução presente na etapa a que o módulo pertence para a etapa ID;

latency - especifica a latência interna do módulo, isto é, o número de sub-etapas

internas, correspondendo à latência da etapa subtraída de uma unidade.

As entradas dstRegWriteIn e dstRegIndexIn indicam se a instrução presente na respectiva etapa produz um resultado que deve ser escrito num registo de uso geral do pro- cessador e qual o respectivo índice. A informação relativa ao registo de destino do resultado das instruções atravessa as etapas do pipeline através dos vários módulos Hazard Handling

Unit até à etapa WB. As saídas dstRegWriteOut e dstRegIndexOut de um módulo Hazard Handling Unit destinam-se a ser ligadas às entradas correspondentes do módulo

semelhante na etapa seguinte do pipeline.

As entradas op0RegIndexIn e op1RegIndexIn indicam os índices dos registos even- tualmente usados como operandos pela instrução presente na etapa ID. A estas entradas estão ligadas as saídas op0RegIndexOut e op1RegIndexOut, respectivamente, de forma a passar esta informação para a etapa seguinte do pipeline.

As entradas op0HzdFlagIn e op1HzdFlagIn são indicadores de dependências de da- dos provenientes da etapa seguinte do pipeline. Esta informação é combinada com a detec- ção de dependências feita em cada etapa e propagada para trás no pipeline através das saídas

op0HzdFlagOut e op1HzdFlagOut. De facto, para que a detecção de dependências produza resultados correctos deve ser feita da etapa WB para a EX.

A entrada slowOpFlagIn indica que a instrução presente nesta etapa é uma instrução “lenta”, isto é, cujo resultado só é conhecido na etapa WB. Exemplos de instruções deste tipo são as de leitura da memória de dados (loads), as divisões e eventualmente as multiplica- ções. O resultado de todas as outras instruções é conhecido no final da etapa EX. A saída slowOpFlagOut destina-se a ligar à entrada correspondente na etapa seguinte do pipeline. As saídas op0FwdFlag e op1FwdFlag indicam que o operando solicitado pelas entradas op0RegIndexIn e op1RegIndexIn está disponível nesta etapa pelo que pode ser feito o seu forwarding para a etapa ID.

A entrada reset é um sinal de inicialização assíncrona usado durante o arranque do sis- tema. A entrada clk é o sinal de relógio do pipeline do processador. A entrada clear é usada nas situações de excepção para limpar de forma síncrona com o sinal de relógio a etapa do pipeline, eliminando a instrução que aí se encontra para que seja iniciada a execução da rotina de tratamento da excepção.

De notar que toda a detecção de dependências e a tentativa da sua resolução são feitas em paralelo com a descodificação da instrução na etapa ID. Desta forma reduz-se o atraso de um potencial caminho crítico do processador.

4.3.1.7.2 Módulo Hazard Control Unit - O módulo Hazard Control Unit, pertencente ao módulo CPU e cujo interface é ilustrado na figura 4.11, é responsável por determinar se a instrução presente na etapa ID pode avançar no pipeline, ou se a etapa ID (e consequen- temente a IF) devem ser congeladas até que todos os operandos de que necessite estejam disponíveis. Esta decisão é baseada na seguinte informação:

Sinais op0DependFlag e op1DependFlag que indicam qual ou quais os operan-

dos efectivamente usado(s) pela instrução presente na etapa ID;

Sinais ex_op0HzdFlag e ex_op1HzdFlag que indicam qual ou quais os operan-

dos potencialmente causadores de uma dependência de dados;

Sinal multDivHzdFlag que sinaliza a existência de uma dependência detectada

4.3. O PROCESSADOR ARPA-CP 127 ex_op0FwdFlag ex_op1FwdFlag ex_op1HzdFlag

Hazard

Control Unit

ma_op0FwdFlag ma_op1FwdFlag copHazardFlag op0DependFlag op0FwdControl op1FwdControl op1DependFlag wb_op0FwdFlag wb_op1FwdFlag stallProcessor ex_op0HzdFlag cpuStall multDivHzdFlag

Figura 4.11: Interface do módulo Hazard Control Unit do processador ARPA-CP.

Sinal copHazardFlag que sinaliza a existência de uma dependência detectada por

um dos coprocessadores;

Sinais *_op0FwdFlag e *_op1FwdFlag (em que “*” representa ex, ma ou wb)

que indicam qual ou quais os operandos candidatos a forwarding e a etapa de onde pode ser feito (EX, MA ou WB).

O princípio de funcionamento deste módulo é relativamente simples. Se o operando 0 (e/ou 1) for usado pela instrução que se encontra etapa ID, será activado o sinal op0DependFlag (e/ou op1DependFlag) pelo descodificador de instruções. Se este operando for resultado de uma instrução presente numa etapa mais avançada do pipeline, uma de duas coisas pode acontecer:

O resultado ainda não é conhecido ou o forwarding não está implementado da etapa

onde ele se encontra, pelo que a dependência não pode ser resolvida. Neste caso as etapas IF e ID devem ser congeladas e as instruções nas restantes etapas devem prosse- guir normalmente no pipeline. Isto consegue-se através da inserção por hardware, no ciclo de relógio seguinte, de uma instrução nop (no operation) na etapa EX. A saída cpuStall do módulo Hazard Control Unit será activada neste caso;

O resultado já é conhecido e o forwarding está implementado da etapa onde ele se

encontra, pelo que a dependência pode ser resolvida. Neste caso, não é utilizado o valor actual do registo operando da instrução em ID mas o resultado que será lá escrito quando a respectiva instrução terminar a execução. A saída cpuStall do módulo

As saídas op0FwdControl e op1FwdControl do módulo Hazard Control Unit corres- pondem à justaposição dos sinais *_op0FwdFlag e *_op0FwdFlag, respectivamente, sendo usadas para controlar a multiplexagem no módulo Forwarding Unit na etapa ID. De notar que a prioridade de cada um dos indicadores de forwarding dos sinais op0FwdControl e op1FwdControl varia de forma decrescente da etapa EX para a etapa WB, uma vez que na primeira encontra-se a instrução mais recente do pipeline enquanto na última está presente a mais antiga.

Finalmente, a entrada stallProcessor pode ser usada para suspender o carregamento de instruções da memória de código, independentemente da ocorrência de dependências, podendo ser controlada externamente.

Documents relatifs