da última vez que olhei para um simples processador RISC de 16 bits voltado para os alunos. Ele precisava de uma pequena ajuda na documentação, bem como teve um arquivo ausente, no entanto, consegui que simulasse a utilização de um livre na ferramenta da Internet chamada EDA Playground. Desta vez, vou levá-lo com os detalhes do código, bem como exatamente como executar a simulação.
Você vai querer se referir à publicação anterior se não o verificou já. Os diagramas, bem como tabelas, fornecem uma visão geral de alto nível que ajudará você a compreender os arquivos discutidos neste post.
Se você quisesse realmente programar isso em um FPGA genuíno, você teria um pouco de trabalho a fazer. A memória, bem como a inicialização do registro é realizada em um método que funciona bem para a simulação, no entanto, não funcionaria em um FPGA genuíno. De qualquer forma, vamos começar!
Arquivo por arquivo
Se você tomar cada dados individualmente, nenhum deles é extremamente difícil de entender. Aqui está um rápido resumo (estou utilizando os nomes de dados que eu utilizarei no meu na simulação da Internet):
Parameter.v – Isso é como um dado de inclusão que define algumas definições fundamentais para todos os outros arquivos.
prog.v – Esta é a memória de direção. Um módulo simples, é preciso um endereço, bem como apresenta dados para esse endereço. A diretiva $ readmemb lê os dados de um dado (teste.prog).
register.v – o arquivo de registro. Isso é quase como a memória de direção, no entanto, tem duas portas verificadas, bem como você pode compor a ele.
Data.V – a memória RAM. Isso é quase como os registros, por mais amplos, bem como com uma única porta check-out. Há algum código de simulação que abre um dado, bem como imprime os comentários da memória, no entanto, eu excluí que, como era apenas para depuração. O conteúdo preliminar vem do arquivo test.data.
ALU.V – você acreditaria que isso seria complicado, no entanto, não é. Apenas leva duas entradas, bem como algo para produzir a saída. Algo simples como adiciona ou subtrai. O sempre @ (*) diz a Verilog para não produzir lógica com clock para isso. Apenas se transforma em alguns portões simples, bem como muxes.
Datapath_unit.v – este é um dos arquivos mais complexos, embora se você desenterrar, você verá que é principalmente a granel. Esses dados produz todos os recursos (como os registros, bem como memórias), bem como os conduzem juntos.
Control_Unit.v – Um módulo mais longo, isso apenas implementa a tabela de direção, definindo as linhas de controle com base na instrução atual.
ALUCONTROL.V – Este dado decodifica as instruções para a ALU. Estava faltando no post original. Estranhamente, há mais uma CPU semelhante no mesmo site que possui um arquivo de Alucontrol, no entanto, é claramente para um conjunto de direção diferente. No entanto, começando a manter esses dados, além de utilizar a tabela de estilo, consegui recriá-lo. Se [FPGA4Students] corrigir isso, os arquivos podem parecer extremamente diferentes.
Design.sv – Esses dados são necessários para o simulador de edaplayground que estou usando. Ele contém os elementos de nível superior (o caminho de dados, bem como a unidade de controle). Como a Edaplayground só processa este arquivo, é necessário incluir os outros arquivos mencionados acima. Isso faz com que alguns avisos, uma vez que cada um deles tem uma diretriz de calendário, no entanto, isso é inofensivo.
testbench.sv – O testbench não faz parte do design genuíno, no entanto, apenas configura a simulação, bem como coleta os resultados. Eu tive que modificá-lo um pouco para trabalhar com a edaplayground, no entanto, a operação é a mesma. Apenas produz uma CPU, alimenta um relógio, bem como permite funcionar por um tempo. O programa de teste, bem como o conteúdo da memória estão no Test.proG, bem como Test.Data.
Simulação
Você pode fazer uma das duas coisas. Você pode abrir minha cópia do estilo pronto para ir, no entanto, isso pode não ser sua melhor opção. Eu sugiro que você vá para a edaplayground e produza um novo projeto de verilog. Em seguida, comece a mover os arquivos a partir do post original. Você vai se deparar em erros, bem como arquivos ausentes. Veja exatamente quantos você pode consertar. Se você ficar perplexo, então você pode utilizar minha cópia para ajudá-lo se você ficar perplexo. Você descobrirá mais dessa maneira.
Se você optar por experimentá-lo, aqui estão algumas dicas sobre Edaplayground. Você não requer o UVM / OVM selecionado, nem precisa de qualquer tipo de outras bibliotecas. Eu utilizei o iCarus Verilog 0.9.7, no entanto, você provavelmente pode utilizar qualquer tipo de ferramentas de verilog disponível. Você quer inspecionar a caixa de seleção Epwave, bem como o requisito para adicionar isso à parte inital do testbench:
inicial
começar
$ Dumpfile (“Dump.vcd”);
$ DIPVARS;
Use a indicação + ao lado das guias Nome de dados para fazer novos arquivos. A Edaplayground tem um limite de dez arquivos por painel. Lembre-se, você terá que incluir qualquer tipo de arquivos .V que você produz em TestBench.sv ou Design.sv. Você não precisa incluir os arquivos de dados, pois os outros arquivos os utilizam indiretamente.
Corre!
Depois de ter todos os erros trabalhados, você pode pressionar Executar, bem como obter o visualizador de onda de onda, Epwave. Você teme adicionar sinais de taxa de juros para que você possa assistir à CPU no trabalho. Seria divertido adicionar alguns dispositivos de E / S na memória ou algumas portas de depuração para que você possa assistir às coisas um pouco melhor. Geralmente, verei o contador do programa, assim como o registro compor por porta para obter um conceito do que está acontecendo lá dentro.
O código original tinha um programa que exercia uma grande quantidade de instruções. Eu comentei isso, assim como substituiu-o com isso:
0000_0100_0000_0000 // 0000: toneladas r0 <- mem (r2 + 0) desde r2 = 0 isso coloca 1 em r0 0000_0100_0100_0000 // 0002: Toneladas O mesmo em R1 (R1 sempre conterá 1) // Place 8 (byte), 4 (palavra): 0010_0000_0101_0000 // 0004: R2 = R0 + R1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (que é MEM [1] = R2 0000_0010_0000_0000 // 0008: R0 = MEM [R1] 1101_0000_0000_0011 // 000A: Ir para colocar # 4 (a CPU multiplicará por 2 e também adicionar 2) // sem direção na 000C, no entanto, o PC irá travar lá enquanto ele processa saltar Você deve ser capaz de cumprir o valor de incremento compondo a memória, bem como assistir ao ciclo do contador do programa para o local 4 com cada loop. Aqui está uma sessão típica: Deixei de fora uma grande quantidade de sinais interiores, no entanto, você pode ver que o endereço de memória 1 é definido como 2, bem como depois para 3 nas duas primeiras iterações do loop. Jogo final Esta é uma ótima CPU acadêmica? Não tenho certeza. Algumas CPUs mais simples existem, no entanto, são freqüentemente pequenas, uma vez que são complicadas ou são extremamente impraticáveis. Qualquer coisa mais desafiadora do que isso é mais provável, além de morder para um iniciante. Enquanto eu acredito que você deve ter algum alcance de verilog fundamental antes de enfrentar algo assim, a documentação foi um pouco escassa (e confusa) em algumas áreas. Obviamente, foi ótimo, já que consegui funcionando, no entanto, se você está apenas começando, você provavelmente apreciaria um pouco mais de assistência, bem como explicações. Você tem uma CPU de verilog acadêmica preferida? Eu ainda estou procurando por que uma pessoa que seja "apenas à direita".