Somador em VHDL para teste do fluxo digital com front-end (ghdl + GTKwave) e back-end (openlane).
- Testar o fluxo GHDL + GTKWave (Front-end) usando somador completo (Pode utilizar a referência http://ghdl.free.fr/ghdl/A-full-adder.html)
- Utilizar Yosys + GHDL para converter o código para um .v (Verilog) equivalente, de modo a utilizar no fluxo openlane. (Ver e-mail e referências com write_verilog: ghdl/ghdl#1174)
- Utilizar o openlane (Back-end) para gerar o layout (.gds) por meio do .v (design file). Refs: https://github.com/britovski/vsdOpenLANE e https://github.com/efabless/openlane
- Documentar no repositório.
O sistema consistiu na implementação do clássico projeto de somador digital.
Arquivo | Descrição |
---|---|
full_adder | Descrição do comportamento do clássico circuito somador-completo. |
full_adder_tb | Testbench do somador completo. |
adder | Decrição de um somador clássico de 8 bits, implementado a partir do somador completo. |
adder_tb | Testbench do somador de 8 bits. |
# Análise dos arquivos de descrição
$ ghdl -a ./src/vhdl/full_adder.vhdl
$ ghdl -a ./src/vhdl/adder.vhdl
# Análise dos arquivos de testes
$ ghdl -a ./src/vhdl/full_adder_tb.vhdl
$ ghdl -a ./src/vhdl/adder_tb.vhdl
# Elaboração de unidades de testes
$ ghdl -e full_adder_tb
$ ghdl -e adder_tb
# Executar simulação e exportar formas de ondas
$ ghdl -r full_adder_tb --wave=./waves/full_adder_tb.ghw
$ ghdl -r adder_tb --wave=./waves/adder_tb.ghw
# full_adder
$ gtkwave ./waves/full_adder_tb.ghw
# adder
$ gtkwave ./waves/adder_tb.ghw
# full_adder
$ yosys -m ghdl -p 'ghdl ./src/vhdl/full_adder.vhdl -e full_adder; write_verilog full_adder.v'
# adder
$ yosys -m ghdl -p 'ghdl ./src/vhdl/adder.vhdl -e adder; write_verilog adder.v'
Devido a problemas durante a instalação do ghdl-yosys-plugin, a imagem hdlc/ghdl:yosys e o Docker foram utilizados para a execução do procedimento acima.
# Baixar imagem
$ docker pull hdlc/ghdl:yosys
# Montar container
$ docker run --rm -it -v $(pwd):/home -w /home -u $(id -u $USER):$(id -g $USER) hdlc/ghdl:yosys bash
# Executar comandos dentro do container
$ yosys -m ghdl -p 'ghdl ./full_adder.vhdl -e full_adder; write_verilog full_adder.v'
$ yosys -m ghdl -p 'ghdl ./adder.vhdl -e adder; write_verilog adder.v'
# Acessar local de instalação do Openlane
cd ~/sky130_skel/openlane
# Montar container da imagem openlane:rc6
$ docker run --rm -it -v $(pwd):/openLANE_flow -v $PDK_ROOT:$PDK_ROOT -e PDK_ROOT=$PDK_ROOT -u $(id -u $USER):$(id -g $USER) openlane:rc6
# Iniciar novo design 'adder'
$ ./flow -design adder -init_design_config
# Sair do container
$ exit
Após o procedimento acima, o arquivo ./designs/adder/config.tcl
deve ser editado conforme o presente neste repositório. Ademais, como o design é muito pequeno, problemas podem ocorrer no estágio de placement, conforme explicado nesta seção da documentação Openlane, dessa forma, as seguintes configurações foram necessárias:
# configuração adicionada ao arquivo: ./configuration/floorplan.tcl [relativo ao diretório do openlane]
set ::env(FP_CORE_UTIL) 5
# configuração adicionada ao arquivo: ./configuration/placement.tcl [relativo ao diretório do openlane]
set ::env(PL_TARGET_DENSITY) 0.5
Após essas configurações, é necessário acessar a raiz desse repositório e seguir com o restante do procedimento:
# Copiar arquivos 'Verilog' para a pasta do design
$ cp -r ./src/verilog ~/sky130_skel/openlane/designs/adder/src
# Acessar local de instalação do Openlane
$ cd ~/sky130_skel/openlane
# Iniciar fluxo
$ docker run --rm -v $(pwd):/openLANE_flow -v $PDK_ROOT:$PDK_ROOT -e PDK_ROOT=$PDK_ROOT -u $(id -u $USER):$(id -g $USER) openlane:rc6 ./flow -design adder -tag openlane_run
staydh - 2021