UVMIEEE 1800.2SystemVerilogVerilator

Verify This!

Curso de UVM en español que corre entero con Verilator.

Casi todo el material de UVM que hay dando vueltas asume Questa, VCS o Xcelium —licencias que un estudiante no tiene— y está en inglés. Este está en español, es de siete días de clase, ≈ 31 h, y todos sus ejemplos se ejecutan de verdad con herramientas libres. Sin licencias, sin cuenta, sin formulario. Si venís de RTL o de C y nunca escribiste una clase, empezá igual: el día 2 entero es la programación orientada a objetos que UVM da por sabida.

In English: a UVM course that runs entirely on Verilator — no EDA licences, no account, no signup. The English version is complete — all eight days, rewritten rather than machine-translated. Go to the English course ›

8unidades
444slides
38ejemplos que corren
19ejercicios autocorregibles
$0en licencias

Empezá en 60 segundos

# sin instalar nada: Code ▸ Codespaces ▸ Create codespace
make u4/tests

# o en tu máquina, con Verilator ≥ 5.050:
git clone https://github.com/leandrotozzi/verifythis
cd verifythis && make doctor && make u4/tests

Eso compila y corre una sección del día 3 contra UVM 2020.3.1 sobre Verilator, y termina imprimiendo el Report Summary que ves acá abajo. La integración continua corre los 38 ejemplos y las 19 soluciones todas las noches ↗ — si algo se rompió, lo dice ese enlace antes que yo.

Por qué existe

Un curso de verificación que se puede correr, no sólo leer

Verificar es la mitad del trabajo de un chip y casi nadie lo aprende con las manos, porque el simulador cuesta más que el sueldo. Esto lo resuelve.

Herramientas libres

Verilator, y con cobertura funcional

Desde la versión 5.050 Verilator mide covergroup, que es tema del curso. No hay flujo Questa: el simulador te lo llevás a casa y seguís practicando sin pedirle licencia a nadie.

En español

Escrito, no traducido

Siete días de clase con notas del presentador: la trampa clásica, el porqué del número, el error que comete todo el mundo la primera vez. No es una referencia ni un manual pasado por un traductor.

Verificado

El badge dice si andan hoy

Los 38 ejemplos los corre integración continua en cada cambio, y todas las noches se corren también las diecinueve soluciones de los ejercicios. La promesa no la sostiene una captura de pantalla.

Libre de verdad

MIT, Apache-2.0 y CC BY 4.0

Dictalo en tu universidad, adaptalo, cobralo si querés. Sólo citá la fuente. No hay muro de pago, ni lista de correo, ni «dejanos tu email». Y no hay letra chica: se forkea sin consultar a nadie.

La prueba

Así se ve una sección corriendo

UVM 2020.3.1 sobre Verilator, sobre el DUT del curso. Cero errores y el número real de cobertura funcional — no un placeholder.

make u4/tests
$ make u4/tests
==> code/u4/tests/run.sh
UVM_INFO @ 0: reporter [RNTST] Running test random_test...

--- UVM Report Summary ---

** Report counts by severity
UVM_INFO   :    1
UVM_WARNING:    0
UVM_ERROR  :    0
UVM_FATAL  :    0

Coverage Summary:
  covergroup : 86.8% (66/76)

Temario

Ocho unidades en siete días, de la primera clase a un testbench UVM escrito desde cero

Arranca en por qué existe la verificación como disciplina y termina con un capstone: un esclavo APB, su especificación, y el testbench entero desde una hoja en blanco. Cada día cierra con un repaso de opción múltiple y al menos un ejercicio que se corrige solo, y son entre cuatro y cinco horas y media de clase — ≈ 31 h, más el día 8 opcional.

Día 1 · Unidades 1 y 2 · Por qué se verifica, y el testbench sin UVM

  1. Tendencias de la industria
  2. Qué es UVM
  3. La spec del VTALU (el DUT)
  4. El plan de verificación: las cinco columnas
  5. El testbench convencional
  6. Cobertura funcional: covergroup, bins, cross
  7. Interfaces de SystemVerilog y BFM

≈ 4 h · Se cierra viendo ondas de verdad con GTKWave.

Día 2 · Unidad 3 · La OOP que UVM da por sabida

  1. Clases y extensiones
  2. Polimorfismo, virtual y clases abstractas
  3. Variables y métodos estáticos
  4. Clases paramétricas
  5. El patrón Factory
  6. Un testbench sin un solo módulo

≈ 4 h · El muro real del que viene de RTL. Acá se gasta el tiempo que sobre.

Día 3 · Unidad 4 · Entra UVM

  1. uvm_test y +UVM_TESTNAME
  2. uvm_component y las fases
  3. uvm_env: estructura contra estímulo
  4. Reporting: verbosidad y actions

≈ 4 h 30 · El uvm_config_db, su ámbito jerárquico, y el reporting con el que se debuggea todo lo que viene.

