so definieren Sie eine mehrzeilige makro in verilog?
Ich bin relativ neu in verilog-a, VHDL-Benutzer), und um meine Fähigkeiten verbessern baute ich meine test-Umgebung unter Verwendung von verilog (meine QC-verwenden Sie Ihre eigenen env).
In meinem env, habe ich also einen master, der Kraft zufällige Reize, die auf den Leitungen (i2c-master).
da ich nicht wirklich wollen, zu einem echten Meister und wollte nur 'gut benahm' Meister, ich habe die folgenden Makros, um mich mit der i2c-Kommunikation:
`define writeChipId(addr)\
sda = 1\
#7500 sda = addr[3];\
#2500 sda = addr[2];\
#2500 sda = addr[1];\
#2500 sda = addr[0];\
#2500;
`define writeData(data)\
sda = data[7]\
#2500 sda = data[6];\
#2500 sda = data[5];\
#2500 sda = data[4];\
#2500 sda = data[3];\
#2500 sda = data[2];\
#2500 sda = data[1];\
#2500 sda = data[0];\
#2500 sda = 1;\
#2500; //time for the slave to answer
`define readData\
#sda = 1\
#20000 sda = 0;\
#2500; //master always answer ACK
mein problem ist, dass, wenn ich versuche, diese Makros bekomme ich einen Compiler Fehler (mit modelsim), dass ich einen syntax-error und ich habe unexpected '[' werden soll ';' für die Verwendung der chipID makro und unerwartetes '#' werden soll ';', wenn über das Lesen\ schreiben von Makros.
des usages ich versuchen (und dabei scheitern) sind
`writeChipId(`chipID)
und
`writeData(rndData)
und
`readData
last, but not least: wenn ich Schreibe, die gleichen Linien, ohne das makro in meinem code, kompiliert er perfekt (habe nur versucht, an einem Ort, nicht wollen, es zu tun für die 12 anderen Orte werde ich diese Makros benötigen...)
jemand eine Ahnung, was ist das problem? ich habe versucht zu spielen mit den Makros nicht mit Glück und auch überprüft werden, haben Sie keine Leerzeichen in der Mitte festsitzen.
sah auch für mehrzeilige makro Beispiele und gefunden, ähnliches was ich getan habe, die nicht eine Antwort geben.
vielen Dank im Voraus an alle repliers
Bearbeiten
etwas, was ich vergessen habe zu sagen: wenn ich das makro und entfernen Sie die Eingabe und verwenden Sie const-Werte anstelle der Eingabe, funktioniert es einwandfrei.
- Warum haben Sie sich für die Verwendung von multi-line-Makros mit Argumenten statt
task
s? - wie gesagt, ich bin neu in verilog. Ich bin nicht völlig vertraut mit
task
s, und das ist mehr oder weniger die Entwicklung meiner TB (Schritte zu tun, die Aktionen manuell verschoben Makros). Ich bin mir nicht sicher, ich werde in der Lage sein, zu emulieren, die master-und die dominierende CPU-Verhalten, ohne die Makros. Ich mag mich irren, aber das ist alles was ich weiß von der Sprache so weit...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die syntax für eine
`define
erfordert ein Leerzeichen nach dem makro-Bezeichner/Argumente.Als Greg wies darauf hin, das wirklich fordert für die Verwendung eines
task
.task
verwendet wird, aber jetzt, wo ich weiß, dass es existiert, es sollte nicht allzu schwer sein 🙂 vielen Dank.task
vorzuziehen, die auf der multi-line definieren, die ich verwendet? welche Vorteile hattask
besitzen?ok, Lösung gefunden:
die erste Zeile jedes makro sollte auch Semikolon (;), auch - der Einsatz der parameter für die chipID wird hart auf die verilog, dies wurde gelöst, indem der Eingang in eine reg und mit dem reg bits.
ich komme aber nicht über dieses problem der früheren Zeit, die ich verwendet Makros, da der andere Fehler, den ich gemacht - ich definiert das makro für die Konstante zu haben Semikolon (Bedeutung
`define ADD 32'h0;
) und wenn ich es benutzt habe es eingefügt ; auf die Linie und schien OK.