Vor und nach mir ist das Generieren von HDL aus Python, das Synthetisieren von Gates direkt aus Python und ((((; ゚ Д ゚)))) ruckelig, aber dies ist ein sehr einfacher Artikel.
SystemVerilog ist nicht nur zum Schreiben von Hardware gedacht, oder? Ich meine, ich konnte HDL verwenden, seit ich Mitglied der Gesellschaft geworden bin, aber ich habe nie Hardware synthetisiert. Ich programmiere nur mit SystemVerilog, aber der Nachteil ist, dass es ineffizient ist, weil es nur wenige Bibliotheken gibt (obwohl es viele Bibliotheken zur Überprüfung gibt). Wenn es eine normale Sprache wäre, wäre es eine Aufnahme in der Bibliothek. .. .. Trotzdem ist es ziemlich stressig, es selbst schreiben zu müssen.
In einem solchen Fall stellen wir eine Verbindung zu Python her, das jeder liebt, und schreiben so wenig wie möglich.
Verwenden Sie das System Verilog DPI. In einigen Büchern (System Verilog Design Startup?) Ist geplant, DPI nicht nur mit C, sondern auch mit verschiedenen Sprachen zu verbinden. Derzeit gibt es jedoch nur DPI-C, also über DPI-C, mit System Verilog Sie werden Python verbinden.
SystemVerilog - (DPI) - C - Python
Es ist ein Fluss.
Dieses Mal möchte ich den Koeffizienten der quadratischen Gleichung von SystemVerilog an Python übergeben und die Lösung an SystemVerilog zurückgeben.
Python Lassen Sie SymPy die quadratische Gleichung lösen.
two_order_eq_py.py
import sympy
def calc_two_order_eq(a, b, c):
x = sympy.symbols('x')
f = a*x**2 + b*x + c
solve = sympy.solve(f, x)
return solve
C Es ist zum ersten Mal seit ein paar Jahren C, also denke ich nicht, dass es sich sehr gut anfühlt. Ich denke, es kann vielseitiger gemacht werden. .. ..
two_order_eq.c
#include <stdio.h>
#include <stdlib.h>
#include <Python.h>
#include <svdpi.h>
void two_order_eq(double* ary, double* answer) {
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue;
int i, order=2;
Py_Initialize();
pName = PyString_FromString("two_order_eq_py");
pModule = PyImport_Import(pName);
pFunc = PyObject_GetAttrString(pModule, "calc_two_order_eq");
pArgs = PyTuple_New(order+1); //Generieren Sie ein Argumenttupel, das an Python übergeben werden soll
for (i=0; i<order+1; i++) {
pValue = PyFloat_FromDouble(ary[i]);
PyTuple_SetItem(pArgs, i, pValue);
}
pValue = PyObject_CallObject(pFunc, pArgs); //Führen Sie die Python-Funktion aus
for (i=0; i<order; i++) { //Sammeln Sie Python-Ergebnisse.
answer[i] = PyFloat_AsDouble(PyList_GetItem(pValue, i));
}
Py_Finalize();
}
two_order_eq.sv
module top();
real ary[3];
real answer[2];
import "DPI-C" function void two_order_eq(input real ary[3], output real answer[2]);
initial begin
ary = {1, -1, -6};
two_order_eq(ary, answer);
$display("Answer is %f, %f", answer[0], answer[1]);
$finish;
end
endmodule
Make Wenn Sie einen hochpreisigen Simulator haben, können Sie den SV-Code und den C-Code an den Simulator übergeben, der sofort kompiliert und ausgeführt wird. Wenn es nicht teuer ist, sollte ich * .o machen und es mit -sv_lib übergeben?
Ein besseres Beispiel finden Sie unter https://github.com/rfukatani/pylink. Es scheint, dass die ΔΣ-Modulation im Python-Teil geschrieben ist. Wenn ich das betrachte, habe ich das Gefühl, dass ich ohne Matlab an einen bestimmten Ort gehen kann.
Auf diese Weise können Sie mühsame Arbeiten in Python ausführen, was Ihre Produktivität erheblich steigert. Wie viel SV-Code reduziert werden kann, ist für mich der erste Schritt zum Glück.
Recommended Posts