Utilisez le framework Python "cocotb" pour tester Verilog.

Introduction.

cocotb est un framework de test HDL qui utilise Python. Je regarde depuis un moment, mais depuis la sortie de la version 1.0, j'ai décidé de l'essayer.

Caractéristiques de cocotb.

cocotb est un framework de test léger pour HDL développé par Potential Ventures, écrit en Python. Il est publié sur GitHub sous une licence BSD. https://github.com/potentialventures/cocotb

Le document est ici. http://cocotb.readthedocs.org/en/latest/index.html

Conscient du lancement rapide d'un environnement de vérification dans le développement FPGA, il est beaucoup plus léger que UVM écrit en System Verilog, et écrit en Python. Par conséquent, la description est simple et facile à lire.

Les simulateurs compatibles sont Icarus Verilog, VCS, Riviera-PRO, [Questa (ModelSim)](http://www.mentorg.co.jp/products/fv/ Il prend en charge questa /), Incisive. Surtout Icarus et VCS semblent avoir une bonne affinité.

Il a également une fonction de sortie de fichier pour xUnit, et il est facile de le lier avec l'outil CI Jenkins.

Les générateurs, collouts et technologies de décorateur Python sont utilisés pour accéder à DUT (HDL). C'est un mécanisme pour mettre le simulateur en pause dans le collout, insérer le traitement de cocotb et redémarrer le simulateur. Certaines personnes qui utilisent Python ne le connaissent pas, mais avec cocotb, si vous savez comment l'utiliser, vous n'avez pas besoin d'en être très conscient.

Cette fois, en utilisant des échantillons et des documents comme indices, j'ai essayé de décrire l'environnement de vérification du circuit séquentiel de Verilog en utilisant cocotb. Le système d'exploitation est CentOS 6.6.

Préparation

Téléchargez depuis GitHub.

git clone https://github.com/potentialventures/cocotb

Cette fois, j'ai créé un nouveau répertoire de travail dans le répertoire «exemple», créé les répertoires «rtl» et «tests» là-bas, et enregistré le DUT et les tests, respectivement.

Icarus Verilog est utilisé pour le simulateur. Mettez "icarus" dans la partie sélection du simulateur de "Makefile.sim" dans le répertoire makefiles.

# Default to Icarus if no simulator is defined
SIM ?= icarus

DUT C'est un circuit séquentiel de 8 bits. À l'intérieur, j'essaye de produire un fichier vcd pour l'acquisition de forme d'onde.

dff.v



module dff(
  input            RST_N,
  input            CLK,
  input      [7:0] D,
  output reg [7:0] Q
);

  always @(negedge RST_N, posedge CLK)
    if(~RST_N)
      Q <= 8'h0;
    else
      Q <= D;

  initial begin
    $dumpfile("dump.vcd");
    $dumpvars(1, dff);
  end

endmodule

tester

J'ai mis dans un environnement testbench (une instance avec DUT) et un simple vérificateur de pilote car je n'ai besoin que d'un seul fichier. Il s'agit d'un scénario dans lequel une valeur aléatoire est entrée et la valeur de sortie du DUT est vérifiée après un cycle.

tests.py


import cocotb
from cocotb.triggers import Timer, RisingEdge
from cocotb.result import TestFailure
from cocotb.clock import Clock

import random

class DffTB(object):
    def __init__(self, dut, dubug=True):
        self.dut = dut

    @cocotb.coroutine
    def reset(self, duration=10000):
        self.dut.log.info("Resetting DUT")
        self.dut.RST_N <= 0
        self.dut.D <= 0
        yield Timer(duration)
        yield RisingEdge(self.dut.CLK)
        self.dut.RST_N <= 1
        self.dut.log.info("Out of reset")

    @cocotb.coroutine
    def gen_and_check(self):
        D = random.randint(0, 255)
        self.dut.D = D;
        yield RisingEdge(self.dut.CLK)
        yield Timer(1)
        if int(self.dut.Q) != D :
            raise TestFailure(
                "[NG] Compre error. D==%s Q==%s" %  (D, int(self.dut.Q)))
        else :
            self.dut.log.info("[OK]")


@cocotb.coroutine
def clock_gen(signal):
    while True:
        signal <= 0
        yield Timer(5000)
        signal <= 1
        yield Timer(5000)

@cocotb.test()
def basic_test(dut):
    """basic_test"""
    tb = DffTB(dut)
    cocotb.fork(clock_gen(dut.CLK))
    yield RisingEdge(dut.CLK)
    yield tb.reset()

    for i in range(30):
        yield tb.gen_and_check()

Dans cocotb, «dut» est le mot réservé, qui correspond au niveau supérieur du DUT. Par souci de simplicité, seule une instance de dut est décrite pour le constructeur de classe jusqu'à présent, mais nous ajouterons des traitements tels que l'initialisation d'autres modules et utilitaires de vérification.

Le scénario de test est écrit en décorant cocotb.test () comme écrit à la fin.

Lors de l'exécution de la simulation, la principale partie du traitement consiste à décorer la cocotb.coroutine. Dans la description ci-dessus, c'est autour de "clock_gen" et "gen_and_check".

Script d'exécution de la simulation

J'ai préparé un Makefile dans le répertoire tests. Spécifiez la hiérarchie supérieure du DUT dans (TOPLEVEL) et entrez le nom du script Python dans (MODULE).

Makefile


TOPLEVEL := dff
TOPLEVEL_LANG ?= verilog

PWD=$(shell pwd)
COCOTB=$(PWD)/../../..

ifeq ($(OS),Msys)
WPWD=$(shell sh -c 'pwd -W')
PYTHONPATH := $(WPWD)/../model;$(PYTHONPATH)
else
WPWD=$(shell pwd)
PYTHONPATH := $(WPWD)/../model:$(PYTHONPATH)
endif
export PYTHONPATH

VERILOG_SOURCES = $(WPWD)/../rtl/dff.v
GPI_IMPL := vpi

export TOPLEVEL_LANG

MODULE ?= tests

include $(COCOTB)/makefiles/Makefile.inc
include $(COCOTB)/makefiles/Makefile.sim

Résultat d'exécution / forme d'onde

Comme indiqué ci-dessous, il était possible de passer de la phase d'initialisation à la réinitialisation de l'émission, à la vérification de la valeur de sortie et à la fin de la simulation.

        TESTCASE= TOPLEVEL=dff \
        vvp -M /tmp/cocotb/build/libs/x86_64 -m gpivpi sim_build/sim.vvp   
     -.--ns INFO     cocotb.gpi                                GpiCommon.cpp:47   in gpi_print_registered_impl       VPI registered
     0.00ns INFO     cocotb.gpi                                  gpi_embed.c:229  in embed_sim_init                  Running on Icarus Verilog version 0.9.6 
     0.00ns INFO     cocotb.gpi                                  gpi_embed.c:230  in embed_sim_init                  Python interpreter initialised and cocotb loaded!
     0.00ns INFO     cocotb.gpi                                  __init__.py:103  in _initialise_testbench           Running tests with Cocotb v1.0 from /tmp/cocotb
     0.00ns INFO     cocotb.gpi                                  __init__.py:119  in _initialise_testbench           Seeding Python random module with 1430897996
     0.00ns INFO     cocotb.regression                         regression.py:153  in initialise                      Found test tests.basic_test
     0.00ns INFO     cocotb.regression                         regression.py:254  in execute                         Running test 1/1: basic_test
     0.00ns INFO     ..routine.basic_test.0x7f2a3156ffd0       decorators.py:186  in send                            Starting test: "basic_test"
                                                                                                                               Description: basic_test
VCD info: dumpfile dump.vcd opened for output.
     5.00ns INFO     cocotb.dff                                     tests.py:14   in reset                           Resetting DUT
    15.00ns INFO     cocotb.dff                                     tests.py:20   in reset                           Out of reset
    25.00ns INFO     cocotb.dff                                     tests.py:32   in gen_and_check                   [OK]
    35.00ns INFO     cocotb.dff                                     tests.py:32   in gen_and_check                   [OK]

    (Omission)

   315.00ns INFO     cocotb.dff                                     tests.py:32   in gen_and_check                   [OK]
   315.00ns INFO     cocotb.regression                         regression.py:201  in handle_result                   Test Passed: basic_test
   315.00ns INFO     cocotb.regression                         regression.py:162  in tear_down                       Passed 1 tests (0 skipped)
   315.00ns INFO     cocotb.regression                         regression.py:168  in tear_down                       Shutting down...

La forme d'onde est la suivante. Vous pouvez voir qu'il est initialisé avec RST_N, puis une valeur aléatoire est entrée.

waves.png

en conclusion.

Avec une certaine connaissance de Python, j'ai l'impression qu'il est relativement facile de créer un environnement de vérification. Cependant, bien que je puisse ne pas le comprendre, la documentation n'est pas très complète. De plus, l'Endian Swapper au début du didacticiel avait l'impression que le seuil était trop élevé. Cependant, dans SystemVerilog, il est assez facile de comprendre si la partie de test difficile à déboguer est Python, et je pense que l'utilisation d'une bibliothèque Python comme aléatoire cette fois a un gros avantage en termes de coût et de nombreux utilisateurs. Je vais. 1.0 vient de sortir, et j'attends beaucoup d'elle dans le futur.

Recommended Posts

Utilisez le framework Python "cocotb" pour tester Verilog.
Comment utiliser la bibliothèque C en Python
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Le moyen le plus simple d'utiliser OpenCV avec python
[Algorithm x Python] Comment utiliser la liste
Notes de connaissances nécessaires pour comprendre le framework Python
Comment utiliser Raspeye Relay Module Python
[Python] Comment utiliser la bibliothèque de création de graphes Altair
Spécifiez MinGW comme compilateur utilisé dans Python
[Introduction à Udemy Python3 + Application] 27. Comment utiliser le dictionnaire
[Introduction à Udemy Python3 + Application] 30. Comment utiliser l'ensemble
Comment utiliser le modèle appris dans Lobe en Python
Je veux utiliser le jeu de données R avec python
Comment utiliser le générateur
[Python] Comment utiliser la liste 1
Comment utiliser Python Argparse
Python: comment utiliser pydub
[Python] Comment utiliser checkio
[Python] Comment utiliser input ()
Comment utiliser le décorateur
Comment utiliser Python lambda
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment utiliser les octets Python
Veriloggen et cocotb sont utilisés pour concevoir et tester Verilog en Python uniquement.
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
La première API à créer avec le framework Python Djnago REST
Comment utiliser la méthode __call__ dans la classe Python
[Hyperledger Iroha] Remarques sur l'utilisation du SDK Python
[Python] Je souhaite utiliser l'option -h avec argparse
Je ne savais pas comment utiliser l'instruction [python] for
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image par eux-mêmes
Python: comment utiliser async avec
Comment utiliser la fonction zip
Comment utiliser le module optparse
AtCoder: Python: Papa, l'exemple de test.
Comment utiliser les requêtes (bibliothèque Python)
Comment utiliser SQLite en Python
Dans la commande python, python pointe vers python3.8
Comment obtenir la version Python
[Introduction à Python] Utilisons les pandas
[Python] Comment utiliser la liste 3 Ajouté
Comment utiliser Mysql avec python
Comment utiliser l'API Python d'OpenPose
Utilisez l'API Flickr de Python
Comment utiliser ChemSpider en Python
Python: Comment utiliser pydub (lecture)
Comment utiliser PubChem avec Python
Bloc-notes Jupyter facile à utiliser (Python3.5)
[Introduction à Python] Utilisons les pandas
Comment utiliser la fonction zip de python
Sakura utilisant Python sur Internet
Comment utiliser le module ConfigParser
[Introduction à Python] Utilisons les pandas
[Python] Comment utiliser l'API Typetalk
[Python] Changer l'alphabet en nombre
[Version septembre 2020] Explique la procédure d'utilisation de l'API Gmail avec Python
Comment utiliser les variables d'environnement Serverless Framework et Python et gérer les étapes