Atualmente, estou envolvido em um projeto universitário para implementar um processador de um conjunto de instruções existente. A idéia é que até o final do projeto eu possa sintetizar esse design e executá-lo em um FPGA. Tudo está indo bem até agora, comecei a implementar o design no Verilog HDL há alguns dias e consegui uma versão muito simples funcionando. Agora, o problema: entrei em contato com algumas pessoas envolvidas no design de hardware há anos e elas sugeriram que, antes de prosseguir, eu deveria passar a usar o SystemC para a implementação. Agora, fiquei muito confuso, porque este era o meu pensamento:
Verilog -> Como uma linguagem HDL, visa especificamente o design de hardware. Possui alguns níveis de abstração, como Verilog estrutural e comportamental, mas é uma forma muito elegante de especificar a RTL de um design. Você pode definitivamente sintetizá-lo usando um monte de ferramentas, dependendo do FPGA que você escolher (no meu caso, estou usando as placas Xilinx Vivado 2014 e Zynq). No lado negativo, o Verilog simples não oferece abstração suficiente para verificação e é por isso que você tem coisas como o System Verilog.
SystemC -> Esta é uma biblioteca de classes C ++ que introduz efetivamente o conceito de tempo no C ++ e permite que você faça uma simulação orientada a eventos. Claramente, é muito mais alto nível do que qualquer HDL e as coisas aqui podem ser implementadas muito mais rapidamente. Isso o torna uma ferramenta muito boa para coisas como verificação e até implementação de simuladores, para que as pessoas possam começar a projetar drivers e itens para um chip antes que o produto seja realmente fabricado. Aparentemente, também existe um subconjunto do SystemC que pode ser sintetizado (acho que até o Xilinx Vivado pode fazer isso) e, em alguns casos, permite que o SystemC seja usado para projetar sistemas muito grandes, onde um nível mais alto de abstração é útil.
Então, minhas perguntas são:
- Essas noções de que systemC e Verilog (ou idiomas HDL, se você preferir) estão corretas?
- Quando devo usar o SystemC e quando Verilog?
- Disseram-me que mesmo em Verilog, o uso de muito código comportamental pode ser um pouco problemático em seções críticas da implementação, porque você está basicamente dando muito menos restrições à ferramenta de síntese sobre como sintetizá-la. Com um nível mais alto de abstração, isso não seria um problema? ou seja, se eu usar o systemC, posso acabar com um design muito lento, com muita energia e grande consumo ...
- A pessoa que sugeriu o SystemC mencionou que parece que estou fazendo "exploração arquitetônica" e é por isso que ele prefere o Verilog. O que exatamente isso significa? Fiquei com a impressão de que a arquitetura normalmente se refere ao conjunto de instruções e à microarquitetura a uma implementação de um conjunto de instruções (portanto, a microarquitetura é o rtl real que executa as instruções). Então, a exploração arquitetônica significa que ele pensa que estou implementando um processador para ver quão viável é um conjunto de instruções?
- Ele disse que um argumento para usar o SystemC é muito mais fácil porque é um nível de abstração mais alto do que um HDL. Ele também afirmou que era mais fácil acertar o momento do design. Até que ponto isso é verdade?
A ajuda seria muito apreciada, estou um pouco confuso e com dificuldades em obter informações claras sobre isso online. Obrigado!
Respostas:
Seu amigo não entendeu o que você está fazendo ou estava pensando no SystemC como uma etapa preliminar. Um HDL é a única opção. De qualquer forma, eu sugiro que você use SystemVerilog sintetizável que seja poderoso o suficiente para fazer muita exploração, sendo essencialmente o mesmo que Verilog para todo o resto.
Parcialmente. Você distinguiu entre Verilog como um HDL, SystemVerilog como uma linguagem de verificação e disse que o SystemC tem uma abstração mais alta, mas também um subconjunto sintetizável. Existem dois erros aqui. Primeiro, o SystemVerilog também é um HDL com um subconjunto totalmente sintetizável que pode ser retomado como um Verilog com correções óbvias (por exemplo, um
logic
tipo único para fios) e muitos mecanismos de abstração sintetizáveis (por exemplo, Interfaces). É suportado por muitas ferramentas, incluindo o Vivado. SystemC, por outro lado, não ésintetizável diretamente (nem mesmo um subconjunto), ele se destina à modelagem e à exploração arquitetônica de alto nível, embora alguns subconjuntos possam ser alimentados por uma ferramenta de síntese de alto nível, como o Vivado HLS, que o converte em verilog sintetizável (embora ilegível para humanos) .O Verilog e o subconjunto sintetizável do SystemVerilog são linguagens para o design de HW, geralmente usados para descrever o HW no nível de transferência de registros, ou seja, como um conjunto de blocos como registros, funções combinacionais, máquinas de estado finito etc. O Verilog-2001 também pode descrever adequadamente hw como uma netlist no nível de porta, enquanto o SV também pode ser usado para um nível de abstração muito mais alto, portanto, seus recursos de verificação. Por outro lado, o SystemC é apropriado para modelagem de alto nível de sistemas nos quais blocos inteiros são descritos apenas de maneira comportamental de alto nível. Também é muito poderoso para a exploração arquitetônica, ou seja, parâmetros e características variáveis de uma arquitetura e avalia mudanças no desempenho geral.
Isso é verdade apenas se você tentar descrever as coisas de maneira não RTL ao desenvolver um modelo RTL. Por exemplo, a maneira correta de descrever um bloco executando uma acumulação múltipla repetitiva é uma máquina de estado finito dirigindo um multiplicador combinacional, um somador combinacional e um registro - se por comportamento você quis descrever isso como no software (um loop for), então Sim, o código comportamental não funcionará. Se você quisesse descrever cada um dos blocos que descrevi (mult, add, reg e FSM) via
always
blocos, isso é perfeitamente correto e funcionará em uma netlist, realizando exatamente o que você especificou com excelentes resultados (geralmente melhor do que uma abordagem extremamente estrutural que limita a capacidade da ferramenta de síntese de otimizar a lógica). De fato, a síntese de alto nível do SystemC geralmente resultará em bons resultados apenas se você seguir padrões muito semelhantes, obliterando efetivamente qualquer vantagem no uso de uma linguagem de nível superior. De qualquer forma, o SystemC é uma má escolha para implementar um processador.Arquitetura é um termo muito amplo que não se limita ao ISA; de fato, nos processadores modernos, o design do ISA é apenas uma pequena parte do quebra-cabeça. No contexto do design de um sistema, arquitetura geralmente significa o conjunto de opções no nível do sistema (por exemplo, o DMA pode ser controlado por qualquer núcleo ou apenas um especial? O cache L1 é totalmente ou é associativo? Você tem um cache ou gerenciar a memória no SW?), incluindo o ISA e também a microarquitetura do processador. Eu acho que o que seu amigo quis dizer é que você está explorando várias configurações do seu processador, que é, de fato, exploração arquitetônica (ou micro-arquitetura, se você preferir). No entanto, ele pode ter perdido o fato de que você implementará isso em um FPGA, o que torna a opção SystemC sem sentido.
Isto está errado. Se você estiver projetando um acelerador muito simples, como um filtro de fluxo contínuo, isso pode ser verdade porque as ferramentas HLS permitem inserir facilmente estágios do pipeline, enquanto você precisaria fazer isso manualmente em RTL (ou usar o retalho do caminho de dados, mas acho que não é possível em Vivado). Em todos os outros casos, e especialmente em um objeto altamente complexo e estruturado, como um processador, o HLS resultará em um Verilog inchado, indecifrável e muitas vezes completamente errado, que precisa ser sintetizado - as ferramentas simplesmente não foram projetadas para este trabalho.
fonte
Você está na universidade e estuda (presumivelmente) para ser um engenheiro. Como engenheiro, você deve entender como as coisas funcionam em um nível baixo. Para conseguir isso, você precisa remover as camadas de abstração, não adicioná-las.
Por esse motivo, meu conselho é que você não use o SystemC para este projeto. Você pode usá-lo em sua carreira profissional, mas é para o futuro.
Se você optar por usá-lo de qualquer maneira, fale primeiro com seu professor. Quando fiz uma tarefa semelhante na universidade, fomos explicitamente instruídos a não usar o SystemC pelo motivo que descrevi acima.
fonte
Vamos ser honestos, é tudo programação. O que você pode fazer no SystemC, também pode programar em VHDL ou Verilog. É apenas uma questão de suporte de ferramenta. Não é necessário o SystemC ou SystemVerilog.
Se os fornecedores são a solução óbvia para converter designers de RTL em programação do sistema, eles simplesmente precisam fornecer suporte à linguagem apropriada para o design de FPGA. Segundo a pesquisa da Mentor 2012 Wilson, o idioma para os FPGAs é o VHDL. Consulte http://blogs.mentor.com/verificationhorizons/blog/2013/08/05/part-8-the-2012-wilson-research-group-functional-verification-study/
fonte
O SystemC é usado para projetos complexos. Por exemplo, especificando algo no nível arquitetural. Vantagem: menos linhas de código do que os designs da Verilog, tempo de simulação mais rápido, modelos precisos de ciclo. Não acredite que alguém esteja dizendo que o SystemC "não" é sintetizável. Claro que é. Para se ter uma idéia, no Verilog temos nível de abstração, você pode modelar com o nível de comutação / nível comportamental. A escolha é feita com base na complexidade do design.
A maneira mais familiar de descrever o hardware é usar o Verilog, cuja síntese é suportada em muitas ferramentas de EDA.
Normalmente, para projetos maiores, os modelos SystemC e testbench são projetados pelo designer de arquitetura. Esses modelos foram dados ao designer de eletrônicos para convertê-los em RTL usando o Verilog / VHDL.
fonte