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.
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.
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
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".
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
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.
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