Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения

в 9:00, , рубрики: Altera, arduino, avr, c++, fpga, ic design, intel, IoT, mips, MIPSfpga, ruvds_статьи, stm32, SystemVerilog, Verilog, vhdl, vlsi design, xilinx, Блог компании RUVDS.com, микроконтроллеры, микросхемы, ПЛИС, программирование микроконтроллеров, Производство и разработка электроники
В этой статье мы поставим все необходимые инструменты для того, чтобы начать разработку микросхемы. Также мы установим Process Design Kit, про который мы говорили в предыдущей статье.

Напоминаю, что я продолжаю идти к цели — сделать свой собственный Отечественный Процессор (TM). Продолжение процесса разработки можно посмотреть под катом.

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 1

Как разработать микросхему, от идеи до результата. Ссылки на все статьи։

Установка необходимых инструментов.

За основу возьмём Ubuntu 21.04. Если у вас другой дистрибутив рекомендую установить именно Ubuntu 21.04 в виртуалку. С другими дистрибутивами, либо версиями вы сами по себе.

  1. Установите систему и проверьте, чтобы у вас было хотя бы 20GB свободного места в /opt

  2. Я установил build-essential и VirtualBox extension, поскольку я установил систему в виртуальной машине.

  3. ВАЖНО! Сохраняйте очерёдность

  4. Я установил Docker

  5. Я установил Magic VLSI и KLayout

  6. Я установил Netgen

  7. Затем я установил XSCHEM используя шаги снизу.

  8. Я установил NGSPICE: sudo apt install ngspice

  9. И напоследок я установил OpenPDK и caravel_user_project

Также мы рассмотрим работу транзисторов MOSFET и логику CMOS.

▍ Docker

Для установки Docker я использовал данный скрипт.

sudo apt-get update
sudo apt-get install 
    apt-transport-https 
    ca-certificates 
    curl 
    gnupg 
    lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo 
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu 
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo groupadd docker
sudo usermod -aG docker $USER

Затем я перезагрузился и выполнил следующую команду, чтобы проверить Docker.

docker run hello-world # Run a test image

Источник

▍ KLayout

Для компиляции KLayout из папки /opt:

git clone -b v0.27.4 --depth 1 https://github.com/KLayout/klayout.git klayout-v0.27.4
sudo apt-get install gcc g++ make qtcreator build-essential python3 python3-dev libz-dev ruby ruby-dev
cd klayout-v0.27.4
./build.sh -qt5 -j2

Если у вас многоядерный процессор поменяйте -j2 на количество ваших процессорных потоков. К сожалению, у меня очень медленный процессор, поэтому сборка у вас точно займёт значительно меньше. Эта команда скомпилирует KLayout, для меня это процесс занял 2 часа. Но для того, чтобы запустить его вам нужно использовать следующую команду, поскольку линкер не знает местонахождения динамических библиотек:

 LD_LIBRARY_PATH=/opt/klayout-v0.27.4/bin-release /opt/klayout-v0.27.4/bin-release/klayout -e -nn $PDK_ROOT/sky130A/libs.tech/klayout/sky130A.lyt  -l $PDK_ROOT/sky130A/libs.tech/klayout/sky130A.lyp  /home/armleo/Desktop/armleo_io/gds/armleo_io.gds

Учтите, что вы должны были выполнить source sourceme.sh, до того, как вы запустите KLayout, иначе при запуске будет ошибка. Так же стоит указать правильный путь к .gds файлу, поскольку у вас он будет отличаться.

Если Klayout запустился, то закрываем его и идём дальше. Если будут проблемы с библиотеками QT, в вашем дистрибутиве, то разберитесь сами как её установить.

Источники установка QT, сборка KLayout и документация по LD_LIBRARY_PATH.

▍ Magic VLSI

Для компиляции Magic VLSI из папки /opt:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install m4 tcsh csh libx11-dev libcairo2-dev mesa-common-dev libglu1-mesa-dev
git clone -b 8.3.227 https://github.com/RTimothyEdwards/magic magic-8.3.227
cd magic-8.3.227/
./configure 
make && sudo make install

Учтите, что без ключа -b 8.3.227 гит скопирует последний стабильный билд. Тут вы сами по себе, ибо весь код протестирован именно в этой версии.

