Objetivos Ementa Livros Professores: JOSEANA ELMAR
|
Guia de Laboratório RISC-VObservaçõesÉ precisa descompactar o arquivo riscv1.zip. Os arquivos dentro do .zip contém Systemverilog que compila e funciona, mas só tem algumas funções bem básicas como por exemplo o program counter. Todos os parâmetros e variáveis necessários estão definidos
e a muitas variáveis e atribuído o valor zero ou -1 em algum lugar do código
para sugerir um lugar onde você deve fazer a atribuição do valor correto.
Algumas vezes o valor correto não é um só, é preciso usar
um O livro de Harris é essencial para conseguir fazer esses laboratórios. Se você ficar com dúvida sobre um determinado sinal, clique no esquemático com o botão direito do mouse e escolha View Image. Em seguida dê dois cliques com botão esquerdo do mouse e tecle Ctrl-C. Abra o livro da disciplina e faça Ctrl-F e dentro do campo de busca Ctrl-V. Dentro de um esquemático, como é o caso de SystemVerilog, sinais e barramentos tem escopo local. Por exemplo o barramento RD da memória de instruções, o barramento RD do banco de registradores e o barramento RD do datapath nada tem a ver um com o outro. Porém, sinais e barramentos podem ser conectados um com outro. Assim por exemplo o barramento RD do controlador está conectado com o barramento RD do processador o qual está conectado com o barramento RD do datapath. Neste caso, o barramento RD do datapath sempre está com o mesmo valor do barramento RD do controlador. Diferenças entre o livro de Harris e o RISC-V dessa guia:
Diferença entre o RISC-V de Andrew Waterman, Design of the RISC-V Instruction Set Architecture, 2016 e o RISC-V dessa guia:
PC e Memória de InstruçõesLCD
A instrução addiLCD
Centavos
A instrução lwLCD
A instrução lw funcionando junto com addiLCD
A instrução swLCD
Centavos
* consulte o arquivo memo.mif para saber em quais endereços da memória estão armazenados valores nesta faixa A instrução beqO sinal PC' do esquemático aparece no Systemverilog com nome LCD
Centavos
* ULA faz subtração no caso do beq, mas faz soma no caso do addi Chamada de uma sub-rotina(Quem quer ser chique chama "sub-rotina" de "método") Pesquise no guia de programação em C:
Dica: observe tanto os arquivos inst.s ): .section .text .globl main main: addi t3, zero, 0x67 /* uma instrução qualquer, ela não precisa funcionar, só precisa avançar o PC */ ???? lupi /* a chamada da sub-rotina lupi */ addi t3, zero, 0x67 /* uma instrução qualquer, ela não precisa funcionar, só precisa avançar o PC */ addi t3, zero, 0x67 /* uma instrução qualquer, ela não precisa funcionar, só precisa avançar o PC */ addi t3, zero, 0x67 /* você deve ter uma quantidade de instruções aqui diferente da quantidade do seu vizinho */ lupi: addi t3, zero, 33 /* esta instrução seria o miolo da sub-rotina lupi */ ???? /* o retorno da sub-rotina lupi */ Faça este código funcionar no seu processador RISC-V. Dicas:
Centavos
Unidade de Entrada/SaídaPara encaminhar um valor para a saída usa-se a intrução A entrada EN habilita o resgistrador. Notas
Valores maiores do que 4 devem ser usados para entrada e saída. Valores e registradores usados devem ser diferentes daqueles do seu vizinho. InterrupçãoO registrador SEPC é um registro de controle e status (Control/Status Register). A instrução CSRR serve para ler um registro de controle e status (Control/Status Register Read). A especificação para a instrução CSSRS está no documento riscv-priv-spec-1.7.pdf O opcode da instrução CSSRS é o mesmo de ECALL e EBREAK. O formato da instrução CSSRS é parecido ao tipo I, sendo que o campo IMM é usado para indicar qual registro de controle e status a instrução deve usar. O número que indica o registador SEPC é 0x141. O valor do campo funct3 é 2 (010 em binário). O campo RS1 aponta para o registrador zero no caso da instrução CSSR. Centavos
*Na rotina principal deve ter uma série de pelo menos 5 instruções addi diferentes entre eles e diferentes das do seu vizinho.
PrivilégioRISC-V define quatro níveis de privilégio, na nossa implementação usaremos só dois: 0=User, 1=Supervisor. O nível de privilégio está no registrador mstatus. No RISC-V este registrador tem 32 bits, mas na nossa implementação este registrador tem só 1 bit. O registrador fica dentro do controller. Na nossa implementação mstatus é resetado para 0. A unidade de gerenciamento de memória do RISC-V possibilita reservar determinadas faixas de endereços para poderem ser acessados somente no modo Supervisor. Na nossa implementação, no modo User, nem sw nem lw podem ser executados. Executando sw ou lw em modo User deve causar uma exceção chamada "Environment Call exception". Na nossa implementação, a "Environment Call exception" deve pular para o endereço 0x3C. Na nossa implementação, para simplificar, não iremos colocar nenhuma instrução específica naquele endereço. Se o PC chegar naquele endereço, o experimento está encerrado (pode travar o clock). Para poder acessar a memória a partir do modo User, é necessário executar um ECALL (funct12=000000000000, funct3=privilégio_desejado). Esta instrução copia o privilégio desejado de funct3 (na nossa implementação o bit 12 da instrução) para mstatus. Na nossa implementação, a instrução ECALL sempre pula para o endereço 0x30. O endereço de retorno do ECALL deve ser guardado no registrador sepc. A volta do ECALL é feita através da instrução SRET (mesmo opcode de ECALL, funct12=000100000010). Além de resetar o privilégio no registrador mstatus, a instrução SRET do RISC-V também coloca o valor de sepc de volta no PC. Na nossa implementação, SRET somente precisa resetar mstatus. As instruções csrr e jr podem ser usados para voltar da chamada do ECALL. Notas
Recomenda-se para este exercício desabilitar a interrupção, deixando o sinal interrupt sempre igual a 0. CacheInstancie a cache descrita no arquivo cache.sv e faça testes para demonstrar seu funcionamento. Cada teste diferente vale 1 ponto de nota. O teste precisa estar explicado em comentário e todos os registradores e valores usados precisam ser diferentes daqueles usados por seu vizinho, do lado, da frente, de trás e da mesma bancada. |