Hallo.
Ik ben net begonnen met Verilog en een FPGA bordje.
Nu probeer ik een function in een apart bestand te zetten.
Net als in C je een library hebt met je functie erin.
Nu ben ik totaal nieuw in Verilog, mijn excuses voor de noob-fouten 
De code is erg simpel, het is meer een proof-of-concept:
Main code:
module includetest
(
button,
led
);
input button;
output led;
wire button;
reg led;
`include "toggle_function.v"
always @ (1) begin
led = toggle(button);
end
endmodule
Code in apart bestand die ik wil aanroepen:
module toggle_function();
function toggle;
input value;
begin
if (value == 1'b0) begin
toggle = 1'b1;
end
else if (value == 1'b1) begin
toggle = 1'b0;
end
end
endfunction
endmodule
Maar nu krijg ik met compilen de volgende error:
"Error (10839): Verilog HDL error at toggle_function.v(1): declaring nested module declarations is a SystemVerilog feature
"
Wat doe ik fout, het lijkt mij toch wel dat je een functie in een apart bestand moet kunnen zetten.
Anders krijg je een erg lange lap code na een tijd.
Ik werk met Quartus trouwens.
Rik
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
Ik ken nu niet veel van C en zeker niet van geneste functies in andere deel bestanden, maar is de code zo ook als je gewoon een functie opbouw in hetzelfde bestand?
Als ik de function in de main zet dan werkt het hele geintje wel.
Met deze code dus:
module includetest
(
button,
led
);
input button;
output led;
wire button;
reg led;
always @ (1) begin
led = toggle(button);
end
function toggle;
input value;
begin
if (value == 1'b0) begin
toggle = 1'b1;
end
else if (value == 1'b1) begin
toggle = 1'b0;
end
end
endfunction
endmodule
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
awel ? de compiler vertlet je exact wat er fout is.
includes werken alleen in systemverilog.
duis : zet je proect in systemverilog mode en klaar.
project- settings - compiler en vink systemverilog / verilog 2005 aan.
klaar.
en nu we toch deftig bezig zijn :
module includetest (
input button,
output reg led
);
always @(1) begin
led <= toggle(button);
end
function toggle;
input value;
begin
value <= !toggle
end
endfunction
maar eigenlijk is dit ook niet juist. het zou eigenlijk moeten zijn:
if (value) toggle <= !toggle
als de ingang hoog is dan moet de flipflop omkippen.
het hangt er allemaal vanaf wat je wilt doen. nu ben je bezig 'software' te forceren op hardware. je denkpiste is verkeerd.
ik zie trouwens ook nergens een clock in jouw systeem....
eigenlijk wil je in jouw geval 'button' als clock gebruiken
always_ff @posedge(button) toggle <= !toggle;
met andere woorden : telkens er een rising edge komt op je druktoets dan kipt de 'toggle' uitgang om. je hebt nu een aan-uit knop gemaakt.
dit zal geimplementeerd worden als een D-FF met opde clock 'button' en de Q uitgang geinverteerd teruggevoerd naar de D ingang.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
"Includes werken alleen in SystemVerilog". Oh.... Nooit geweten. Dan heb ik al die tijd SysVerilog gebruikt! Kan niet waar zijn.
In de include file heb je om je functie heen een module declaratie staan. Dus, je maakt een module binnen een module. Dat lijkt me niet de bedoeling.
Overigens vindt ik het erg lelijk om de include zo halverwege een module te zetten. Het moet ook mogelijk zijn om die include gewoon bovenin je file te zetten. Ik weet de syntax zo niet uit m'n hoofd, maar even googlen moet dat zo opleveren.
Ja, als ik het project in Systemverilog zet en de module weghaal in mijn functie gaat het goed.
Maar ik heb inderdaad een denkfout gemaakt, wat voornamelijk mijn bedoeling is dat ik een aantal modules maak en die met een bestand samenlink.
Een hoop gegoogle later leert dat dit kan in je toplevel module.
En een beetje gepruts later werkt het (ach, prutsen leer je van zullen we maar zeggen)
Om het af te maken de code:
Toplevel:
module includetest
(
button1,
button2,
led1,
led2
);
input button1;
input button2;
output reg led1;
output reg led2;
togglefunc toggle1(.value(button1), .outputled(led1));
togglefunc toggle2(.value(button2), .outputled(led2));
endmodule
Tweede module:
module togglefunc
(
value,
outputled
);
input value;
output reg outputled;
always @ (1) begin
outputled <= !value;
end
endmodule
Dit werkt goed, de code is nog steeds een proof-of-concept en niet iets nuttigs.
De !value is er omdat de knopjes een pull-up weerstand hebben en ik wil dat wanneer een knopje ingedrukt wordt een LED aan gaat.
Een vraagje nog voor nu, ik werk nu met Quartus maar is er wellicht een fijnere IDE voor windows?
Ik snap dat compilen nog in Quartus moet maar de IDE ervan is nu niet bepaald geweldig vind ik.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Ok, maar wat je hier maakt is GEEN functie (zoals je dat in software kent). Je instantieert een blok logica. Zo'n blok kan bv een uart zijn die je 1 or meerdere malen "neerlegt". Denk hardware, je roept dus niks aan, maar je legt hardware neer en knoopt de in/uitgangen aan signalen op het nivo erboven.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 14 februari 2012 23:29:42 schreef Riktw:
Een vraagje nog voor nu, ik werk nu met Quartus maar is er wellicht een fijnere IDE voor windows?
Ik snap dat compilen nog in Quartus moet maar de IDE ervan is nu niet bepaald geweldig vind ik.
Altium designer dan maar ?
De beste ide is die van Aldec. Dat ding heeft autocomplete en allerhande andere dingen.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Een IDE heb je toch helemaal niet nodig! Een editor en simulator is genoeg. Gewoon code kloppen in de editor. Dan de files op compileren op de prompt van Modelsim. Vsim aanroepen en klaar ben je.
Daarna jas je het nog even door de Xilinx/Altera tools heen, dus dat is even een IDE. Even.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Een goeie code editor is wel heel handig. Bookmarks , autocomplete , correctie voor de case etc ... Semicolons toevoegen , kwestie van stomme tikvauten te verbeteren.
Als quick en dirty simulator kan je veritak gebruiken. Werkt goed. Of je gaat direct voor modelsim.
Als je een groter project hebt wil je een mdi based systeem met een treeview en cross referencing.
Vooraleer je dat in fpga blaast ga je timing closure moeten doen. En soms zelf floorplanning. Mijn drive emulator gebruikt floorplaning. De fpga zit zo vol en timing is zo krap dat de autoplacer er niet uit geraakt. Ik gebruik incremental compilation. Bepaalde blokken zijn voorgecompileerd en gemapt in specifieke gebieden. Dat is allemaal manueeel werk. Een keer gedaan hoef je er nooit meer aan te komen. En dan heb je wel een deftige ide nodig. Als ik een blok source aanklik wil ik direct kunnen zien waar die fysiek zit.
Je wilt ook eens kijken naar wat de synth produceert. Zeker als je synthesetalen aan het leren bent !
Ik vind de quartus simulator makkelijker dan modelsim. Effe wat waveforms. Tekenen en vooruit.
Een waveform modelleren is soms ook niet makkelijk. Je zult het meerdere keren moeten runnen en tweaken vooraleer het goed is.
Mijn excuses, ik bedoelde een goede editor ipv IDE.
Maar tips voor een goede editor zijn zeker welkom 
Modelsim had ik al even mee lopen stoeien, zeker handig.
Vakantie aankomende week, kan ik lekker verder veriloggen 
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Crimson is een redelijke editor maar die is niet echt content aware wanneer het op verilog aan komt.
Heel snelle simulator om bijvoorbeeld een hele hoop regressietests binnen afzienbare tijd uit te voeren: http://www.veripool.org/wiki/verilator
(niet echt als modelsim vervanging te gebruiken, meer voor batch processing van pass/fail testen)
[Bericht gewijzigd door Uranium op (11%)]
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Op 17 februari 2012 19:15:16 schreef free_electron:
Crimson ...is niet echt content aware
Wat bedoel je hier met "content aware"? Crimson heeft syntax coloring, ook voor Verilog. Maar niet van die [+] knoppen waarmee je bv een module in kunt klappen. Wie dat gebruikt is me een raadsel overigens. Ik zie het nut niet, maar wie ben ik...