▍ Netgen

Для Netgen я использовал следующий скрипт:

git clone -b 1.5.210 https://github.com/RTimothyEdwards/netgen
cd netgen
./configure
make
sudo make install

У Netgen есть требования, которые были установлены во время установки Magic VLSI/KLayout. Инструкции я нашёл тут.

▍ NGSPICE

Для установки вполне подойдёт версия из репозитория Ubuntu. Если у вас другой дистрибутив удостоверьтесь, что ngspice имеет версию 34.

sudo apt install ngspice

▍ XSCHEM

Для XSCHEM я использовал следующий скрипт:

sudo apt-get install -y libx11-6 libx11-dev libxrender1 libxrender-dev libxcb1 libx11-xcb-dev libcairo2 libcairo2-dev tcl8.6 tcl8.6-dev tk8.6 tk8.6-dev flex bison libxpm4 libxpm-dev gawk
git clone -b 2.9.9 https://github.com/StefanSchippers/xschem.git
cd xschem
./configure
make
sudo make install

Источник

▍ Установка caravel_user_project.

Давайте скопируем репозиторий с изменениями, которые я опишу внизу. Из папки /opt запускаем следующие команды:

git clone https://github.com/armleo/habr_nand_sky130.git

За основу взял caravel_user_project_analog. Я создал sourceme.sh с переменными. Переменные взял отсюда. Исходный код можно взять на GitHub-е вот тут.

Затем я модифицировал xschemrc, чтобы он ссылался на файл в папке $PDK_ROOT/xschemrc. Это необязательно, тем не менее далее туториал предполагает, что данное изменение уже сделано. Взглянуть на него можно тут.

С репозиторием и его изменениями познакомились. Теперь к установке.

OpenPDKs и Google говорят, что они не будут предоставлять билды PDK, потому что «it's too big after it was built».

Все пути установки абсолютные, поэтому нужно установить его именно в папку /opt. В итоге у вас должна быть папка /opt/pdk_root/sky130A/libs.tech. Проверьте его наличие. Если её нет, значит вы что-то сделали не так. Удостоверьтесь, что в папке Caravel есть файлы. Проблемы с символами резисторов исправлены в последней версии, но возможности собрать PDK с новыми символами у меня не было, поэтому рекомендую собрать PDK с нуля.

Для того, чтобы собрать с нуля։

cd habr_nand_sky130
source sourceme.sh
make install
sudo chown -R $USER /opt/
make pdk-nonnative

Иногда pdk build вылетает с ошибкой. Для того, чтобы обойти этот баг, я использую коммиты, которые не содержат этого бага. Если пожалуется на Permission во время запуска докера, значит вы что-то сделали не так во время установки докера.

Давайте распакуем .gds файлы. Для того, чтобы распаковать .gds файлы:

make uncompress

Чтобы упаковать .gds файлы, для того, чтобы отправить их в Гит репозиторий:

make compress

Нам нужны пока распакованные .gds файлы, так что вторую команду упаковки не нужно выполнять.

Установка OpenLane и тестовый запуск

export PDK_ROOT=/opt/pdk_root

Переходим в папку /opt и выполняем следующий шаг:

git clone -b 2021.08.17_03.26.57 --depth 1 https://github.com/The-OpenROAD-Project/OpenLane.git OpenLane_habr

sudo apt-get install python3-pip
python3 -m pip install pyyaml click
cd OpenLane_habr
make pull-openlane

Учтите, что это древняя версия OpenLane, если хотите установить новую версию, на гитхабе всё очень подробно описано.

Если у вас возникли проблемы в этом шагу, дальше идти не имеет смысла, поскольку у вас есть проблема в вашей установке.

PDK ранних версий, которые мы использовали наверху имеют несовместимости с OpenLane последних версий. А ещё в OpenLane, который я использовал есть баг, из-за чего у вас будут проблемы с таймингами, которые у вас не будут отображаться. Поэтому если вы захотите установить последнюю версию используйте скрипт внизу:

Как установить последнюю версию

Открываем новый терминал, ставим место установки PDK:

export PDK_ROOT=/opt/openlane_pdk_root

Устанавливаем, например эту версию:

