Veriloggen und Cocotb werden nur zum Entwerfen und Testen von Verilog in Python verwendet.

Einführung

Ich habe versucht, Verilog nur mit Python zu entwerfen und zu testen, ohne Verilog zu schreiben. ** Dies ist das System, das ich ausprobiert habe. ** ** ** Der Test wurde zuvor geschrieben cocotb, das Design war Veriloggen ) Wurde benutzt. Die Umgebung wird CentOS 6.6 sein.

Umgebung

Um Veriloggen verwenden zu können, müssen Sie "Pyverilog", "Jinja2" gemäß dem [Blog] des Autors (http://shtaxxx.hatenablog.com/entry/2015/06/22/010559) installieren. Ich werde. Da das Verarbeitungssystem in Python 3.3 geschrieben ist, ist die Kompatibilität mit cocotb, einschließlich der Betriebssystemumgebung, nicht gut. Daher habe ich es in meiner Umgebung direkt installiert, ohne "virtualenv" zu verwenden.

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 ist dasselbe wie zuvor.

Auch dieses Mal habe ich ein neues Arbeitsverzeichnis im Beispielverzeichnis erstellt, dort RTL- und Testverzeichnisse erstellt und den Prüfling bzw. die Tests gespeichert. Der Unterschied besteht darin, dass das Verzeichnis ** rtl eine Python-Datei anstelle einer Verilog-Datei ist. ** ** **

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

DUT DUT ist die vorherige 8-Bit-Sequenzschaltung. Der Unterschied zur vorherigen Zeit besteht darin, dass das Zurücksetzen positiv logisch und synchron ist.

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)

Prüfung

Ich habe die Rücksetzpolarität seit dem letzten Mal geändert.

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()

Ausführungsskript

Da es schwierig war, sie zu verbinden, habe ich daraus ein Shell-Skript gemacht.

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

Ergebnis

Veriloggen hat den folgenden Verilog-Code generiert.

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

Das Testergebnis von cocotb ist auch in Ordnung.

        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]

(Unterlassung)

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

abschließend

Versuchen wir diesmal Busse wie Avalon ...

Recommended Posts

Veriloggen und Cocotb werden nur zum Entwerfen und Testen von Verilog in Python verwendet.
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Stresstest mit Locust in Python geschrieben
Umgang mit "Jahren und Monaten" in Python
Primzahlaufzählung und Primzahlbeurteilung in Python
Verwenden Sie das Python-Framework "cocotb", um Verilog zu testen.
[# 1] Mach Minecraft mit Python. ~ Vorforschung und Design ~
Primzahlbeurteilung mit Python
Primzahlbeurteilung mit Python
Extrahieren Sie "Nur aktuelles Datum" und "Aktuelles Datum und Uhrzeit" mit Python datetime.
Berechnen Sie Pose- und Transformationsunterschiede in Python mit ROS
Starten Sie die numerische Berechnung mit Python (mit Homebrew und Pip).
Ver- und Entschlüsselung mit Python
Schaben mit Selen in Python
Python und Hardware-Verwenden von RS232C mit Python-
Betreiben Sie LibreOffice mit Python
Schaben mit Chromedriver in Python
Algorithmus in Python (Haupturteil)
Debuggen mit pdb in Python
Umgang mit Sounds in Python
Scraping mit Selen in Python
Testen Sie Python mit Miniconda unter OS X und Linux mit travis-ci
Scraping mit Tor in Python
Tweet mit Bild in Python
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Entwurfsmuster in Python: Einführung
Kombiniert mit Ordnungszahl in Python
Stapel und Warteschlange in Python
Python-Debug- und Testmodul
Spielen Sie mit Mastodons Archiv in Python 2 Count Antworten und Favoriten
Python mit Pyenv und Venv
Unittest und CI in Python
Installieren Sie CaboCha in der Ubuntu-Umgebung und rufen Sie es mit Python auf.
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Funktioniert mit Python und R.
Stellen Sie den Python-Test in Jenkins ein
Zeichnen Sie eine Aquarellillusion mit Kantenerkennung in Python3 und openCV3
[Python3] Speichern Sie die Mittelwert- und Kovarianzmatrix in json mit Pandas
Wirf etwas mit Python in Kinesis und stelle sicher, dass es drin ist
"Gauß-Prozess und maschinelles Lernen" Gauß-Prozessregression nur mit Python-Numpy implementiert
Ausgabe von Firebase-Authentifizierungstoken in Python und Token-Validierung mit Fast API
[Pytest] [mock] Anfänger in der Webentwicklung fassten den Unit-Test und den Mock in Python zusammen.
Zahlenerkennung in Bildern mit Python
Leuchtendes Leben mit Python und OpenCV
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Roboter läuft mit Arduino und Python
Testen mit Zufallszahlen in Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Unterschied zwischen list () und [] in Python
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Unterschied zwischen == und ist in Python
Scraping mit Node, Ruby und Python
Zeigen Sie Fotos in Python und HTML an
GOTO in Python mit erhabenem Text 3
Arbeiten mit LibreOffice in Python: Importieren
Sortieralgorithmus und Implementierung in Python