Día 4 · Unidad 5 · Cómo hablan los componentes

  1. Un productor, muchos oyentes: el patrón Observer
  2. Un solo lugar que mira el cable: uvm_analysis_port
  3. Cuando alguien tiene que esperar: threads
  4. Quién espera a quién: put y get

≈ 4 h · Acá el estímulo se parte en dos: quién decide qué mandar y quién sabe cómo.

Día 5 · Unidad 6 · El dato

  1. Copiar un objeto que contiene otro: deep copy
  2. Transactions
  3. Constrained random: dist, inside, with

≈ 4 h 30 · Los datos dejan de ser una struct y pasan a ser objetos que viajan.

Día 6 · Unidad 7 · El testbench reutilizable

  1. uvm_agent, uvm_sequencer, is_active
  2. Callbacks: uvm_callback, `uvm_do_callbacks, inyección de error en el driver
  3. uvm_sequence, body(), start_item / finish_item

≈ 4 h 45 · El handshake get_next_item / item_done: el 90 % de lo que vas a escribir.

Día 7 · Unidad 8 · La otra mitad

  1. Sequences virtuales: dos sequencers, un solo escenario
  2. Assertions (SVA): assert property, |-> contra |=>, cover property
  3. El capstone: un esclavo APB, su spec, y el testbench entero desde cero
  4. Los tres apéndices, el glosario y el cierre

≈ 5 h 15 · A la mañana, cómo se habla con el DUT. A la tarde, un testbench desde una hoja en blanco.

Día 8 · Opcional · Lo que sigue después del capstone

  1. RAL (unidad 9): el mapa de registros sobre el mismo APB del capstone
  2. El modelo de referencia en C, por import "DPI-C"
  3. El segundo capstone: una FIFO con backpressure, donde el scoreboard no puede ser una tabla

≈ 4 h · Va después del cierre: las tres cosas necesitan que el capstone ya esté hecho.

El día 8 es opcional y va después del cierre, y las dos cosas son a propósito: sus tres piezas necesitan que el capstone del día 7 ya esté hecho. RAL, la capa de registros de UVM, reemplaza el scoreboard que acabás de escribir — corre en Verilator, con las dos sequences de uvm-core que generan sus propios tests desde el modelo, y hasta donde sabemos es la única versión de esto que existe sobre un simulador libre. El modelo de referencia en C por DPI reemplaza su predicción. Y el segundo capstone sólo enseña algo para el que ya entregó el primero: el bug que hay que cazar está en una bandera y no en los datos, así que un scoreboard que sólo compara lo que sale pasa en verde.

El día 7 cierra con tres apéndices: de la VTALU a un bus real —qué cambia y qué no cuando la interface es AXI o APB—, la caja de herramientas de debug —las siete perillas del curso, y cuál usar según el síntoma— y las 21 trampas mudas —todo lo que compila, corre y miente—. Cierra un glosario ES ↔ EN, porque todo lo que leas después de este curso va a estar en inglés.

Cómo correrlo

Cinco caminos, del que no instala nada al que compila todo

El deck se abre con doble clic en cualquier máquina y sin internet. Para correr los ejemplos, empezá por el primero: es el único que no te pide nada.

Empezá por acá

GitHub Codespaces

El repositorio trae un devcontainer con Verilator, UVM y ccache ya adentro. Abrís el repo en el navegador y corrés los ejemplos ahí mismo, desde cualquier máquina — incluso una netbook.

# Code ▸ Codespaces ▸ Create codespace
make u4/tests   # y la segunda sección, en segundos

Las cuentas gratuitas traen 60 horas-core por mes, de sobra para el curso. Va primero porque en macOS y en Windows instalar Verilator es media tarde que no enseña nada de UVM.

Sin instalar Verilator

Docker

La misma imagen del devcontainer, en tu máquina y con el repo montado desde afuera: editás con tu editor de siempre y corrés adentro.

docker build -t verifythis .
docker run --rm -it -v "$PWD":/work \
  verifythis make u4/tests

La cache de ccache queda en .ccache/ del repo montado, así que sobrevive al --rm. Ajuste de RAM en docs/docker.md.

Linux · macOS

Nativo

El camino más rápido una vez instalado. Ojo: hace falta Verilator ≥ 5.050 —los covergroups entraron ahí— y el paquete de la distro casi siempre está atrasado.

git clone https://github.com/leandrotozzi/verifythis
cd verifythis
verilator --version   # ≥ 5.050
make u4/tests

Hacen falta dos paquetes más: z3, que es el solver de randomize() y sin el cual el día 5 miente en silencio, y ccache, que hace que la segunda sección con UVM compile en segundos. La receta para compilar Verilator de fuente está en docs/instalar.md.

Windows

WSL 2

Si querés el curso en tu máquina y no en el navegador: una vez instalado Ubuntu, todo lo demás es idéntico a Linux.

wsl --install -d Ubuntu   # PowerShell, como admin
# y adentro de Ubuntu:
sudo apt install git make g++ perl ccache z3
# Verilator 5.052 de fuente, y listo

Cloná dentro del sistema de archivos de WSL (~/), no en /mnt/c: ahí la compilación se vuelve varias veces más lenta.

Ni eso

EDA Playground

Un simulador en el navegador, sin cuenta local ni instalación. Sirve para pegar una clase suelta y experimentar con un concepto: polimorfismo, una constraint, un covergroup.

# edaplayground.com
# pegá el ejemplo de code/u6 y dale Run

No corre el curso entero —los testbenches son de muchos archivos—, pero es la red de seguridad del que no puede instalar nada hoy. Y sus simuladores comerciales soportan los bins de transición que Verilator todavía no.

Preguntas frecuentes

Lo que se pregunta siempre

¿Necesito una licencia de Questa, VCS o Xcelium?

No. El curso corre entero con Verilator, que es software libre, más la implementación de referencia de UVM de Accellera (uvm-core 2020.3.1), que se baja sola. No hay flujo Questa en el repositorio: los run.do se borraron.

¿Sirve si vengo de diseño RTL y nunca escribí una clase?

Sí, y está pensado justo para eso. El día 2 completo es programación orientada a objetos en SystemVerilog —clases, herencia, polimorfismo, clases paramétricas, la factory— porque es el muro real del que llega desde RTL. UVM recién aparece el día 3.

Instalé todo y algo no anda: ¿por dónde empiezo?

Por make doctor. Dice si esta máquina puede correr el curso y qué falta, con el comando exacto para tu gestor de paquetes. Los dos modos de falla más caros son mudos: sin z3, randomize() devuelve 0 sin decir nada; con un Verilator anterior a 5.050, la cobertura funcional reporta 0 % sin una advertencia.

Y si el problema es que el testbench corre pero miente, la lista está en las 21 trampas mudas: todo lo que compila, corre y no da un warning.

¿Cuánto tiempo lleva?

Siete días de clase dictado, unas 30 horas y media — y un día 8 opcional, después del cierre, con RAL, el modelo de referencia en C por DPI y un segundo capstone. Si lo hacés solo, calculá el doble: la mitad del tiempo se va en correr los ejemplos, y esa mitad es la que enseña. Como materia de cuatrimestre, el mapa de 15 semanas está en docs/para-docentes.md.

¿Qué versión de UVM usa?

UVM 2020.3.1, la implementación de referencia de Accellera para IEEE 1800.2-2020. No la 1.2, que es pre-IEEE. Verilator la soporta oficialmente desde la 5.052.

¿Puedo dictarlo en mi universidad o empresa?

Sí, incluso cobrando. Las slides están bajo CC BY 4.0, los ejemplos de code/ bajo Apache-2.0 y las herramientas bajo MIT: la única condición es citar la fuente y conservar el NOTICE. El repositorio trae el deck en PDF y en PPTX con texto editable y notas del orador.

Y para dictarlo como materia hay tres cosas más: docs/para-docentes.md —el curso de siete días pasado a un cuatrimestre de 15 semanas, qué se puede saltear y qué evaluar en cada parcial—, el banco con las 58 preguntas sin la respuesta marcada, y un CITATION.cff para el botón Cite this repository de GitHub.

¿Esto es The UVM Primer traducido?

No. Es el libro con el que aprendí UVM, está en las referencias, y varios de los ejemplos de code/ derivan de los suyos —que su autor publicó bajo Apache-2.0 y acá están acreditados en el NOTICE—. Pero la estructura es otra: 8 unidades agrupadas por el problema que resuelven, no 24 capítulos por feature. El DUT es otro. El simulador es otro. Y hay cuatro unidades de material que el libro no cubre: el plan de verificación como columna vertebral, assertions (SVA), sequences virtuales y callbacks, y un capstone con un DUT distinto que se escribe desde una hoja en blanco. La lista completa está en docs/en-que-se-diferencia.md.

¿Qué queda afuera?

uvm_event y uvm_barrier, las fases de run-time, y el TLM2. Están nombrados en la slide de cierre, con dónde seguir. El curso es introductorio y prefiere decir qué no cubre.

¿Todo funciona igual que en un simulador comercial?

Casi. Verilator 5.052 todavía no compila los bins de transición de los covergroups, ignora binsof/intersect en un cross, y tiene dos limitaciones con dist y solve…before. Las cuatro están documentadas con repro mínimo y con el rodeo portable, porque esconderlas sería peor que no tenerlas.

¿Cómo aviso de un error o pregunto algo?

En las Discussions del repositorio para preguntas, y en los Issues si encontraste algo roto. Las correcciones por pull request son bienvenidas.