git clone -b 2021.11.20_01.52.16 --depth 1 https://github.com/The-OpenROAD-Project/OpenLane.git OpenLane_habr
sudo apt-get install python3-pip
python3 -m pip install pyyaml click
cd OpenLane_habr
make pull-openlane
make pdk

Она скачает и установит последнюю версию + PDK доступную на момент публикации статьи. Если хотите получить САМУЮ последнюю стабильную версию уберите ключ -b 2021.11.20_01.52.16, но тут вы уже на свой страх и риск.

Наконец для того, чтобы запустить тест выполните:

make test

Если же у вас нет проблем мы увидим, что OpenLane сгенерировал нашу цифровую макро ячейку. Её можно найти в папке designs/spm/openlane_test/results/magic/spm.gds. Давайте откроем KLayout-ом наш .gds файл:

source /opt/habr_nand_sky130/sourceme.sh

 LD_LIBRARY_PATH=/opt/klayout-v0.27.4/bin-release /opt/klayout-v0.27.4/bin-release/klayout -e -nn $PDK_ROOT/sky130A/libs.tech/klayout/sky130A.lyt  -l $PDK_ROOT/sky130A/libs.tech/klayout/sky130A.lyp  designs/spm/runs/openlane_test/results/magic/spm.gds

Видим результат:

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 2

В папке designs мы можем видеть, очень большое количество примеров, а документация очень подробно описывает все параметры. Да, OpenLane далёк от Fusion Compiler-а от Synopsys, но это первые, очень даже удачные, шаги Open-Source программного обеспечения, к тому, чтобы составить коммерческим инструментам конкуренцию.

Теперь перейдём, немного к теории, поскольку следующая статья будет уже практическая.

MOSFET транзисторы на пальцах

Как мы уже знаем, в микросхеме используются транзисторы, но как именно работает этот самый транзистор? Для этого возьмём NMOS транзистор. Как видим на картинке, NMOS состоит из трёх полупроводников: DRAIN, SOURCE, BULK и область между DRAIN и SOURCE.

Также мы можем заметить, что в регионе, который находится между DRAIN и SOURCE находится область с противоположным типом полупроводника. В случае NMOS области DRAIN и SOURCE имеют тип N, а область посередине имеет тип P. Очевидно, что если N тип имеет потенциал выше, чем P тип, то у нас образуется «закрытый» диод.

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 3

Если по какой-то причине на область P мы подадим электроны, то этот полупроводник начнёт проводить ток, ибо у нашего диода, почти равные (либо выше) потенциалы с полупроводником типа N. Таким образом управляя количеством электронов в области между DRAIN и SOURCE мы сможем управлять током, который проходит между DRAIN-ом и SOURCE-ом. Но, как именно этого достигнуть?

Для этого мы создаём очень тонкий слой диэлектрика, который состоит из оксида силикона (SiO2). Обычно для этого используется термическая обработка. Над этим тонким слоем диэлектрика, мы создаём металлический слой.

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 4

Если подать на этот металл называемый Gate-ом положительный заряд, то в полупроводнике, который находится прямо под Gate-ом образуется область с отрицательным зарядом, то есть скопление электронов, и как мы уже узнали, в этом случае между DRAIN-ом и SOURCE-ом образуется канал. Точка, когда количество электронов между DRAIN и SOURCE достигает равного значения с количеством «дырок» называется Vth.

Стоит отметить, что на самом деле «открытый» NMOS имеет два состояния, в зависимости от напряжения Drain-Source:

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 5

Также стоит отметить, что DRAIN и SOURCE у NMOS-ов симметричный, но SOURCE-ом обычно называют ножку, которая подключена к земле. У PMOS SOURCE-ом называется ножка, которая находится на линии питания.

Ещё стоит дополнить то, что значение напряжение BULK меняет характеристики транзистора. Подробнее можно узнать, загуглив Body effect.

NMOS находится в открытом положении, когда значение Vgate-to-source ровно, либо больше, чем Vth. PMOS в отличие от NMOS состоит из двух полупроводников P типа и BULK, как и область между двумя P полупроводниками находится полупроводник N типа. Похожим образом работает PMOS, но PMOS находится в открытом состоянии только тогда, когда напряжение Vgate-to-source < Vth. Именно поэтому у транзистора NMOS символ не имеет кружочка над Gate-ом, а у PMOS-а этот кружочек присутствует.

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 6

