Veriloggen et cocotb sont utilisés pour concevoir et tester Verilog en Python uniquement.

introduction

J'ai essayé de concevoir et de tester Verilog uniquement avec Python sans écrire Verilog. ** C'est le système que j'ai essayé. ** ** Le test était écrit avant cocotb, le design était Veriloggen ) A été utilisé. L'environnement sera CentOS 6.6.

Environnement

Pour utiliser Veriloggen, vous devez installer Pyverilog, Jinja2 selon le [blog] de l'auteur (http://shtaxxx.hatenablog.com/entry/2015/06/22/010559). Je vais. Comme le système de traitement est écrit en Python 3.3, la compatibilité avec cocotb n'est pas bonne, y compris l'environnement du système d'exploitation. Par conséquent, dans mon environnement, je l'ai installé directement sans utiliser virtualenv.

git clone https://github.com/shtaxxx/Pyverilog
git clone https://github.com/shtaxxx/veriloggen
sudo pip install jinja2
cd Pyverilog
sudo python3 setup.py install
cd ../veriloggen
sudo python3 setup.py install
cd ../

cocotb est le même que précédemment.

Comme la dernière fois, j'ai créé un nouveau répertoire de travail dans le répertoire ʻexample`, créé les répertoires rtl et tests là-bas, et enregistré le DUT et les tests, respectivement. La différence est que le répertoire ** rtl est un fichier Python au lieu d'un fichier Verilog. ** **

├── model
│   └── tests.py
├── rtl
│   └── dff.py
└── tests
    ├── Makefile
    └── run.sh

DUT DUT est le précédent circuit séquentiel de 8 bits. La différence par rapport à l'heure précédente est que la réinitialisation est logique positive et synchrone.

dff.py


import sys, os
from veriloggen import *

def mkdff():
    m = Module('dff')
    width = m.Parameter('WIDTH', 8)
    clk   = m.Input('CLK')
    rst   = m.Input('RST')
    d     = m.Input('D', width)
    q     = m.OutputReg('Q', width)

    m.Always(Posedge(clk))(
        If(rst)(
            q(0)
        ).Else(
            q(d)
        ))

    return m


if __name__ == '__main__':
    dff = mkdff()
    verilog = dff.to_verilog()
    print(verilog)

tester

J'ai changé la polarité de réinitialisation de la dernière fois.

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 <= 1
        self.dut.D <= 0
        yield Timer(duration)
        yield RisingEdge(self.dut.CLK)
        self.dut.RST <= 0
        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()

Script d'exécution

Comme il était difficile de les connecter, j'en ai fait un script shell.

run.sh


#!/bin/bash

RTLPATH=../rtl
if [ -e ${RTLPATH}/dff.v ]; then
  rm ${RTLPATH}/dff.v
fi

python3 ${RTLPATH}/dff.py > ${RTLPATH}/dff.v

make

résultat

Veriloggen a généré le code Verilog suivant.

dff.v


module dff #
 (
  parameter WIDTH = 8

 )
 (
  input [0:0] CLK, 
input [0:0] RST, 
input [(WIDTH - 1):0] D, 
output reg [(WIDTH - 1):0] Q

 );
  always @(posedge CLK)
  begin        
  if(RST) begin        
  Q <= 0;
end  
else begin        
  Q <= D;
end 
end 
endmodule

Le résultat du test de cocotb est également correct.

        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 1437305945
     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     ..tb.coroutine.basic_test.0x2353ed0       decorators.py:186  in send                            Starting test: "basic_test"
                                                                                                                               Description: basic_test
     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)

   295.00ns INFO     cocotb.dff                                     tests.py:32   in gen_and_check                   [OK]
   305.00ns INFO     cocotb.dff                                     tests.py:32   in gen_and_check                   [OK]
   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...

en conclusion

Essayons d'impliquer des bus comme Avalon cette fois ...

Recommended Posts

Veriloggen et cocotb sont utilisés pour concevoir et tester Verilog en Python uniquement.
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
Test de stress avec Locust écrit en Python
Gérer les "années et mois" en Python
Énumération des nombres premiers et jugement des nombres premiers en Python
Utilisez le framework Python "cocotb" pour tester Verilog.
[# 1] Créez Minecraft avec Python. ~ Recherche préliminaire et conception ~
Jugement des nombres premiers avec Python
Jugement des nombres premiers avec python
Extraire "date actuelle uniquement" et "date et heure actuelles" avec python datetime.
Calculer la différence entre Pose et Transform avec ROS en Python
Démarrer le calcul numérique avec Python (avec Homebrew et pip)
Chiffrement et déchiffrement avec Python
Grattage au sélénium en Python
Python et matériel - Utilisation de RS232C avec Python -
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Algorithme en Python (jugement premier)
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Tester Python avec Miniconda dans un environnement OS X et Linux avec travis-ci
Grattage avec Tor en Python
Tweet avec image en Python
J'ai essayé de programmer le test du chi carré en Python et Java.
Modèles de conception en Python: introduction
Combiné avec ordinal en Python
Pile et file d'attente en Python
Module de débogage et de test Python
Jouez avec les archives de Mastodon dans les réponses et les favoris de Python 2 Count
python avec pyenv et venv
Unittest et CI en Python
Installez CaboCha dans l'environnement Ubuntu et appelez-le avec Python.
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Fonctionne avec Python et R
Définir le test python dans jenkins
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
[Python3] Enregistrez la matrice de moyenne et de covariance dans json avec les pandas
Jetez quelque chose dans Kinesis avec python et assurez-vous qu'il est dans
"Processus Gauss et apprentissage automatique" Régression de processus Gauss implémentée uniquement avec Python numpy
Émission de jetons d'authentification Firebase en Python et validation de jetons avec Fast API
[Pytest] [mock] Les débutants en développement Web ont résumé le test unitaire et simulé en python.
Reconnaissance des nombres dans les images avec Python
Briller la vie avec Python et OpenCV
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Robot fonctionnant avec Arduino et python
Tester avec des nombres aléatoires en Python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Différence entre list () et [] en Python
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Différence entre == et est en python
Scraping avec Node, Ruby et Python
Afficher les photos en Python et html
GOTO en Python avec Sublime Text 3
Travailler avec LibreOffice en Python: import
Algorithme de tri et implémentation en Python