Avant et après moi, générer du HDL à partir de Python, synthétiser des portes directement à partir de Python, etc. ((((; ゚ Д Д)))) est un taureau saccadé, mais c'est un article très simple.
SystemVerilog n'est pas seulement pour écrire du matériel, n'est-ce pas? Je veux dire, j'ai pu utiliser le HDL depuis que je suis devenu membre de la société, mais je n'ai jamais synthétisé de matériel. Je programme uniquement avec SystemVerilog, mais l'inconvénient est qu'il est inefficace car il y a peu de bibliothèques (bien qu'il y ait beaucoup de bibliothèques pour la vérification). Si c'était une langue normale, ce serait un plan dans la bibliothèque. .. .. Même ainsi, c'est assez stressant de devoir l'écrire soi-même.
Dans un tel cas, connectons-nous à Python, que tout le monde aime, et écrivons le moins possible.
Utilisez le système Verilog DPI. Dans certains livres (Démarrage de la conception de System Verilog?), DPI est prévu pour être connecté non seulement à C mais aussi à différentes langues, mais pour le moment, il n'y a que DPI-C, donc via DPI-C, avec System Verilog Vous allez connecter Python.
SystemVerilog - (DPI) - C - Python
C'est un flux.
Cette fois, je voudrais passer le coefficient de l'équation quadratique de SystemVerilog à Python et renvoyer la solution à SystemVerilog.
Python Demandez à SymPy de résoudre l'équation quadratique.
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 C'est C pour la première fois depuis quelques années, donc je ne pense pas que ça fait du bien. Je pense qu'il peut être rendu plus polyvalent. .. ..
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); //Générer un argument touple à passer à Python
for (i=0; i<order+1; i++) {
pValue = PyFloat_FromDouble(ary[i]);
PyTuple_SetItem(pArgs, i, pValue);
}
pValue = PyObject_CallObject(pFunc, pArgs); //Exécuter la fonction Python
for (i=0; i<order; i++) { //Collectez les résultats Python.
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 Si vous avez un simulateur coûteux, vous pouvez transmettre le code SV et le code C au simulateur qui se compilera et s'exécutera à la fois. Si ce n'est pas cher, devrais-je créer * .o et le passer avec -sv_lib?
Un meilleur exemple peut être trouvé à https://github.com/rfukatani/pylink. Il semble que la modulation ΔΣ soit écrite dans la partie Python. En regardant cela, je sens que je peux aller à un certain endroit sans Matlab.
Quoi qu'il en soit, cela vous permet de lancer un travail fastidieux dans Python, ce qui augmente considérablement votre productivité. La quantité de code SV pouvant être réduite est la première étape vers le bonheur pour moi.
Recommended Posts