Важно отметить, что всё это объяснение на пальцах ОЧЕНЬ не соответствует реальности. Если вас интересует физика, то рекомендую почитать книжки по этой тематике. Лично я запоминаю только объяснение на пальцах, ибо так проще.

CMOS логика на пальцах

Мы научились управлять током используя транзистор, теперь давайте попробуем сделать из этого транзистора, что-то полезное. Например инвертор.

Возьмём транзистор NMOS и подключим резистор. Когда NMOS выключен, ток течёт из резистора в подключенный вход дальнейшей логики. Если включить NMOS подав на Gate напряжение — NMOS откроется и ток из резистора практически полностью пройдёт через транзистор к земле.

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 7

НО! Есть одна неприятная проблема. Ток через транзистор будет идти даже тогда, когда выход находится в нулевом состоянии. Ах, если бы у нас был бы транзистор, который бы закрывался, когда ты подаёшь на вход единицу… Он называется PMOS. Очевидно, что когда на входе единица, то PMOS выключен, и на выход подаётся нулевое значение, поскольку NMOS в свою очередь открыт.

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 8

А давайте по той же логике сделаем буфер. Подключаем NMOS к VDD и PMOS к VSS. По нашей логике, когда на входе мы подадим единицу, то на выходе мы получим также единицу, круто получается, правда?

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 9

Симулируем и получается…

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 10

Эмм… Че-то у нас выходы имеют напряжение меньше, чем VDD и выше, чем VSS. Это связано с тем, что NMOS плохо проводят единицу, поскольку SOURCE-ом становится выход, и NMOS будет открыт до тех пор, пока Vgs выше Vth. Если Vsource (выход) достигает значения VDD-Vth, то транзистор закроется, оставив на выходе напряжение VDD-Vth, что очень плохо. Аналогично, для PMOS.

Как мы будем решать эту проблему? Давайте решим, что NMOS всегда подключен к нулю, а PMOS всегда будет подключён к единице. Идея отличная, но как нам сделать буфер используя эту логику?

Помните булеву логику, две инверсии на выходе дают такое же значение, что и на входе. Давайте просто подключим два инвертора подряд:

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 11

Наконец-то!

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 12

Ну научились мы делать инверторы и буферы, давайте сделаем простые логические ячейки вроде NAND и NOR.

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 13

Если подключить два NMOS последовательно, то земля на выход пойдёт, только когда оба входа имеют высокое напряжение. Также давайте подключим два PMOS параллельно. Если хотя бы один из транзисторов имеет на Gate значение ноль, тогда транзистор PMOS открыт, а значит на выходе находится единица.

Ничего не напоминает? Правильно, это NAND:

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 14

Получившееся схема:

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 15

Если вы поставите PMOS последовательно, а NMOS параллельно, очевидно у вас будет NOR.

У вас возникнет логичный вопрос: «Что если и NMOS, и PMOS будут открыты?». Ответ прост: ваша схема должна иметь такую структуру, чтобы NMOS и PMOS никогда не оставались одновременно открытыми на долгое время. Если вы нарушите это правило, ваша схема будет потреблять большой ток и нагреваться, а если оставить транзистор с большим током, то ваша микросхема скоро сломается из-за электромиграции.

В следующей статье рассмотрим схемотехническое представление и Layout.

Об авторе

Меня зовут Арман и я окончил институт Synopsys по профилю VLSI разработки микросхем. В основном я занимаюсь разработкой цифровых компонентов для микросхем и IP для ПЛИС. В прошлом я был программистом, писал бекенд на Node.js и разрабатывал под микроконтроллеры, но решил пересесть на что-то сложнее, попробовать себя, так сказать.

Я открыт к найму, поэтому, если вас интересует найм разработчика цифровых микросхем с тремя годами опыта и очень интересными проектами (Радио модемы, преобразователи интерфейсов, процессоры и очень многое), напишите мне в личку.

Как разработать микросхему, от идеи до результата. Ссылки на все статьи։

Как разработать микросхему, от идеи до результата. Часть 2. Установка программного обеспечения - 16

Автор: Arman Avetisyan

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js